我需要从文本中获取最流行的ngrams。 Ngrams长度必须为1到5个字。
我知道如何获得bigrams和trigrams。例如:
bigram_measures = nltk.collocations.BigramAssocMeasures()
finder = nltk.collocations.BigramCollocationFinder.from_words(words)
finder.apply_freq_filter(3)
finder.apply_word_filter(filter_stops)
matches1 = finder.nbest(bigram_measures.pmi, 20)
然而,我发现scikit-learn可以得到各种长度的ngrams。例如,我可以获得长度为1到5的ngram。
v = CountVectorizer(analyzer=WordNGramAnalyzer(min_n=1, max_n=5))
但WordNGramAnalyzer现已弃用。我的问题是:如何从我的文本中获得N个最佳单词搭配,搭配长度从1到5.此外,我需要获得此搭配/ ngrams的FreqList。
我能用nltk / scikit做到吗?我需要从一个文本中获得各种长度的ngrams组合?
例如使用NLTK双字母组和三元组,其中我的三元组包括我的位图的许多情况,或者我的三元组是更大的4克的一部分。例如:
bitgrams:你好我的 trigrams:你好我的名字
我知道如何从三元组中排除bigrams,但我需要更好的解决方案。
答案 0 :(得分:17)
<强>更新强>
由于scikit-learn 0.14格式已更改为:
n_grams = CountVectorizer(ngram_range=(1, 5))
完整示例:
test_str1 = "I need to get most popular ngrams from text. Ngrams length must be from 1 to 5 words."
test_str2 = "I know how to exclude bigrams from trigrams, but i need better solutions."
from sklearn.feature_extraction.text import CountVectorizer
c_vec = CountVectorizer(ngram_range=(1, 5))
# input to fit_transform() should be an iterable with strings
ngrams = c_vec.fit_transform([test_str1, test_str2])
# needs to happen after fit_transform()
vocab = c_vec.vocabulary_
count_values = ngrams.toarray().sum(axis=0)
# output n-grams
for ng_count, ng_text in sorted([(count_values[i],k) for k,i in vocab.items()], reverse=True):
print(ng_count, ng_text)
输出以下内容(请注意,I
一词被删除不是因为它是一个停用词(它不是),而是因为它的长度:https://stackoverflow.com/a/20743758/):
> (3, u'to')
> (3, u'from')
> (2, u'ngrams')
> (2, u'need')
> (1, u'words')
> (1, u'trigrams but need better solutions')
> (1, u'trigrams but need better')
...
这些日子应该/可能更简单,imo。您可以尝试textacy
之类的内容,但有时会出现其自身的复杂情况,例如初始化文档,目前无法使用v.0.6.2 as shown on their docs。 If doc initialization worked as promised,理论上以下内容可行(但事实并非如此):
test_str1 = "I need to get most popular ngrams from text. Ngrams length must be from 1 to 5 words."
test_str2 = "I know how to exclude bigrams from trigrams, but i need better solutions."
import textacy
# some version of the following line
doc = textacy.Doc([test_str1, test_str2])
ngrams = doc.to_bag_of_terms(ngrams={1, 5}, as_strings=True)
print(ngrams)
旧回答
自从scikit-learn 0.11以来, WordNGramAnalyzer
确实被弃用了。创建n-gram并获得术语频率现在合并在sklearn.feature_extraction.text.CountVectorizer中。您可以创建所有n-gram,范围从1到5,如下所示:
n_grams = CountVectorizer(min_n=1, max_n=5)
有关text feature extraction的scikit-learn文档中可以找到更多示例和信息。
答案 1 :(得分:7)
如果你想生成原始ngrams(也许你自己计算),那么还有nltk.util.ngrams(sequence, n)
。它将为 n 的任何值生成一系列ngrams。它有填充选项,请参阅文档。
答案 2 :(得分:4)
关注http://nltk.org/_modules/nltk/util.html我认为引擎nltk.util.bigrams()和nltk.util.trigrams()是使用nltk.util.ngrams()
实现的。