最も人気のある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は非推奨になりました。私の質問は次のとおりです:コロケーションの長さが1から5のN個の最良のWordコロケーションをテキストから取得するにはどうすればよいですか?また、このコロケーション/ ngramのFreqListを取得する必要があります。
Nltk/scikitでそれを行うことはできますか? 1つのテキストからさまざまな長さのngramの組み合わせを取得する必要がありますか?
たとえば、NLTKバイグラムとトリグラムを使用します。トリグラムにビットグラムが含まれている場合や、トリグラムがより大きな4グラムの一部である場合などです。例えば:
ビットグラム:こんにちは私のトリグラム:こんにちは私の名前
トリグラムからバイグラムを除外する方法は知っていますが、より良い解決策が必要です。
更新
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)
これは次のように出力します(Word 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では機能しない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)
古い答え
WordNGramAnalyzer
は、scikit-learn 0.11以降、実際に非推奨になっています。 n-gramの作成と用語頻度の取得は、 sklearn.feature_extraction.text.CountVectorizer で結合されるようになりました。次のように、1から5までのすべてのn-gramを作成できます。
n_grams = CountVectorizer(min_n=1, max_n=5)
その他の例と情報は、 テキスト特徴抽出 に関するscikit-learnのドキュメントにあります。
生のngramを生成したい(そしておそらく自分で数えたい)場合は、nltk.util.ngrams(sequence, n)
もあります。 nの任意の値に対して一連のngramを生成します。パディングのオプションがあります。ドキュメントを参照してください。
http://nltk.org/_modules/nltk/util.html 内部では、nltk.util.bigrams()とnltk.util.trigrams()はnltk.utilを使用して実装されていると思います。 .ngrams()