web-dev-qa-db-ja.com

sklearnのCountVectorizerの `ngram_range`引数を理解する

Pythonのscikit-learnライブラリでngramを使用する方法、特にngram_range引数はCountVectorizerで機能します。

このコードの実行:

from sklearn.feature_extraction.text import CountVectorizer
vocabulary = ['hi ', 'bye', 'run away']
cv = CountVectorizer(vocabulary=vocabulary, ngram_range=(1, 2))
print cv.vocabulary_

私に与えます:

{'hi ': 0, 'bye': 1, 'run away': 2}

次のように、私はユニグラムとバイグラムを取得するだろうという(明らかに間違いのある)印象の下にいました。

{'hi ': 0, 'bye': 1, 'run away': 2, 'run': 3, 'away': 4}

私はここでドキュメントを扱っています: http://scikit-learn.org/stable/modules/feature_extraction.html

明らかに、ngramの使用方法に関する私の理解には、ひどく間違った何かがあります。おそらく議論は効果がないか、実際のバイグラムとは何か概念的な問題があります!私は困惑しています。誰かが私の言葉を投げかけるアドバイスの言葉を持っているなら、私は感謝するでしょう。

UPDATE:
自分のやり方の愚かさを実感しました。私はngram_rangeは、コーパスではなく、語彙に影響します。

24
Matt O'Brien

vocabularyを明示的に設定すると、データから語彙が学習されません。設定しない場合は、次のようになります:

>>> v = CountVectorizer(ngram_range=(1, 2))
>>> pprint(v.fit(["an Apple a day keeps the doctor away"]).vocabulary_)
{u'an': 0,
 u'an Apple': 1,
 u'Apple': 2,
 u'Apple day': 3,
 u'away': 4,
 u'day': 5,
 u'day keeps': 6,
 u'doctor': 7,
 u'doctor away': 8,
 u'keeps': 9,
 u'keeps the': 10,
 u'the': 11,
 u'the doctor': 12}

明示的な語彙は、テキストから抽出される用語を制限します。語彙は変更されません。

>>> v = CountVectorizer(ngram_range=(1, 2), vocabulary={"keeps", "keeps the"})
>>> v.fit_transform(["an Apple a day keeps the doctor away"]).toarray()
array([[1, 1]])  # unigram and bigram found

(ストップワードフィルタリングはn-gram抽出の前に適用されるため、"Apple day"。)

27
Fred Foo