最常见的 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
个元素。
美好的一天,
我一直在研究 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
个元素。