【问题标题】:Techniques for finding common sequences of words in a large text corpus?在大型文本语料库中查找常见单词序列的技术?
【发布时间】:2019-06-05 19:09:05
【问题描述】:

是否有任何算法可以有效地在大型文本语料库中找到 n 个最常见的 k-word 单词序列?

因此,例如,如果n = 1k = 5,而我的语料库是:

a b a b a c d e f a b a b a c c b c b a b c

输出将是a b a b a

【问题讨论】:

  • 迭代每k个单词句子并在计数器上加1然后使用堆得到top n有什么问题?
  • 感谢您提出这个建议——我假设您的意思是保留 k 词句子的哈希表,并在每次看到一个时递增一个计数器,遍历整个语料库一次。我可能会使用它,但对于大型语料库,在 RAM 中执行此操作会很困难(哈希表会变大)。如果您的意思是遍历每个 k-word 序列的语料库并始终保持固定大小的堆,这将解决内存问题,但现在时间复杂度将是 O(n^2),因为我们将进行迭代每个 k-word 句子遍历整个语料库一次,对吧?我或者我可能误解了。
  • 正如@juvian 指出的,这可以在 O(N+k) 时间内完成,其中 N 是语料库中的单词数。见geeksforgeeks.org/…

标签: algorithm nlp


【解决方案1】:

这是一个简单的算法。在 k 个单词的序列中,在每个单词处逐行拆分单词序列。对于您的示例,我们有:

a b a b a
b a b a c
a b a c d
b a c d e
a c d e f
c d e f a
d e f a b
e f a b a
f a b a b
a b a b a
b a b a c
a b a c c
b a c c b
a c c b c
c c b c b
c b c b a
b c b a b
c b a b c
c b a b c

对它们进行排序:

a b a b a
a b a b a
a b a c c
a b a c d
a c c b c
a c d e f
b a b a c
b a b a c
b a c c b
b a c d e
b c b a b
c b a b c
c b a b c
c b c b a
c c b c b
c d e f a
d e f a b
e f a b a
f a b a b

现在很容易找到最常见的 k 序列。如果文件非常大,您可能需要拆分它,对部分进行排序,然后合并部分。

【讨论】:

  • 这在你想要计算所有单词的数量时很有用,但如果你只需要前 k 个,那么效率非常低
  • @juvian top k 是什么意思? k 作为序列的长度给出。
  • 对不起前n。如果 n 很小,则有更好的方法
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 2014-06-26
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多