最常见的 n-gram 分析

Analysis of most common n-grams

美好的一天,

我一直在研究 NLP 并发现了这段用于提取顶级 n-gram 的代码:

def get_top_tweet_bigrams(corpus, n=None):
    vec = CountVectorizer(ngram_range=(2, 2)).fit(corpus)
    bag_of_words = vec.transform(corpus)
    sum_words = bag_of_words.sum(axis=0) 
    words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]
    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
    return words_freq[:n]

我已经逐行检查了这个函数,但我无法理解的部分是:

[(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]

我明白它的成就,但我不明白它是如何做到的。为什么简单地从 vec.vocabulary_.items() 中提取 idx 会给我们错误的计数?矩阵 sum_words 包含什么?这些价值观是什么?谢谢。

  • bag_of_words 是通常的二维 document-ngram 频率矩阵,即它包含任何文档的任何 ngram 的频率(corpus 可能包含任意数量的文档)。
  • sum_words 获取每个 ngram 的跨文档频率总和。它是一维数组。 Length为词汇表大小,索引与bag_of_words中的顺序相同。当然,它不包含 ngram 本身。

由于目标是获得频率最高的 ngram,我们需要将每个 ngram 与其在 sum_words 中的频率相匹配。这就是为什么用 ngram 和索引迭代词汇表(包含 ngram)的原因:如果只获得索引 idx,则无法知道它代表哪个实际 ngram。当然索引是用来获取sum_words中的总频数的。因此 words_freq 是一个包含每个 ngram 的对 (ngram, frequency) 的数组。

最后 2 行按频率降序对该数组进行排序并提取前 n 个元素。