我有大量的文本数据。我的整个数据库都是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个单词,这对我有好处。

最佳答案

我建议结合来自两个 Realm 的想法:Streaming AlgorithmsApriori Algorithm From Market-Basket Analysis

  • 让我们从查找k个最常见的单个单词而不将整个语料库加载到内存的问题开始。一个非常简单的算法采样(请参见Finding Frequent Items in Data Streams])可以非常容易地做到这一点。而且,并行实现(在下面描述)是非常合适的。在前k个查询上有大量工作,包括一些在分布式版本上的工作(请参见Efficient Top-K Query Calculation in Distributed Networks)。
  • 现在解决k个最常见短语(可能包含多个短语)的问题。显然,长度为l +1的最常用短语必须包含长度为l的最常用短语作为前缀,因为将单词追加到短语不会增加其流行度。因此,一旦有了k个最常用的单词,就可以只扫描它们的语料库(速度更快)以构建长度为2的最频繁短语。使用它可以构建长度为3的最频繁的短语,并且以此类推。停止条件是长度为l +1的短语不退出任何长度为l的短语。


  • 采样算法的简短说明

    这是一种非常简单的算法,极有可能从频率至少为f的项目中找到前k个项目。它分为两个阶段:第一个阶段查找候选元素,第二个阶段对其进行计数。

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

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

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

    请注意,第二阶段非常适合并行执行。如果将文本划分为不同的段,并计算每个段中的出现次数,则可以轻松地在最后合并字典。

    关于search - 在大量文字上找到最重复的短语,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29753618/

    10-16 12:43
    查看更多