2016-06-18 17 views
0

Gibt es ein komplettes Python 2.7-Beispiel darüber, wie man TfidfTransformer (http://scikit-learn.org/stable/modules/feature_extraction.html) benutzt, um TF/IDF für N-Gramme für ein Korpus zu erzeugen? Schauen Sie sich Scikit-Seiten an und es gibt nur Code-Snippets (keine vollständigen Beispiele).TD/IDF in scikit-learn

Grüßen, Lin

+1

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. –

+0

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. –

+0

BTW, warum nicht eine Antwort schreiben, ich werde es als Antwort markieren, um andere Menschen auch zu profitieren. :) –

Antwort

2

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!

    +0

    Danke Abhinav, stimme für deine Antwort und für deine Kommentare, 'The Vectorizer auf unseren Eingabedaten und erzeugt eine dünne Matrix der Dimensionen 4 x 20', wo" 4 "und" 20 "zu setzen? Es scheint, dass Sie in Ihrem Codebeispiel solche Parameter nicht einrichten? –

    +0

    Eine andere Frage ist, für Ihr Codebeispiel, 'tfidf = TfidfVectorizer() train_features = tfidf.fit_transform (Text)', sehe ich Sie nicht Parameter n für n-Gramm einrichten, fragen standardmäßig, wird 'fit_transform 'nur behandeln mit Unigram? Vielen Dank. –

    +1

    Die 4 kommt, weil mein ursprünglicher Korpus in der Textvariablen 4 Dokumente hat. Die Textvariable ist eine Liste von 4 Zeichenfolgen, wobei jede Zeichenfolge einem Dokument entspricht. Die 20 wurde vom Tfidfvectorizer automatisch gelernt, weil das die Anzahl der eindeutigen Unigramme in meinem Korpus (4 Dokumente) ist. Daher ist das Ergebnis 4 (Anzahl der Dokumente) x 20 (Wortschatz). –