Grundlegendes zu min_df und max_df in scikit CountVectorizer

76

Ich habe fünf Textdateien, die ich in einen CountVectorizer eingebe. Was bedeutet die minimale / maximale Dokumenthäufigkeit genau, wenn Sie der CountVectorizer-Instanz min_df und max_df angeben? Ist es die Häufigkeit eines Wortes in seiner bestimmten Textdatei oder ist es die Häufigkeit des Wortes im gesamten Gesamtkorpus (5 txt-Dateien)?

Wie unterscheidet es sich, wenn min_df und max_df als Ganzzahlen oder als Gleitkommazahlen bereitgestellt werden?

Die Dokumentation scheint weder eine gründliche Erklärung noch ein Beispiel für die Verwendung von min_df und / oder max_df zu liefern. Könnte jemand eine Erklärung oder ein Beispiel geben, das min_df oder max_df demonstriert.

Moeabdol
quelle

Antworten:

217

max_dfwird zum Entfernen von Begriffen verwendet, die zu häufig vorkommen und auch als "korpusspezifische Stoppwörter" bezeichnet werden. Zum Beispiel:

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

Die Standardeinstellung max_dflautet 1.0"Begriffe ignorieren, die in mehr als 100% der Dokumente vorkommen ". Daher ignoriert die Standardeinstellung keine Begriffe.


min_dfwird zum Entfernen von Begriffen verwendet, die zu selten vorkommen . Zum Beispiel:

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

Die Standardeinstellung min_dfist 1"Begriffe ignorieren, die in weniger als einem Dokument enthalten sind ". Daher ignoriert die Standardeinstellung keine Begriffe.

Kevin Markham
quelle
11

Gemäß der CountVectorizerDokumentation hier .

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

Bei Verwendung eines int bezieht sich dies auf die absolute Anzahl von Dokumenten, die diesen Begriff enthalten.

Betrachten Sie das Beispiel, in dem Sie 5 Textdateien (oder Dokumente) haben. Wenn Sie festlegen max_df = 0.6, wird dies in 0.6*5=3Dokumente übersetzt . Wenn Sie festlegen max_df = 2, wird dies einfach in 2 Dokumente übersetzt.

Das folgende Quellcodebeispiel wurde hier von Github kopiert und zeigt, wie das max_doc_countaus dem aufgebaut ist max_df. Der Code für min_dfist ähnlich und befindet sich auf der GH-Seite.

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

Die Standardeinstellungen für min_dfund max_dfsind 1 bzw. 1,0. Im Grunde heißt es: "Wenn mein Begriff nur in einem Dokument gefunden wird, wird er ignoriert. Wenn er in allen Dokumenten (100% oder 1.0) gefunden wird, wird er ebenfalls ignoriert."

max_dfund min_dfwerden verwendet , um sowohl intern zu berechnen max_doc_countund min_doc_countdie maximale und minimale Anzahl von Dokumenten , dass ein Begriff muss gefunden werden. Diese wird dann übergeben , self._limit_featureswie die Keyword - Argumente highund lowjeweils die docstring für self._limit_featuresIST

"""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.
"""
Ffisegydd
quelle
6
Das ist verwirrend. In der Dokumentation zu min_dfheißt es: "Begriffe ignorieren, deren Dokumenthäufigkeit strikt unter dem angegebenen Schwellenwert liegt." Eine Frequenz, die streng niedriger als die Standardeinstellung von 1 ist, würde bedeuten, Begriffe zu ignorieren, die niemals erscheinen (!), Aber Begriffe beizubehalten, die einmal erscheinen.
Monica Heddneck
1
@MonicaHeddneck ist korrekt. Diese Antwort interpretiert die genauen Bedeutungen von min_dfund falsch max_df. Ich habe eine Antwort hinzugefügt, die genau erklärt, wie diese Parameter von CountVectorizer interpretiert werden.
Kevin Markham
Ja, diese Antwort ist etwas falsch, wie @MonicaHeddneck und Kevin betonten, sowohl für min_df als auch für max_df
jeremy_rutman
10

Ich würde diesen Punkt auch zum Verständnis min_dfund max_dfin tf-idf besser hinzufügen.

Wenn Sie die Standardwerte verwenden, dh alle Begriffe berücksichtigen, haben Sie definitiv mehr Token generiert. Daher dauert Ihr Clustering-Prozess (oder alles andere, was Sie später mit diesen Begriffen tun möchten) länger.

ABER die Qualität Ihres Clusters sollte NICHT verringert werden.

Man könnte denken, dass das Vorhandensein aller Begriffe (z. B. zu häufige Begriffe oder Stoppwörter) die Qualität beeinträchtigen könnte, in tf-idf jedoch nicht. Weil die tf-idf-Messung diesen Begriffen instinktiv eine niedrige Punktzahl verleiht, wodurch sie effektiv keinen Einfluss haben (wie sie in vielen Dokumenten vorkommen).

Zusammenfassend lässt sich sagen, dass das Beschneiden der Begriffe über min_dfund max_dfdie Leistung verbessert und nicht die Qualität von Clustern (als Beispiel).

Und der entscheidende Punkt ist , dass wenn Sie den Satz minund maxfälschlicherweise, würden Sie einige wichtige Begriffe verlieren und damit die Qualität senken. Also , wenn Sie sich nicht sicher über die richtige Schwelle sind (es hängt von Ihren Dokumenten gesetzt), oder wenn Sie sicher sind , über Ihre Maschine Verarbeitungsfähigkeiten verlassen die min, maxParameter unverändert.

Amirabbas Askary
quelle
1
Vielen Dank - das ist die gleiche Schlussfolgerung, zu der ich unabhängig gekommen bin.
Isopycnal Oscillation
4

Die Standardeinstellungen für min_df und max_df sind 1 bzw. 1,0. Diese Standardeinstellungen bewirken überhaupt nichts.

Abgesehen davon glaube ich, dass die derzeit akzeptierte Antwort von @Ffisegydd nicht ganz richtig ist.

Führen Sie dies beispielsweise mit den Standardeinstellungen aus, um zu sehen, wann min_df=1und max_df=1.0dann

1) Alle Token, die in mindestens einem Dokument enthalten sind, werden verwendet (z. B. alle Token!).

2) Alle Token, die in allen Dokumenten enthalten sind, 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 bekommen:

[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 werden aufbewahrt. Es gibt keine Stoppwörter.

Weiteres Herumspielen mit den Argumenten verdeutlicht andere Konfigurationen.

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

Monica Heddneck
quelle
1

Das Ziel von MIN_DFist es, Wörter zu ignorieren, die nur sehr wenige Vorkommen haben, um als sinnvoll angesehen zu werden. In Ihrem Text können beispielsweise Namen von Personen enthalten sein, die möglicherweise nur in einem oder zwei Dokumenten enthalten sind. In einigen Anwendungen kann dies als Rauschen gelten und aus der weiteren Analyse ausgeschlossen werden. Ebenso können Sie Wörter ignorieren, die zu häufig vorkommenMAX_DF .

Anstatt eine minimale / maximale Termhäufigkeit (Gesamt Vorkommen eines Wortes) mit Worten zu beseitigen, MIN_DFund MAX_DFsehen , wie viele Dokumente einen Begriff enthalten ist , besser als Dokumenthäufigkeit bekannt. Die Schwellenwerte können ein absoluter Wert (z. B. 1, 2, 3, 4) oder ein Wert sein, der den Anteil der Dokumente darstellt (z. B. 0,25, dh Wörter ignorieren, die in 25% der Dokumente enthalten sind).

Hier finden Sie einige Anwendungsbeispiele .

Dolly
quelle