2014-12-29 6 views
15

Ich habe fünf Textdateien, die ich in einen CountVectorizer eingegeben habe. Wenn min_df und max_df für die CountVectorizer-Instanz angegeben werden, was genau bedeutet die min/max-Dokumenthäufigkeit? Ist es die Häufigkeit eines Wortes in der jeweiligen Textdatei oder ist es die Häufigkeit des Wortes im gesamten Korpus (5 txt-Dateien)?min_df und max_df in scikit verstehen CountVectorizer

Wie ist es anders, wenn min_df und max_df als Ganzzahlen oder als Gleitkommazahlen angegeben werden?

Die Dokumentation scheint weder eine gründliche Erklärung zu liefern, noch gibt sie ein Beispiel, um die Verwendung von min_df und/oder max_df zu demonstrieren. Kann jemand eine Erklärung oder ein Beispiel geben, um min_df oder max_df zu demonstrieren?

Antwort

63

max_df wird verwendet, um Begriffe zu entfernen, die erscheinen zu häufig, auch bekannt als "korpusspezifische Stoppwörter". Zum Beispiel:

  • max_df = 0.50 bedeutet "ignorieren Begriffe, die in mehr als 50% der Dokumente erscheinen".
  • max_df = 25 bedeutet "ignorieren Begriffe, die in mehr als 25 Dokumente erscheinen".

Der Standard max_df ist 1.0, das bedeutet "Begriffe ignorieren, die in mehr als 100% der Dokumente erscheinen". Daher ignoriert die Standardeinstellung keine Begriffe.


min_df zum Entfernen von Begriffen verwendet, die zu selten erscheinen. Zum Beispiel:

  • min_df = 0.01 bedeutet "ignorieren Begriffe, die in weniger als 1% der Dokumente erscheinen".
  • min_df = 5 bedeutet "ignorieren Begriffe, die in weniger als 5 Dokumente erscheinen".

Der Standard min_df1 ist, was bedeutet, "Bedingungen ignorieren, die inweniger als 1 angezeigt Dokument". Daher ignoriert die Standardeinstellung keine Begriffe.

11

Gemäß der CountVectorizer Dokumentation here.

Bei Verwendung eines Schwimmers im Bereich [0.0, 1.0] beziehen sie sich auf die Dokument Frequenz. Das ist der Prozentsatz der Dokumente, die den Begriff enthalten.

Wenn Sie ein int verwenden, bezieht sich das auf die absolute Anzahl von Dokumenten, die diesen Begriff enthalten.

Betrachten Sie das Beispiel, in dem Sie 5 Textdateien (oder Dokumente) haben. Wenn Sie max_df = 0.6 setzen, würde das zu 0.6*5=3 Dokumenten übersetzen. Wenn Sie max_df = 2 festlegen, dann würde das einfach in 2 Dokumente übersetzen.

Das folgende Quellcodebeispiel wurde von Github here kopiert und zeigt, wie der max_doc_count aus dem max_df aufgebaut ist. Der Code für min_df ist ähnlich und kann auf der GH-Seite gefunden werden.

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

die Standardeinstellungen für min_dfmax_df und sind 1 bzw. 1,0. Dies sagt im Grunde "Wenn mein Begriff in nur 1 Dokument gefunden wird, dann wird es ignoriert. Ebenso, wenn es in allen Dokumenten (100% oder 1.0) gefunden wird, wird es ignoriert."

max_df und min_df werden sowohl intern max_doc_count und min_doc_count, die maximale und minimale Anzahl von Dokumenten zu berechnen, die ein Begriff muss gefunden werden. Dies wird dann als Schlüsselwort-Argumente zu self._limit_features geben high und low jeweils die docstring für self._limit_features ist

"""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. 
""" 
+2

Das ist verwirrend. Die Dokumentation für "min_df" lautet: "Ignoriere Begriffe, die eine Dokumenthäufigkeit ** haben, die streng unter dem angegebenen Schwellenwert liegt." Eine Frequenz, die streng unter dem Standardwert von 1 liegt, würde bedeuten, Begriffe zu ignorieren, die nie erscheinen (!), Aber Begriffe, die einmal vorkommen. –

+0

@MonicaHeddneck ist korrekt. Diese Antwort interpretiert die genauen Bedeutungen von "min_df" und "max_df" falsch. Ich habe eine Antwort hinzugefügt, die genau erklärt, wie diese Parameter von CountVectorizer interpretiert werden. –

2

die Standardeinstellungen für min_df und max_df sind 1 bzw. 1,0. Diese Vorgaben machen überhaupt nichts.

Das gesagt, ich glaube, die derzeit akzeptierte Antwort von @Ffisegydd Antwort ist nicht ganz richtig.

Beispielsweise führen diese die Standardeinstellungen verwenden, um zu sehen, dass, wenn min_df=1 und max_df=1.0, dann

1) Alle Token, die in mindestens einem Dokument angezeigt werden verwendet (zB alle Token!)

2) alle Token, die in allen Dokumenten vorkommen, werden verwendet (wir testen mit einem Kandidaten: überall).

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_ 

Wir erhalten:

[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([]) 

Alle Token gehalten werden. Es gibt keine Stoppwörter.

Weitere Verwirrung mit den Argumenten wird andere Konfigurationen klären.

Für Spaß und Einsicht, würde ich auch empfehlen, mit stop_words = 'english' herumzuspielen und zu sehen, dass vor allem alle Wörter außer 'sieben' entfernt werden! Einschließlich `überall '.

0

Ich würde diesen Punkt auch für das Verständnis min_df und max_df in tf-IDF besser hinzufügen.

Wenn Sie mit den Standardwerten gehen, dh alle Begriffe berücksichtigen, haben Sie definitiv mehr Tokens generiert. Ihr Clustering-Prozess (oder etwas anderes, was Sie später mit diesen Begriffen machen wollen) wird länger dauern.

ABER die Qualität Ihrer Clustering sollte nicht reduziert werden.

Man könnte meinen, dass das Vorhandensein aller Begriffe (z. B. zu häufige Begriffe oder Stoppwörter) die Qualität verringern könnte, aber in tf-idf nicht. Weil die tf-IDF-Messung diesen Begriffen instinktiv eine niedrige Punktzahl gibt, was sie effektiv nicht beeinflusst (wie sie in vielen Dokumenten vorkommen).

Also, um es zusammenzufassen, die Begriffe über min_df und max_df zu beschneiden, ist die Leistung zu verbessern, nicht die Qualität der Cluster (als Beispiel).

Und der entscheidende Punkt ist, dass, wenn Sie die min und max fälschlicherweise setzen, würden Sie einige wichtige Begriffe verlieren und damit die Qualität senken. Wenn Sie sich also nicht sicher sind, welcher Schwellenwert richtig ist (abhängig von den eingestellten Dokumenten) oder wenn Sie sich über die Verarbeitungsfähigkeiten Ihrer Maschine sicher sind, lassen Sie die Parameter min, max unverändert.

Verwandte Themen