精华内容
下载资源
问答
  • 前后没有下划线的公有方法 前边有一个下划线的为私有方法或属性,子类无法继承 前边有两个下划线的 一般为了避免于子类属性或者方法名冲突,无法在外部直接...后边单个下划线的可以避免与系统关键词冲突 ...
    • 前后没有下划线的是公有方法

    • 前边有一个下划线的为私有方法或属性,子类无法继承

    • 前边有两个下划线的 一般是为了避免于子类属性或者方法名冲突,无法在外部直接访问

    • 前后都有双下划线的为系统方法或属性

    • 后边单个下划线的可以避免与系统关键词冲突

    展开全文
  • 5w1h判断关键词

    2019-02-15 19:55:47
    TYPE_WHAT 是什么 是啥 指什么 什么意思 啥意思 什么是 什么叫 什么叫做 什么叫作 什么情况 是干什么的 是做什么的 是干啥的 可以做什么 定义 介绍 简介 有什么 需要什么 
TYPE_WHY 为什么 为了什么 怎么回事...

    TYPE_HOW 怎么办 怎办 怎么弄 怎么整 怎么处理 如何 肿么办 如何是好 咋办 步骤是什么 什么步骤 什么方式 什么办法 办法是什么 怎么 需要做什么


    TYPE_WHAT 是什么 是啥 指什么 什么意思 啥意思 什么是 什么叫 什么叫做 什么叫作 什么情况 是干什么的 是做什么的 是干啥的 可以做什么 定义 介绍 简介 有什么 需要什么

    
