web-dev-qa-db-ja.com

Python頻度のあるNgramのリスト

最も人気のある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グラムの一部である場合などです。例えば:

ビットグラム:こんにちは私のトリグラム:こんにちは私の名前

トリグラムからバイグラムを除外する方法は知っていますが、より良い解決策が必要です。

16
artyomboyko

更新

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のドキュメントにあります。

18
Sicco

生のngramを生成したい(そしておそらく自分で数えたい)場合は、nltk.util.ngrams(sequence, n)もあります。 nの任意の値に対して一連のngramを生成します。パディングのオプションがあります。ドキュメントを参照してください。

7
alexis

http://nltk.org/_modules/nltk/util.html 内部では、nltk.util.bigrams()とnltk.util.trigrams()はnltk.utilを使用して実装されていると思います。 .ngrams()

4
AlgebraWinter