Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 在大量文本中查找重复最多的短语_Search_Text_Full Text Search_Bigdata - Fatal编程技术网

Search 在大量文本中查找重复最多的短语

Search 在大量文本中查找重复最多的短语,search,text,full-text-search,bigdata,Search,Text,Full Text Search,Bigdata,我有大量的文本数据。我的整个数据库是UTF-8的文本格式 我需要在我的全文数据中列出最重复的短语 例如,我的愿望输出如下: { 'a': 423412341, 'this': 423412341, 'is': 322472341, 'this is': 222472341, 'this is a': 122472341, 'this is a my': 5235634 } 处理和存储每个短语需要庞大的数据库。 例如,存储在MySQL或MongoDB中。 问题是有没有更有

我有大量的文本数据。我的整个数据库是UTF-8的文本格式

我需要在我的全文数据中列出最重复的短语

例如,我的愿望输出如下:

{
  'a': 423412341,
  'this': 423412341,
  'is': 322472341,
  'this is': 222472341,
  'this is a': 122472341,
  'this is a my': 5235634
}
处理和存储每个短语需要庞大的数据库。 例如,存储在MySQL或MongoDB中。 问题是有没有更有效的数据库或算法来找到这个结果? Solr、Elasticsearch等


我想每个短语中最多有10个单词对我有好处。

我建议结合两个领域的观点,这里:,和

  • 让我们从查找k个最频繁的单个单词开始,而不将整个语料库加载到内存中。一个非常简单的算法,采样(请参阅])可以非常容易地实现这一点。此外,它非常适合并行实现(如下所述)。关于top-k查询有大量的工作,包括一些关于分布式版本的工作(例如,请参阅)

  • 现在来看k个最频繁的短语(可能是多个短语)的问题。显然,长度为l+1的最频繁短语必须包含长度为l的最频繁短语作为前缀,因为在短语后面添加一个单词并不能增加其受欢迎程度。因此,一旦你有了k个最频繁的单字,你就可以在语料库中只扫描它们(这会更快)来构建长度为2的最频繁的短语。使用它,您可以构建长度为3的最常用短语,依此类推。停止条件是长度为l+1的短语不逐出长度为l的任何短语


  • 采样算法的简短描述

    这是一个非常简单的算法,它将以很高的概率从那些频率至少为f的项中找到前k项。它分为两个阶段:第一个阶段查找候选元素,第二个阶段对它们进行计数

    在第一阶段,从语料库中随机选择~log(n)/f单词(注意,这远小于n)。很有可能,您想要的所有单词都会出现在这些单词的集合中

    在第二阶段,维护这些候选元素的计数字典;扫描语料库,统计出现的次数

    输出第二阶段产生的项目的前k个


    注意,第二阶段非常适合并行实现。如果您将文本划分为不同的段,并计算每个段中出现的次数,您可以轻松地在末尾合并词典。

    这可以大大简化。你根本不需要数据库。只需将全文存储在一个文件中。然后编写一个PHP脚本打开并读取文件内容。使用PHP正则表达式函数提取匹配项。将总数保存在全局变量中。将结果写入另一个文件。就这样

    如果可以将数据存储在中,则可以使用查找最常见的短语。查询示例:

    http://127.0.0.1:8983/solr/admin/luke?fl=fulltext&numTerms=100
    
    http://127.0.0.1:8983/solr/terms?terms.fl=fulltext&terms.limit=100
    
    此外,可以帮助查找最常见的单个单词。下面是一篇关于使用Terms组件查找100个最常见的索引词并将它们添加到Stopwords文件的文章。查询示例:

    http://127.0.0.1:8983/solr/admin/luke?fl=fulltext&numTerms=100
    
    http://127.0.0.1:8983/solr/terms?terms.fl=fulltext&terms.limit=100
    
    你考虑过使用吗

    假设您可以访问适当的基础设施,那么这似乎非常适合它。您将需要一个标记器,该标记器将行拆分为多字标记(最多10个字)。我认为这没什么大不了的。MR作业的结果将是
    token->frequency
    对,您可以将其传递给另一个作业,以便根据频率对它们进行排序(一个选项)。我建议在考虑其他解决方案之前先阅读Hadoop/MapReduce。您还可以使用HBase存储任何中间输出


    Google在MapReduce上原创。

    将其标记为1到10个单词,并按标记长度插入10个SQL表中。确保对带有字符串标记的列使用哈希索引。然后只需调用
    SELECT token,在每个表上按token
    从tablename组中计数(*),并将结果转储到某个位置,然后等待

    编辑:对于大型数据集来说,这是不可行的,只需对每个N-gram更新计数+1或将新行插入表中(在MYSQL中,在重复键更新时查询
    insert…将非常有用)。不过,您肯定仍然应该使用散列索引

    之后,只需按发生次数排序并合并这10个表中的数据(您可以在一个步骤中完成这项工作,但这会给内存带来更大的压力)


    小心Ami Tavory建议的启发式方法,如果选择错误的参数,可能会得到错误的结果(抽样算法的缺陷可以在一些经典术语或短语上看到,例如“人身保护令”-人身保护令和保护令本身都不会被频繁选择,但作为一个两个单词的短语,它的排名很可能高于通过在普通单词后面加上/加上前缀而得到的一些短语)。当然,没有必要将它们用于长度较短的令牌,只有在经典方法失败时(需要太多时间或内存)才可以使用它们。

    艾米·塔沃里的顶级答案指出:

    显然,长度为l+1的最频繁短语必须包含长度为l的最频繁短语作为前缀,因为在短语后面添加一个单词并不能增加其受欢迎程度

    虽然在短语后面加上一个词确实不能增加它的流行度,但没有理由假设2克的频率以1克的频率为界。为了说明,考虑下面的语料库(专门用来说明这一点):

    在这里,将存在一个狡猾的语料库;一个非常奇怪,有时神秘的语料库会让你哑口无言,也许,也许有一点;特别是因为我的诡计多端的语料库与您期望的模式不匹配;它也不会像鱼、船、向日葵或非常漂亮的小猫。这个诡计多端的语料库会让一个名叫Ami Tavory的用户大吃一惊;从现在起,一年、一个月或一分钟后,这个棘手的语料库将会非常有趣3-Gram Frequency ------ --------- tricksy corpus will 4