it-swarm.com.de

Wie soll der TFIDFVectorizer in scikit-learn funktionieren?

Ich versuche, Wörter zu finden, die bestimmte Dokumente mit der Klasse TfIDFVectorizer in scikit-learn unterscheiden. Es erstellt eine tfidf-Matrix mit allen Wörtern und ihren Bewertungen in allen Dokumenten, scheint jedoch auch häufige Wörter zu zählen. Dies ist ein Teil des Codes, den ich verwende: 

vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(contents)
feature_names = vectorizer.get_feature_names()
dense = tfidf_matrix.todense()
denselist = dense.tolist()
df = pd.DataFrame(denselist, columns=feature_names, index=characters)
s = pd.Series(df.loc['Adam'])
s[s > 0].sort_values(ascending=False)[:10]

Ich habe erwartet, dass dies eine Liste mit markanten Wörtern für das Dokument 'Adam' zurückgibt, aber was es bewirkt, liefert eine Liste mit gebräuchlichen Wörtern: 

and     0.497077
to      0.387147
the     0.316648
of      0.298724
in      0.186404
with    0.144583
his     0.140998

Ich verstehe es vielleicht nicht perfekt, aber so wie ich es verstehe, soll tf-idf Wörter finden, die sich von einem Dokument in einem Korpus unterscheiden, und Wörter finden, die häufig in einem Dokument erscheinen, aber nicht in anderen Dokumenten. Hier wird and häufig in anderen Dokumenten angezeigt, daher weiß ich nicht, warum es hier einen hohen Wert liefert. 

Der vollständige Code, den ich verwende, um dies zu generieren, ist in diesem Jupyter-Notebook

Wenn ich tf/idfs halbmanuell mit dem NLTK und den Berechnungsergebnissen für jedes Word berechne, erhalte ich die entsprechenden Ergebnisse. Für das "Adam" -Dokument: 

fresh        0.000813
prime        0.000813
bone         0.000677
relate       0.000677
blame        0.000677
enough       0.000677

Das sieht ungefähr richtig aus, da dies Wörter sind, die im "Adam" -Dokument erscheinen, aber nicht so sehr in anderen Dokumenten im Korpus. Der vollständige Code für die Generierung dieses Codes ist in diesem Jupyter-Notebook

Mache ich etwas falsch mit dem Scikit-Code? Gibt es eine andere Möglichkeit, diese Klasse zu initialisieren, wenn sie die richtigen Ergebnisse liefert? Natürlich kann ich Stoppwörter ignorieren, indem ich stop_words = 'english' übergeben, aber das löst das Problem nicht wirklich, da gebräuchliche Wörter jeglicher Art hier keine hohen Bewertungen aufweisen sollten. 

17
Jonathan

Aus der Scikit-Learn-Dokumentation:

Da tf-idf sehr häufig für Text-Features verwendet wird, gibt es eine weitere Klasse namens TfidfVectorizer, die alle Optionen von CountVectorizer und TfidfTransformer in einem einzigen Modell kombiniert.

Wie Sie sehen, ist TfidfVectorizer ein CountVectorizer , gefolgt von TfidfTransformer .

Was Sie wahrscheinlich suchen, ist TfidfTransformer und nicht TfidfVectorizer

4
Sagar Waghmode

Ich glaube, Ihr Problem liegt in der Verwendung verschiedener Stoppwortlisten. Scikit-learn und NLTK verwenden standardmäßig verschiedene Stoppwortlisten. Für Scikit-Learn ist es normalerweise eine gute Idee, eine benutzerdefinierte stop_words-Liste an TfidfVectorizer übergeben zu lassen, z.

my_stopword_list = ['and','to','the','of']
my_vectorizer = TfidfVectorizer(stop_words=my_stopword_list)

Dokumentseite für die TfidfVectorizer-Klasse: [ http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html ?[1]

4
Rabbit

Ich bin nicht sicher, warum es nicht die Standardeinstellung ist, aber Sie möchten wahrscheinlich sublinear_tf=True in der Initialisierung für TfidfVectorizer. Ich habe Ihr Repo gegabelt und Ihnen eine PR mit einem Beispiel geschickt, das wahrscheinlich eher dem entspricht, was Sie wollen.

2
Randy

mit dem folgenden Code bekomme ich viel bessere Ergebnisse

vectorizer = TfidfVectorizer(sublinear_tf=True, stop_words='english')

Ausgabe

sustain    0.045090
bone       0.045090
thou       0.044417
thee       0.043673
timely     0.043269
thy        0.042731
prime      0.041628
absence    0.041234
rib        0.041234
feel       0.040259
Name: Adam, dtype: float64

und

thee          0.071188
thy           0.070549
forbids       0.069358
thou          0.068068
early         0.064642
earliest      0.062229
dreamed       0.062229
firmness      0.062229
glistering    0.062229
sweet         0.060770
Name: Eve, dtype: float64
0
realmq