2012-08-01 44 views
13

我需要從文本中獲得最受歡迎的ngrams。 Ngrams長度必須從1到5個單詞。Python與Ngrams的頻率列表

我知道如何獲得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可以得到不同長度的ngram。例如,我可以得到ngram,長度從1到5.

v = CountVectorizer(analyzer=WordNGramAnalyzer(min_n=1, max_n=5)) 

但是WordNGramAnalyzer現在已被棄用。我的問題是:如何從我的文本中獲得N個最佳單詞搭配,搭配長度從1到5.還需要獲取此搭配/ ngrams的FreqList。

我可以用nltk/scikit嗎?我需要從一個文本中獲得各種長度的ngrams組合?

例如使用NLTK bigrams和trigrams,其中我的卦包括我的位圖或我的卦在很多情況下都是大4克的一部分。例如:

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

我知道如何從卦排除二元語法,但我需要更好的解決方案。

回答

12

更新

由於scikit學習0.14格式已更改爲:

n_grams = CountVectorizer(ngram_range=(1, 5)) 

老答案

WordNGramAnalyzer確實過時了,因爲scikit學習0.11。創建n-gram並獲取術語頻率現在合併在sklearn.feature_extraction.text.CountVectorizer中。您可以創建全部N-gram從1至5如下:

n_grams = CountVectorizer(min_n=1, max_n=5) 

更多的例子和信息可以scikit學習的約text feature extraction文檔中找到。

+3

如果你不想TF-IDF正常化實施只需使用:'CountVectorizer(min_n = 1,max_n = 5).fit_transform(list_of_strings)'。 – ogrisel 2012-08-01 21:23:35

+0

但接下來我該做什麼?我如何獲得ngram頻率? – twoface88 2012-08-02 06:05:11

+3

@ twoface88:'v = CountVectorizer(min_n = 1,max_n = 5); X = v.fit_transform([「一天一蘋果讓醫生遠離」]); zip(v.inverse_transform(X)[0],X.A [0])'。請注意,停用詞和單字符標記將在默認情況下被刪除。 – 2012-08-02 08:53:13

7

如果你想生成原始數據記錄(也可以自己計算它們),還有nltk.util.ngrams(sequence, n)。它將生成一個ngram序列,用於任何值n。它有填充選項,請參閱文檔。在http://nltk.org/_modules/nltk/util.html

3

尋找我覺得引擎蓋下nltk.util.bigrams()和nltk.util.trigrams()使用nltk.util.ngrams()