【问题标题】:Searching most frequently occurring patterns in a file搜索文件中最常出现的模式
【发布时间】:2011-07-24 07:50:04
【问题描述】:

您将如何在文本文件中找到 n 个最常出现的模式。你会使用什么数据结构? 在这里,模式不是一个单词,而是一个单词序列。例如,“this is a”可能是文件中经常出现的模式。

后续问题:

  • 如果文件非常大(以 GB 为单位)怎么办?
  • 如果文件包含多种语言(英语、日语等)的文本怎么办?

PS:我知道使用哈希表或 BST 可以相对容易地找到最常出现的单词。只是想不出我们如何找到多字串。

【问题讨论】:

    标签: algorithm data-structures


    【解决方案1】:

    短语频率的一种方法是使用专门的数据结构,如后缀数组(请参阅http://en.wikipedia.org/wiki/Suffix_array,如果您喜欢学术论文,请参阅http://www.mitpressjournals.org/doi/pdf/10.1162/089120101300346787)。

    如果您有千兆字节的数据要索引,请在大型集群上使用 hadoop! :-)

    【讨论】:

      【解决方案2】:

      查看PPMPPM(部分匹配预测)或PPM* 方法Cleary and Teahan。它用于文本压缩。尽管您不需要压缩,但任务是相同的 - 使用 高效的数据结构,以非常有效的方式找到最常见的字符序列。看看上面 Cleary & Teahan 的论文,看看他们是如何做到这一点的——这是一个非常好的算法。我敢打赌也有一些开源实现。

      【讨论】:

        【解决方案3】:

        我不明白为什么语言很重要,除了确定单词边界的位置。我还假设模式有一定的长度?否则答案肯定是长度为 1 的模式,这是微不足道的。那么为什么不确实使用哈希表来计算所有 n-gram 呢?

        【讨论】:

        • 我认为这个想法是 n 是未知的。您正在尝试找到总体上最常见的模式,这意味着您没有固定的 n 值可供尝试。
        • @Sean:模式长度不是恒定的
        • @templatetypedef:没错。问题基本上是找到最常见的模式。
        • 好的,但是模式“X”将始终至少与“X Y”一样常见,因为后者的每次出现都包含前者的出现。最常见的模式总是长度为 1。听起来这不是问题的本意,所以这就是为什么我想知道是否有未说明的要求。
        猜你喜欢
        • 2013-02-21
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        相关资源
        最近更新 更多