Search 在大量文本中查找重复最多的短语
我有大量的文本数据。我的整个数据库是UTF-8的文本格式 我需要在我的全文数据中列出最重复的短语 例如,我的愿望输出如下: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中。 问题是有没有更有
{
'a': 423412341,
'this': 423412341,
'is': 322472341,
'this is': 222472341,
'this is a': 122472341,
'this is a my': 5235634
}
处理和存储每个短语需要庞大的数据库。
例如,存储在MySQL或MongoDB中。
问题是有没有更有效的数据库或算法来找到这个结果?
Solr、Elasticsearch等
我想每个短语中最多有10个单词对我有好处。我建议结合两个领域的观点,这里:,和
采样算法的简短描述 这是一个非常简单的算法,它将以很高的概率从那些频率至少为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