【问题标题】:Efficent methods for finding most common phrases in a body of text AKA trending topics在文本 AKA 趋势主题中查找最常用短语的有效方法
【发布时间】:2011-03-21 19:22:37
【问题描述】:

我之前就这个话题询问了similar question,我最终得出了几种可行的解决方案,一种基于布隆过滤器+ ngram,另一种基于哈希表+ ngram。两种解决方案都可以在小型数据集(

我目前正在使用 Ruby,也许这就是问题所在,但是我可以尝试解决此问题的任何其他解决方案或方法吗?

【问题讨论】:

  • 如何在 Ruby 中存储 n-gram?
  • 作为一个单词数组?通过预先将它们转换为符号,您可以节省大量内存(也许还可以提高一些速度)。
  • 我假设您最初是在对单词进行标记。然后这个问题本质上与压缩问题相同,我希望我了解更多。但是周围有相当多的压缩算法。

标签: ruby algorithm data-structures data-mining


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多