Für TF-IDF Merkmalsextraktion, hat Scikit-Learn 2 Klassen TfidfTransformer
und TfidfVectorizer
. Beide Klassen dienen im Wesentlichen demselben Zweck, sollen aber anders verwendet werden. Für Textmerkmalsextraktion, Scikit-Learn hat den Begriff der Transformers und Vectorizers. Die Vectorizer arbeiten direkt am Rohtext, um die Features zu generieren, während der Transformer an vorhandenen Features arbeitet und diese in die neuen Features transformiert. Durch diese Analogie funktioniert TfidfTransformer
funktioniert auf die vorhandenen Term-Frequency Funktionen und konvertiert sie zu TF-IDF-Features, während die TfidfVectorizer
als Eingabe der rohen Text und direkt die TF-IDF-Funktionen generiert. Sie sollten immer die TfidfVectorizer
, wenn zum Zeitpunkt der Funktion verwenden Sie bauen keine bestehende Dokument-Term-Matrix haben. Bei einem Black-Box-Level sollte man an die TfidfVectorizer
als CountVectorizer
denken, gefolgt von einem TfidfTransformer
.
kommen nun zu dem Arbeitsbeispiel eines Tfidfectorizer
. Beachten Sie, dass, wenn dieses Beispiel klar ist, Sie das Beispiel für TfidfTransformer
verstehen werden.
Nun betrachten Sie die folgenden vier Dokumente in Ihrem Korpus haben:
text = [
'jack and jill went up the hill',
'to fetch a pail of water',
'jack fell down and broke his crown',
'and jill came tumbling after'
]
Sie jede iterable
verwenden können, solange sie Strings iteriert. Die TfidfVectorizer
unterstützt auch das Lesen von Texten aus Dateien, über die sie in den Dokumenten ausführlich gesprochen haben. Jetzt können wir im einfachsten Fall ein TfidfVectorizer
Objekt initialisieren und unsere Trainingsdaten darauf anpassen. Dies geschieht wie folgt:
tfidf = TfidfVectorizer()
train_features = tfidf.fit_transform(text)
train_features.shape
Dieser Code einfach fits
die Vectorizer auf unseren Eingangsdaten und erzeugt eine Sparse-Matrix der Dimensionen 4 x 20
. Daher transformiert es jedes Dokument in dem gegebenen Text in einen Vektor von 20
Merkmalen, wobei die Größe des Vokabulars 20
ist.
Im Fall von TfidfVectorizer
, wenn wir fit the model
sagen, bedeutet dies, dass die TfidfVectorizer
die IDF-Gewichte aus dem Korpus lernt. 'Transformieren der Daten' bedeutet, das angepasste Modell (gelernte IDF-Gewichte) zu verwenden, um die Dokumente in TF-IDF-Vektoren umzuwandeln. Diese Terminologie ist bei scikit-learn Standard. Es ist sehr nützlich im Falle von Klassifizierungsproblemen. Berücksichtigen Sie, ob Dokumente anhand von gekennzeichneten Trainingsdaten mit TF-IDF-Vektoren als Merkmale als positiv oder negativ klassifiziert werden sollen. In diesem Fall werden Sie Ihren TF-IDF vectorizer mit Ihren Trainingsdaten aufzubauen und wenn Sie neue Testdokumente zu sehen, werden Sie einfach verwandeln sie mit dem bereits TfidfVectorizer
ausgestattet.
Also, wenn wir die folgende test_txt
hatte:
test_text = [
'jack fetch water',
'jill fell down the hill'
]
würden wir Prüfmerkmale bauen, indem Sie einfach
test_data = tfidf.transform(test_text)
tun Dies wird uns wieder geben eine spärliche Matrix aus 2 x 20
. Die in diesem Fall verwendeten IDF-Gewichte waren diejenigen, die aus den Trainingsdaten gelernt wurden.
So funktioniert ein einfacher TfidfVectorizer
. Sie können es komplizierter machen, indem Sie mehr Parameter im Konstruktor übergeben. Diese sind im Scikit-Learn docs sehr gut dokumentiert. Einige der Parameter, die ich häufig verwende, sind:
ngram_range
- Dies ermöglicht uns, TF-IDF-Vektoren mit n-Gramm-Token zu erstellen. Zum Beispiel, wenn ich (1,2)
überlasse, dann wird dies sowohl Unigramme als auch Bigramme erstellen.
stop_words
- Erlaubt uns, stopwords getrennt zu geben, um in dem Prozess zu ignorieren. Es ist üblich, Wörter wie "das", "usw." auszufiltern, die in fast allen Dokumenten vorhanden sind.
min_df
und max_df
- Dies ermöglicht uns, das Vokabular basierend auf der Häufigkeit der Dokumente dynamisch zu filtern. Wenn Sie beispielsweise eine max_df
von 0.7
angeben, kann ich von meiner Anwendung automatisch domänenspezifische Stoppwörter entfernen lassen. Zum Beispiel kann in einem Korpus von medizinischen Zeitschriften das Wort Krankheit als ein Stoppwort gedacht werden.
Darüber hinaus können Sie sich auch auf eine sample code beziehen, die ich für ein Projekt geschrieben hatte. Es ist zwar nicht gut dokumentiert, aber die Funktionen sind sehr gut benannt.
Hoffe, das hilft!
Hallo Lin, [Dies] (https://gist.github.com/abhinavarora/2045f7217da618e096d013810ff64ee9) ist ein Stück Code, den ich für ein Projekt geschrieben hatte. Es ist zwar nicht gut dokumentiert, aber die Funktionen sind sehr gut benannt. Vielleicht kannst du es dir anschauen. –
Sehr schön @AbhinavArora, stimmen auf. Schnelle Frage2, 1. Wie sieht dein Korpus aus? Wenn es ein Texteingabe Beispiel gibt, wird es groß sein. für mich zu laufen, ohne Verbindung zur DB, 2. wie Training/Tests in Bezug auf TD/IDF? Ich denke, TD/IDF ist nur eine Eigenschaft des Begriffs in einem bestimmten Korpus, sollte nicht im Zusammenhang mit Training/Tests stehen. –
BTW, warum nicht eine Antwort schreiben, ich werde es als Antwort markieren, um andere Menschen auch zu profitieren. :) –