Python有频率的Ngrams列表

two*_*e88 16 python nltk scikit-learn

我需要从文本中获取最流行的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)
Run Code Online (Sandbox Code Playgroud)

但是,我发现scikit-learn可以得到各种长度的ngrams.例如,我可以获得长度为1到5的ngrams.

v = CountVectorizer(analyzer=WordNGramAnalyzer(min_n=1, max_n=5))
Run Code Online (Sandbox Code Playgroud)

但WordNGramAnalyzer现已弃用.我的问题是:如何从我的文本中获得N个最佳单词搭配,搭配长度从1到5.此外,我需要得到此搭配/ ngrams的FreqList.

我能用nltk/scikit做到吗?我需要从一个文本中获得各种长度的ngrams组合?

例如,使用NLTK双字母组和三元组,其中我的三元组包括我的位图的许多情况,或者我的三元组是更大的4克的一部分.例如:

bitgrams:你好我的 八卦:你好我的名字

我知道如何从三元组中排除bigrams,但我需要更好的解决方案.

Sic*_*cco 18

更新

由于scikit-learn 0.14格式已更改为:

n_grams = CountVectorizer(ngram_range=(1, 5))
Run Code Online (Sandbox Code Playgroud)

完整示例:

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)
Run Code Online (Sandbox Code Playgroud)

输出以下内容(注意该单词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')
...
Run Code Online (Sandbox Code Playgroud)

这些天应该/可能更简单,imo.你可以尝试类似的东西textacy,但有时可能会出现它自身的复杂情况,比如初始化一个Doc,它目前在v.0.6.2中不能正常运行,如文档所示.如果doc初始化按照承诺工作,理论上下面的方法可行(但它没有):

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)
Run Code Online (Sandbox Code Playgroud)

老答案

WordNGramAnalyzer自从scikit-learn 0.11以来,确实被弃用了.现在,在sklearn.feature_extraction.text.CountVectorizer中组合创建n-gram并获得术语频率.您可以创建1到5之间的所有n-gram,如下所示:

n_grams = CountVectorizer(min_n=1, max_n=5)
Run Code Online (Sandbox Code Playgroud)

更多示例和信息可以在scikit-learn的文档特征提取文档中找到.

  • 对于`CountVectorizer`"DeprecationWarning:不推荐使用参数max_n和min_n.请改用ngram_range.这将在0.14"中删除.所以,`CountVectorizer(ngram_range =(1,5))` (4认同)
  • 如果你不想要TF-IDF规范化,只需使用:`CountVectorizer(min_n = 1,max_n = 5).fit_transform(list_of_strings)`. (3认同)
  • @ twoface88:`v = CountVectorizer(min_n = 1,max_n = 5); X = v.fit_transform(["每天一个苹果让医生离开"]); zip(v.inverse_transform(X)[0],XA [0])`.请注意,默认情况下将删除停用词和one-char标记. (3认同)

ale*_*xis 7

如果你想生成原始的ngrams(也许你自己计算它们),那么也是如此nltk.util.ngrams(sequence, n).它将为n的任何值生成一系列ngrams .它有填充选项,请参阅文档.