大家好,
我一直在学习NLP,并遇到了这段代码用于top 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])对于单词,idx在vec. vocabulary_items()中]
我知道它实现了什么,但我不明白的是如何实现的。为什么简单地从vec. vocabulary_items()中提取idx会得到不正确的计数?矩阵sum_words包含什么?这些价值是什么?谢谢你。
bag_of_words
是通常的二维文档-ngram频率矩阵,即它包含任何文档的任何ngram的频率(corpus
可能包含任何数量的文档)。sum_words
获取每个ngram的跨文档频率之和。它是一个一维数组。长度为词汇表大小,索引顺序与bag_of_words
相同。当然,它不包含图形本身。
由于目标是获得最频繁的ngram,我们需要将每个ngram与其在sum_words
中的频率进行匹配。这就是为什么词汇表(包含ngram)要用ngram和索引进行迭代:如果只获得索引idx
,就没有办法知道它代表的是哪个实际的ngram。当然,该指标用于获得sum_words
中的总频率。因此,words_freq
是一个数组,包含每个ngram的pair (ngram, frequency)。
最后两行按频率降序排序,并提取最前面的n
元素。