我需要从文本中获取最流行的ngram。Ngram长度必须介于1到5个单词之间。
我知道如何得到二元模型和三元模型。例如:
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可以得到不同长度的ngram。例如,我可以得到长度从1到5的ngram。
v = CountVectorizer(analyzer=WordNGramAnalyzer(min_n=1, max_n=5))
但WordNGramAnalyzer现在已被弃用。我的问题是:我如何从我的文本中获得N个最佳的单词搭配,搭配长度从1到5。我还需要获得这个搭配/ngram的FreqList。
我能用nltk/scikit做到这一点吗?我需要从一个文本中获得不同长度的ngram组合?
例如,使用NLTK二元和三元语法,其中许多情况下我的三元语法包括我的位图,或者我的三元语法是更大的四元语法的一部分。例如:
你好我的三元组:你好我的名字
我知道如何从三元语法中排除二元语法,但我需要更好的解决方案。
发布于 2012-08-02 03:18:18
更新
从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
这样的东西,但这有时会有它自己的复杂性,比如初始化一个Doc,它目前在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 Learn0.11以来,WordNGramAnalyzer
确实已被弃用。创建n-gram和获取词频现在在sklearn.feature_extraction.text.CountVectorizer中组合在一起。您可以创建范围从1到5的所有n元语法,如下所示:
n_grams = CountVectorizer(min_n=1, max_n=5)
更多的例子和信息可以在scikit learn关于text feature extraction的文档中找到。
发布于 2012-08-07 03:21:20
如果您想生成原始的ngram(也许可以自己计算它们),也可以使用nltk.util.ngrams(sequence, n)
。它将为任何n值生成一个ngram序列。它具有填充选项,请参阅文档。
发布于 2013-11-27 01:55:19
看看http://nltk.org/_modules/nltk/util.html,我认为在幕后,nltk.util.bigrams()和nltk.util.trigrams()是使用nltk.util.ngrams()实现的。
https://stackoverflow.com/questions/11763613
复制相似问题