用于在文本主体AKA趋势主题中查找最常见短语的有效方法

时间:2010-07-27 19:35:42

标签: ruby algorithm data-structures data-mining

我之前在这个主题上问similar question,我最终得到了几个有效的解决方案,一个基于bloom过滤器+ ngrams,另一个基于哈希表+ ngrams。两种解决方案都能很好地处理小数据集(< 1000文本,通常是推文),但计算时间呈指数增长,这意味着10,000次可能需要数小时。

我目前正在使用Ruby,也许这就是问题,但是我可以尝试解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

如果您希望在大量数据集中进行文本搜索,则可能需要查看类似solr的内容。有一个非常容易设置的solr gem叫做sunspot http://outoftime.github.com/sunspot/

答案 1 :(得分:0)

您的问题可以通过以下步骤解决:

  • (可选,出于性能目的)运行所有文档,在唯一字和整数之间创建映射。此外,最好为句子终止创建一个特殊的映射(。!?等)。这是为了便于检查不跨越句子边界的短语。
  • 将所有文档连接成一个巨大的映射整数数组(在上一步中)。这可以在我们完成后续步骤时在线完成(以节省空间)。
  • 在上一步中构建字符串的suffix array,并使用longest common prefix array进行扩充。已知最快的实现是在最坏情况下的O(n)运行的SA-IS。见here。需要进行一些特殊处理,以确保每个公共前缀不会越过句子边界。
  • LCP阵列基本上是您需要的结果。你可以用它做任何你想做的事情,例如:对它进行排序以找到文档中最长的重复短语,找到所有5个单词,4个单词,3个单词的短语等。最常见的短语(我假设至少2个通过查看LCP和后缀数组,可以找到这里的单词短语。

快速Google搜索显示this library包含Ruby后缀数组实现。您可以在O(n)Reference中生成LCP数组。