web-dev-qa-db-ja.com

scikit CountVectorizerのmin_dfおよびmax_dfを理解する

CountVectorizerに入力する5つのテキストファイルがあります。 min_dfおよびmax_dfをCountVectorizerインスタンスに指定する場合、最小/最大ドキュメント頻度は正確に何を意味しますか?特定のテキストファイルでのWordの頻度ですか、それともコーパス全体(5つのtxtファイル)でのWordの頻度ですか?

Min_dfとmax_dfが整数またはフロートとして提供される場合、どのように違いますか?

このドキュメントは、完全な説明を提供していないようであり、min_dfやmax_dfの使用方法を示すサンプルも提供していません。誰かがmin_dfまたはmax_dfを示す説明または例を提供できますか。

54
moeabdol

max_dfは、「コーパス固有のストップワード」とも呼ばれるあまりにも頻繁にと表示される用語を削除するために使用されます。例えば:

  • max_df = 0.50は、「ドキュメントの50%以上」にある用語を無視することを意味します。
  • max_df = 25は、「25を超えるドキュメント」に現れる用語を無視することを意味します。

デフォルト max_df1.0は、「ドキュメントの100%以上」に現れる用語を無視することを意味します。したがって、デフォルト設定では用語は無視されません。


min_dfは、出現する用語を削除するために使用されますあまり頻繁ではありません。例えば:

  • min_df = 0.01は、「ドキュメントの1%未満」に現れる用語を無視することを意味します。
  • min_df = 5は、「5文書未満」に現れる用語を無視することを意味します。

デフォルト min_df1は、「1ドキュメント未満」にある用語を無視することを意味します。したがって、デフォルト設定では用語は無視されません。

153
Kevin Markham

CountVectorizerドキュメント here に従って。

[0.0, 1.0]の範囲でフロートを使用する場合、document頻度を参照します。これは、その用語を含むドキュメントの割合です。

Intを使用する場合、この用語を保持するドキュメントの絶対数を指します。

5つのテキストファイル(またはドキュメント)がある例を考えてみましょう。 max_df = 0.6を設定すると、0.6*5=3ドキュメントに変換されます。 max_df = 2を設定すると、単純に2つのドキュメントに変換されます。

以下のソースコードの例は、Github here からコピーされ、max_doc_countmax_dfからどのように構成されるかを示しています。 min_dfのコードは似ており、GHページにあります。

max_doc_count = (max_df
                 if isinstance(max_df, numbers.Integral)
                 else max_df * n_doc)

min_dfmax_dfのデフォルトは、それぞれ1と1.0です。これは基本的に「私の用語が1つのドキュメントのみで見つかった場合、無視されます。同様に、すべてのドキュメント(100%または1.0)で見つかった場合、無視されます。」

max_dfmin_dfは両方とも、用語を見つける必要があるドキュメントの最大数と最小数であるmax_doc_countmin_doc_countを計算するために内部的に使用されます。 self._limit_features キーワード引数としてhighおよびlowとして、self._limit_featuresのdocstringは

"""Remove too rare or too common features.

Prune features that are non zero in more samples than high or less
documents than low, modifying the vocabulary, and restricting it to
at most the limit most frequent.

This does not Prune samples with zero features.
"""
11
Ffisegydd

Min_dfおよびmax_dfのデフォルトは、それぞれ1および1.0です。これらのデフォルトは実際には何もしません。

そうは言っても、@ Ffisegyddの回答で現在受け入れられている答えはまったく正しくないと思います。

たとえば、デフォルトを使用してこれを実行すると、min_df=1およびmax_df=1.0、その後

1)少なくとも1つのドキュメントに表示されるすべてのトークンが使用されます(たとえば、すべてのトークン!)

2)すべてのドキュメントに表示されるすべてのトークンが使用されます(どこでも1つの候補でテストします)。

cv = CountVectorizer(min_df=1, max_df=1.0, lowercase=True) 
# here is just a simple list of 3 documents.
corpus = ['one two three everywhere', 'four five six everywhere', 'seven eight nine everywhere']
# below we call fit_transform on the corpus and get the feature names.
X = cv.fit_transform(corpus)
vocab = cv.get_feature_names()
print vocab
print X.toarray()
print cv.stop_words_

我々が得る:

[u'eight', u'everywhere', u'five', u'four', u'nine', u'one', u'seven', u'six', u'three', u'two']
[[0 1 0 0 0 1 0 0 1 1]
 [0 1 1 1 0 0 0 1 0 0]
 [1 1 0 0 1 0 1 0 0 0]]
set([])

すべてのトークンが保持されます。ストップワードはありません。

引数をさらにいじると、他の構成が明確になります。

楽しさと洞察のために、stop_words = 'english'そして、それを見て、奇妙なことに、「7」以外のすべての単語が削除されます! 「どこでも」を含む。

3
Monica Heddneck

Tf-idfのmin_dfおよびmax_dfをよりよく理解するためにも、この点を追加します。

すべての用語を考慮することを意味するデフォルト値を使用すると、間違いなくより多くのトークンが生成されます。そのため、クラスタリングプロセス(またはこれらの用語を後で使用する他の処理)には時間がかかります。

ただし、クラスタリングの品質は低下しません。

すべての用語(例:頻出する用語やストップワード)の存在を許可すると、品質は低下しますが、tf-idfではそうではないと考えるかもしれません。 tf-idfの測定はこれらの用語に本能的に低いスコアを与えるため、効果的に(多くの文書に見られるように)影響を与えないためです。

要約すると、min_dfおよびmax_dfを介して用語を整理することは、クラスターの品質ではなくパフォーマンスを向上させることです(例として)。

重要な点は、minmaxを誤って設定すると、いくつかの重要な用語が失われ、品質が低下することです。したがって、適切なしきい値が不明な場合(ドキュメントセットによって異なります)、またはマシンの処理能力について確信がある場合は、minmaxパラメーターを変更しないでください。

2