TYPE_WHY 为什么 为了什么 怎么回事 因为什么 因为啥 为啥 什么原因 原因是什么 什么理由 是什么原因 原因 无故


    TYPE_WHETHER 可以+++++++吗 能+++++++吗 会+++吗 能+吗 能+么 怎么确定 是否 能否 可不可以 可以吗 行吗 可以+吗 可以++吗 可不可以 行否 会不会 有木有 有没有 怎么知道 是不是 了吗 凭什么确定 靠什么确定 凭什么判断 靠什么判断 如何判断 要不要 如何++++是否 还能+++吗 是++还是 是++++吗 需要++吗 可以用不 送了没有 送了没 允许++++吗 可以 能不能 还可以 +++吗 算+++吗


    TYPE_WHEN 什么样的时间段 多长时间 多久时间 多久 何时 需要+时间 什么时间 多少时间 几号 几点 多少天 几天 啥时间 啥时候 几小时 什么时间段 什么时候 [POSTAG-M]天



    TYPE_HOWMANY 几次 多少次 几个 多少个 多少 多少件 几种 几份 几位 几款 几件 计数 次数 成为 [POSTAG-M]款 [POSTAG-M]个 多款


    TYPE_WHERE 哪里 在哪里 在哪儿 哪儿 何处 在何处 何方 在何方 何地 在何地 哪 哪了 去哪里 去哪了 哪个地方 什么地方 在什么位置 去哪儿

    展开全文
  • any,in,some,all分别子查询关键词之一,any 可以与=、>、>=、结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。all可以与=、>、>=、结合来使用,分别...

    子查询就是指在一个select语句中嵌套另一个select语句。

    any,in,some,all分别是子查询关键词之一,

    any 可以与=、>、>=、结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。

    all可以与=、>、>=、结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。

    他们进行子查询的语法如下:

    operand comparison_operator any (subquery);

    operand in (subquery);

    operand coparison_operator some (subquery);

    operand comparison_operator all (subquery);

    any,all关键字必须与一个比较操作符一起使用。any关键词可以理解为“对于子查询返回的列中的任一数值,如果比较结果为true,则返回true”。

    例如:

    select s1 from t1 where s1 > any (select s1 from t2);

    假设表t1中有一行包含(10),t2包含(21,14,6),则表达式为true;如果t2包含(20,10),或者表t2为空表,则表达式为false。如果表t2包含(null,null,null),则表达式为unkonwn。

    all的意思是“对于子查询返回的列中的所有值,如果比较结果为true,则返回true”

    例如:

    select s1 from t1 where s1 > all(select s1 from t2);

    假设表t1中有一行包含(10)。如果表t2包含(-5,0,+5),则表达式为true,因为10比t2中的查出的所有三个值大。如果表t2包含(12,6,null,-100),则表达式为false,因为t2中有一个值12大于10。如果表t2包含(0,null,1),则表达式为unknown。如果t2为空表,则结果为true。

    not in 是 “<>all”的别名,用法相同。

    语句in 与“=any”是相同的。

    例如:

    select s1 from t1 where s1 = any (select s1 from t2);

    select s1 from t1 where s1 in (select s1 from t2);

    语句some是any的别名,用法相同。

    例如:

    select s1 from t1 where s1 <> any (select s1 from t2);

    select s1 from t1 where s1 <> some (select s1 from t2);

    在上述查询中some理解上就容易了“表t1中有部分s1与t2表中的s1不相等”,这种语句用any理解就有错了。

    展开全文
  • 字符串多模式精确匹配(脏字/敏感词汇搜索算法)——TTMP算法 之理论如此 什么是TTMP算法?不好意思,我发布这篇文章之前,估摸是没有其他地方能找着该算法的,...TTMP是啥意思呢?是Terminator Triggered Mu...

    转自:http://www.cnblogs.com/sumtec/archive/2008/02/01/1061742.html

     

    什么是TTMP算法?不好意思,我发布这篇文章之前,估摸是没有其他地方能找着该算法的,因为那是俺生造的。
    TTMP是啥意思呢?是Terminator Triggered Multi-Pattern 的意思,也就是结束符触发多模式算法。
    -_-! 有点难理解,没关系,看完了也许就理解了。

    不过这个自造的算法有点复杂,为了保证大家能够顺利阅读,请大家配合做一个测试:
    拿出你的手表,或者其他计时器,看看你能用多块的时间阅读完下面这篇文章。
    判断标准如下:
    如果你的时间少于15秒,就可以不用读我的文章了,完全有能力造一个更强的算法;
    如果你的时间少于30秒,我们可以沟通交流一下;
    如果你的时间少于45秒,你可以仔细阅读一下,说不定可能也许有点启发作用;
    如果你的时间少于60秒,你一定能够在这里挖到宝矿;
    如果你不属于上述情况,我建议您啊,还是不要费力气阅读了,有点面为其难了。

    Do you raelly know Engilsh?
    At laest in Egnlish, wehn pepole raed, tehy 
    usaully wlil not noitce taht the charcatres bewteen
    the frist ltteer and the lsat leettr are not in a
    corrcet oredr. In fcat, hmuan brian does recongize
    wrods by seeknig the fsirt ltteer and the lsat leettr,
    and tehn fnidnig whcih charatcers are insdie of tehm.
    See! All the wrods hree wtih mroe tahn 3 leettrs are
    all wirtten in a worng way! Do you niotice taht?

    嘿嘿!其实刚才那段能力测试的话是瞎扯的,主要是让大家快速阅读,而不是认真阅读。有意思吧?
    这个不是我瞎扯出来的,是一个著名大学的研究结果(好像是剑桥),原文我没工夫找,瞎造一段对付一下。不知道你读上述文字的时候是什么感受,反正我自己觉得比较震撼,也比较有意思。

    确实,如果按照自动机理论,一个字一个字的去认真阅读,那么也还是很有可能能够理顺语法结构,搞清楚一句话的含义的(理论上如此吧,实际上还没有任何一个机器能做到真人般的感知能力)。但是如果每个字都认真读,并查找语法表,一来速度会慢,二来需要海量的空间去做这个事情。而人脑比较聪明,经过若干年的锻炼之后,已经自动的学会了放弃细节,比如读"cerroct"这个词的时候,找到前面是c开头,后面是t结尾,中间有eoc各一个,r两个,一查表就知道肯定是“正确”这个词而不管他正确与否——哦,不好意思,我又写错了,应该是correct!

    嗯?这个跟我们这次的主题——字符串多模式精确匹配,有什么关系呢?
    有啊!当然有啦。不过在我告诉大家这个关系之前,我们先来分析一下,字符串多模式精确匹配的效率问题是什么?写之前我先给大家说一下,我下面的说明也许不会很严谨,因为有时候太严谨了,就不好理解了。例如什么令X=Y……反正我最近为了这个事情找的一些资料,尽是这个,看着也觉得头晕。

    所谓字符串多模式精确匹配是啥意思呢?字符串不多说了,实际上能用于搜索字符串的,也能搜索其他东西。多模式嘛:比如
    string s="xxx"; 
    string t="xx";
    s.IndexOf(t);
    这个是在一个字符串s中,找出另外一个字符串t所在的位置(或者说是否存在),这种叫做单模式,只有一个要被寻找的字符串t——唯一的一个搜索模式;如果说是
    string s="xxx";
    string[] t= new string[]{"x1", "x2", "x3"...};
    s.Scan(t);
    这种呢,就叫做多模式匹配了。因为我要在s里面找出一组t中任意一个所在的位置,或者说是看看我们的文章里面是否有脏字表里面的敏感词汇。

    关于多模匹配问题,有很多已有的算法,我没有仔细的看,只看了一个可能是WM的算法,实际上可能还有什么grep/agrep等算法。不过需要提醒大家的是,还有不少的算法是讨论模糊匹配的,比如说容许其中有一个字不正确,那些算法就不是我这个主题要讨论的内容了。我要讨论的是精确搜索,即要找“地瓜”就找“地瓜”,不要“地鼠”。

    多模式精确匹配很难吗?不难,很简单:我们只需要循环一下,先找s.IndexOf(t1),再找s.IndexOf(t2)……但是如果你果然这么做,效率就会很低了,因为你会需要扫描文本很多很多遍。可以想象,我们的目标是只要扫描整个文章一遍就能够找出这个文章里面都有哪些敏感词汇。不过,很明显该目标并不容易达成,但至少我们可以尽量接近“只扫描一次”这个目标。在进一步分析之前,建议先看另外一篇文章:
    (重发).NET脏字过滤算法 
    这篇文章的算法(比如叫做XDMP算法)其扫描速度已经是比较快的了,并且其思路也比较好理解,我们在这个文章的基础上进行讨论会比较有意义。首先我们先整理一下这个算法的思路:
    1、首先扫描文章里面的每一个字符,只有当某一个字符是脏字表中任意一个脏词的第一个字符(称为“起始符”),我们才试图看看接下来是否是脏字(触发检索)。
    2、但是我们也不是毫无头绪的就开始循环脏字表的每一个词条:
    2.1、我们往后检索一个字符,先看一下这个字符是否是脏字表里面的任意一个字符,如果不是,就表明不可能是脏字表中的任何一个条目,就可以退出了。
    2.2、如果是,我们就取从第一个被检出字符到目前扫描到的字符之间的字符串,求哈希值,看看能否从哈希表中检出一个脏词。
    如果检出了,那就大功告成,否则继续检索后面一个字符(重复2.1、2.2),直至找不到,或者超出脏字表条目最大的长度。
    2.3、如果都找不到,或者超长,那么接下来就回到刚才的那个“起始符”后一个字符继续扫描(重复1、2),直至整个文章结束。

    我这里先引入了三个重要概念:
    1、扫描,指扫描文章,看看是否有需要和脏字表开始进行对比的情况;
    2、检索,指已经发现可能存在情况了,在将文本和脏字表进行对比的过程;
    3、起始符,指脏字表中条目中的第一个字符。

    如果我们只要扫描,不需要检索就可以完成任务,那一定是最快的,不过目前我比较孤陋寡闻,没有找到这样的算法。
    又或者,如果我们扫描一遍,而检索全中,那也很不错,很不幸,还是没见过。
    很明显,扫描不应该多于1遍,否则肯定效率不可能高。那么检索就是算法的关键了!拆开来,提高检索质量有下列几个方式:
    1、尽可能不触发检索;
    2、如果确实需要触发检索了,那么每次触发检索的时候,要尽可能减少检索所需要遍历的字符数量;
    3、每次对比脏字表的时候,减少运算量。

    回过头分析上面的XDMP算法,是:
    1、一次扫描;(很好,没啥好说的)
    2、只要发现“起始符”就触发检索;
    3、检索的时候,需要遍历的字符数是 1+2+3+...+n,这里的n是被命中的脏词的长度,或者最接近的长度;
    4、每次检索,需要重复计算HashCode,不要忘了,计算HashCode,也是需要扫描字符串的,也就是又要遍历1+2+3+..+n个字符。

    于是,我就有了一下问题:
    1、难道每次遇到“起始符”了,就一定要触发检索吗?哎呀妈呀,这个也要检索(因为脏字表里面可能有MB)?!
    2、难道每次触发检索,都非得要检索长度为1的,长度为2的,长度为3的……直到检索成功,或者出现非脏字表字符的时候吗?
    3、难道每次检索,我们都需要把特定长度的待检文本截取出来吗?
    4、难道每次检索,都需要从头开始计算哈希值吗?不能利用同一次触发检索后,上一次检索的哈希值,来减少本次计算的不必要运算量吗?

    这四个问题,基本上是我想要解决的问题。其中前两个是一类问题,后两个是另一类问题。首先我们检查第一类问题:
    好,我们回顾一下最开始的那篇英文,我们是否有点什么启发?对!我们触发检索的条件太简单了!
    如果一个单词我们都没有看完呢,为什么要开始想这个事一个什么词呢?
    另外,我们触发检索之后,也作了很多不必要的检索,因为当我们遇到"cao"这个字符的时候,很可能脏字表里面只有"caoT妈","caoN妈"这两种情况。如果有文章里面是"操作",脏字表里面正好又有"作LOVE",上述XDMP算法还是会乖乖的搜索两个字符的情况,而实际上又是没有必要的。

    那么我们如何减少这些不必要的运算呢?首先,我们改一下,不要每次遇到“起始符”就触发检索。我们扫描到起始符怎么办?记录下来他的位置等信息,然后继续扫描下去。当我们遇到了“结束符”,也就是脏字表每一个词条中,最后一个字符中的任意一个时,我们才考虑是否要开始触发扫描。而扫描的时候呢,也不一定非得要脏字长度为1、2、3……的情况。因为之前记录了各种起始位置,我们可能只需要扫描1、3两种情况,或者5这种情况。

    接下来是第二类问题:
    上述算法里面,为了加快检索某串字符是否在脏字表里面,使用了哈希表。为了能够查表,所以就必须把这个哈希值给截取出来。可是这就引发了两个性能损耗点:
    1、每一次截取,都要重新计算哈细值;
    2、每一次都需要截取出一个字符串。
    要避免这个问题,首先我们需要了解哈希表大致是怎么工作的:
    哈希表实际上是根据当前的字符串内容,得出一个概率相对比较平均的散列值(这样哈希效表才不会容易出现冲突,即内容不同数值却一样),然后找出表中哈希值相等的第一个结果,然后对内容进行比较,如果相同就是找到了。否则就找下一个,直到没有相等哈希值的条目为止。

    于是,我们可以这么来解决上述问题:
    1、首先,我们造一个哈希值的计算方法,使得我们可以利用上一次的计算结果,接着计算下一个结果。
    比如说,我们可以一个字节一个字节的进行异或(好处是方向性不敏感),或者也可以规定从字符串后方往前开始计算。
    为什么规定从尾部进行计算?因为TTMP是结束符触发扫描的,比如说有文本:
    ABCDE
    如果E是结束符,那么就会检索ABCDE、BCDE、CDE、DE、E(还要看是否扫描到这些起始符)。如果我们是从后方往前计算,那就可以利用E的哈希值以及字符D,就可以计算DE的哈希值,而不需要再次对E字符进行计算了。
    2、其次,我们可以构造这样的哈希表:
    Dictionary<int, List<string>> hash;
    其key就是我们刚才算出来的哈希值,根据算出来的哈希值,我们就可以得到一个该哈希值下的脏字列表,然后我们一个个的和待检文本进行字符对字符的比较。这里看起来很奇怪,为什么有了哈希值,还不能够通过哈希值直接找到对应的字符呢?
    不要忘了,哈希值本来就是会冲突的,我现在只不过把冲突的情况单独取出来自行处理,这样实际上的检索次数并没有增加(放在哈希表里面,也必须一个个的进行字符对字符的比较,才能够确定Key值是否完全相等,而不是Key的哈希值相等但Key值不等)。而好处是,我们不需要非得取出一个字符串,好让哈希表去获取这个字符串的哈希值(需要从头遍历每一个字符)。
    通过以上的措施,我们就可以让每一次对n长度待检文本触发检索,只需要最多遍历n个字符,就可以得到最多n次遍历的所有哈希值了,而原XDMP算法则需要遍历Sum(n)个字符。

    当然了,上述这几个措施,其效果并不会非常明显,原因有三个:
    1、通常我们的文本都是很正常的文本,顶多偶尔有点敏感词汇,因此并不会经常挑战前面说到的性能损耗点;
    2、通常我们的脏字表数量不会极其巨大,起始符和结束符也应该集中在有限的那些字符里面,因此绝大多数时候首字符表,以及结束符表就已经能够极大地提高性能了;
    3、即使我们真的需要触发检索了,我们的脏字通常长度会比较短,或者大多数会比较短,因此上面的改进所带来的性能提升会比较有限。比如说两个字符的情况下,原算法计算哈希值需要遍历3个字符,而TTMP则只需要遍历2个字符……汗
    而如果是5个字符,原算法需要遍历15个字符,而TTMP则只需要遍历5个字符,开始有差距感了。
    可惜的是,5个字符的敏感词毕竟还是比较少的,而一篇文章正好中这个5字敏感词的地方也是很少的。

    目前我这个TTMP算法还没有优化,已经能够做到和XDMP算法消耗时间比为1:1.5-2.5,算是很不错了。当然了XingD后来又做了一个新的算法,测试速度很快,可是当时我测的时候还不稳定,有漏检的情况,因此暂时不做评论了。
    至于我的TTMP算法,也还有不少可以挖掘潜力的地方,比如现在是前向检索的,以及预先计算哈希值的。如果改成后向检索,检索时计算哈希值,性能应该会更好一点。不过暂时不打算继续挖掘了,准备把他先放到实战里面应用再说。

    呃,其实本文开头说的还是没错的,本文还是有点难度,而本人描述能力也不是特别好,不知道各位看官有没有看懂了?
    源码?嘿嘿,私货,先收藏一段时间再说。当然了,如果你有一段源码,能够合法制造让制造者合法拥有的人民币真币,能够用VS2005编译通过,部署过程只需要点一下鼠标,运行过程无需看管,并且你愿意和我交换的话,我会考虑一下的……真实的情况是,我现在还要继续让算法更稳定,不能放出一个问题多多的代码出来吧?
    私下说一下,这个程序比XDMS算法复杂不少,如果将来放出来,并且各位想要整明白的话,还需要自己花点心思。

    哦,顺预先给某人回复一下:
    KMP算法是单模匹配算法,BM据说也是单模式的算法。
    WM算法是多模匹配的,我找了一个据说是WM的算法看了看:
    http://blog.chinaunix.net/u/21158/showart_228430.html
    不知道你说的是不是这个。
    我发现思路其实和KMP/BM类似,主要是通过“跳跃”技术来提升性能的。但是该文里面也提到了这么一段话:
    假设其中一个模式非常的短,长度仅为2,那我们移动的距离就不可能超过2,所以短模式会使算法的效率降低。

    可问题就在于,一般脏字表的长度都是1到2个的居多,因此绝大多数跳跃的作用并不强。即使是5个字符,再TTMP里面,也很可能因为超出长度没有遇到“结束符”而不会触发扫描。而WM需要有一个Shift表,为了节省空间还需要压缩,这就意味着需要对每一个扫描单元进行一个压缩计算。综上所述,TTMP和WM进行搜索脏字任务的PK,谁胜谁负还不一定呢。顺便说一下,即使是WM,也不是一次扫描的,因为如果不跳跃的话,就会要多扫描一下某些字符。

    TTMP效率描述:
    Ot = Ot(文本长度) + Ot[ 起始符与结束符在出现在扫描窗口中的次数*Avg(同一个结束符中哈希值相等的词条数目) ]
    =Ot(N) + Ot[f*Avg(h)]

    Om = Om(字符类型表) + Om(结束符表) + Om{ 词条总数*[哈希表内部变量消耗内存+列表消耗内存数量+Avg(词条长度) ] }
    =256K + 256K + Om{n * [12+12+Avg(k) ] }
    =512K + Om[n*(c+k)]

    转载于:https://www.cnblogs.com/seaspring/p/6625589.html

    展开全文
  • 相似度自然语言处理(NLP) : 大概意思就是 让计算机明白一句话要表达的意思,NLP就相当于计算机在思考你说的话,让计算机知道"你谁","你叫","你叫什么名字"一个意思.语义相似度:pip install jiebapip install ...
  • 很多朋友会因为各种原因购买二手房,在寻找二手房中会经常遇到二手房中介发的朋友圈或者广告里提到的满二唯一、满五唯一等专业术语,很多人不知道啥意思,既然从业人员很着重的提到这几个关键词,那么对于买房者来讲...
  • 不用多说,凡是一直关注紫枫的都明白啥意思,送福利了!最近一直在赠送软件,插件,好久没送素材了,今天给大家带来的某宝要花钱才能买到的古风工笔画意后期素材,全PNG透明底图格式,拖进PS直接就可以用,不用...
  • spread.action [code="java"]package action; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File;... </package...
  • 写好标题自然想传达内容的意思,所以写文章内容的时候都围着这一个话题写出来的,标题自然相呼应的,无论写什么或者转载都要知道内容写的,因此在选取标题前,了解文章内容必要的。 2.标题的关键词能...
  • 当我听到这两个关键词的时候确实有点懵逼,不知道啥意思,因此记录下来,作为自己的学习目标受控组件(React官方推荐使用受控组件)在React中,每当表单的状态发生变化时,都会被写入到组件的state中,这种组件在React...
  • 从Nodes:关键词的下一行开始读入,之前写都可以 Nodes: NodeID, xpos, ypos, indegree, outdegree, ASid, type(router/AS) 但只读前3项,其中AS自治系统的意思 Edges: EdgeID, fromNode, toNode, ...
  • 前后端分离-----SEO优化

    千次阅读 2019-07-27 10:27:27
    SEO指通过对网站进行站内优化和修复(网站Web结构调整、网站内容建设、网站代码优化和编码等)和站外优化,从而提高网站的网站关键词排名以及公司产品的曝光度。通过搜索引擎查找信息当今网民们寻找网上信息和资源...
  • 遇到新名词,先从字面意思下手,提取其中的关键词,拆分解释。例如:变量,会变的量……+ why -为什么要有它,有用?一种事物的存在,即有其理由。为什么要有它,用它来做什么?编程语言由人类创造,用来控制...
  • 一个什么都不做的链接 以前总是想当然的以为,这样就定义了一个死链接,却没有考虑‘# ‘号到底是啥意思。今天做了一个Ajax项目,一点编辑,页面的滚动条总是跑到顶部。开始以为因为浏览器的页面解析机制的问题,...
  • 同事大佬给我支个招,设置hadoop队列名字,至于啥意思,有什么影响,会不会影响线上,都不得而知的,只管先用吧。 set mapreduce.job.queuename=yourqueue; 然后就解决了。 但是搜索得到的关键词怎么做神经...
  • 077《Sourcegraph》阮一峰大佬推荐的github仓库关键词搜索工具 076《Listen1》Chrome听付费歌曲工具!免费听周杰伦的歌,网易云音乐,QQ音乐,虾米音乐,酷狗,酷我,哔哩哔哩,咪咕,一个扩展全搞定 075《Link to Text...
  • sesvc.exe 阿萨德

    2019-06-02 17:11:12
    看看分别什么意思? 初始化桶大小,因为底层数组,所以这数组默认的大小。 桶最大值。 默认的负载因子(0.75) table 真正存放数据的数组。 Map 存放数量的大小。 桶大小,可在初始化时显式指定。 负载因子,...
  • 大话数据结构

    2018-12-14 16:02:18
    意思就是完美理想,不完美才人生。我们通常举的例子也都左高右低、参差不齐的二叉树。那是否存在完美的二叉树呢? 6.5.1二叉树特点 164 6.5.2特殊二叉树 166 6.6二叉树的性质 169 6.6.1二叉树性质1 169 ...
  • 深入浅出 Koa 原理

    2021-01-08 14:41:42
    Context字面意思是上下文,也有环境等意思,koa中的操作都基于这个context进行的,例如 <pre><code> javascript this.body = 'hello world'; </code></pre> 从前面的图中,...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

关键词是啥意思