日安,
我一直在研究NLP,并偶然发现了用于顶级n克提取的代码:
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_words0,idx) for word,idx in vec.vocabulary_.items()]
我确实理解它的成就,但我不明白的是它是如何实现的。为什么简单地从vec.vocabulary_.items()中提取idx会给出错误的计数?矩阵sum_words持有什么?这些价值观是什么?谢谢。
发布于 2022-06-02 09:54:18
bag_of_words是通常的二维文档- ngram频率矩阵,即它包含任意文档的频率(corpus可能包含任意数量的documents).sum_words ),得到每个is跨文档的频率之和。它是一个一维数组。长度是词汇表的大小,索引与bag_of_words中的顺序相同。当然,它本身并不包含ngram。--由于我们的目标是获得最频繁的频域,所以我们需要匹配sum_words中的每一个频域。这就是为什么词汇表(包含ngram )与ngram和索引一起迭代的原因:如果只获得索引idx,就无法知道它所代表的实际ngram。当然,该指标用于获得sum_words中的总频率。因此,words_freq是一个数组,包含对(n克,频率)对每一个is。
最后两行通过降低频率对这个数组进行排序,并提取顶部的n元素。
https://stackoverflow.com/questions/72471671
复制相似问题