So überwinden Sie die unterschiedlichen Längen von Trainingsbeispielen bei der Arbeit mit Word Embeddings (word2vec)

10

Ich arbeite an der Stimmungsanalyse über Tweets mit word2vec als Wortdarstellung.

Ich habe mein word2vec-Modell trainiert. Aber wenn ich meinen Klassifikator trainiere, habe ich das Problem, dass jeder Tweet eine andere Länge hat und der Klassifikator (RandomForest) alle Beispiele benötigt, um die gleiche Größe zu haben.

Derzeit mittle ich für jeden Tweet die Vektoren aller seiner Wörter, um eine Vektordarstellung des Tweets zu erhalten.

Beispiel: Mein word2vec-Modell repräsentiert jedes Wort als Vektoren der Größe 300.

Ich habe Tweet1aus 10 Wörtern und Tweet2aus 5 Wörtern gebildet.

Also, was ich tue, ist für Tweet1

(v1_Tweet1 + v2_Tweet1 + ... +v10_Tweet1)/10 = v_Tweet1 #avg vector of 300 elements.

Für Tweet2:

(v1_Tweet2 + v2_Tweet2 + ... +v5_Tweet1)/5 = v_Tweet2 #avg vector of 300 elements.

* Als v1_TweetX der Vektor des ersten Wortes des TweetX und so weiter.

Das funktioniert gut, aber ich würde gerne wissen, welche anderen Ansätze Sie wählen, um die unterschiedlichen Größen im Zug und die Textbeispiele für den Klassifikator zu überwinden.

Vielen Dank.

Antorqs
quelle

Antworten:

6

Lassen Sie mich drei einfache Optionen vorschlagen:

  1. Mittelung der Vektoren (komponentenweise), dh Berechnung des Worteinbettungsvektors für jedes Wort im Text und Mittelwertbildung. (wie von anderen vorgeschlagen).

  2. Nehmen Sie das (komponentenweise) Maximum der Vektoren. (max statt durchschnittlich)

  3. Nehmen Sie das (komponentenweise) Minimum der Vektoren. (min statt durchschnittlich)

Jedes davon ergibt einen Merkmalsvektor, der unabhängig von der Länge des Textes ist.

Es gibt einige Untersuchungen, die darauf hinweisen, dass die Verkettung von Max und Min einen ziemlich effektiven Funktionsbereich ergibt: Es ist nicht das absolute Optimum, aber es ist nahezu optimal und einfach und leicht zu implementieren. Weitere Informationen finden Sie in dieser Frage auf Statistics.SE .


Hier ist eine alternative Idee, inspiriert von Cubones Antwort , die meines Wissens noch nicht getestet wurde. Die Idee ist, den Text mit einem Teil-der-Sprache-Tagger zu markieren und diese Tags dann zu verwenden, um den Funktionsprozess zu informieren.

Notieren Sie sich insbesondere eine Liste aller möglichen POS-Tags, die vom POS-Tagger ausgegeben werden könnten. Angenommen, es gibt 20 mögliche Tags (CC, DT, JJS, MD, NNP, ...). Dann ist der Merkmalsvektor 20 * 300 = 6000 Elemente lang: Er hat einen 300-Vektor pro POS-Tag, der in einer kanonischen Reihenfolge verkettet ist. Der 300-Vektor für jedes Tag könnte berechnet werden, indem die Worteinbettungsvektoren aller Wörter gemittelt werden, die vom POS-Tagger mit diesem Tag markiert werden. Oder Sie könnten einen 600-Vektor pro POS-Tag erhalten, indem Sie die Min- und Max-Werte über alle Vektoren von Wörtern mit diesem Tag berechnen.

Dies könnte zu einem größeren Funktionsbereich führen. Ich weiß nicht, ob dies zu einer Verbesserung führen würde, aber Sie können es versuchen, wenn Sie mit verschiedenen Ideen experimentieren möchten.

DW
quelle
3

Zwei sehr unterschiedliche Vorschläge, um eine Mittelung der Vektoren zu vermeiden:

  1. Verwenden Sie die Entfernung von Word Mover ( https://github.com/mkusner/wmd ), um die Entfernung zwischen den Tweets zu berechnen (nicht sicher, wie gut es bei kurzen Texten wie Tweets funktionieren würde, das muss ich noch selbst versuchen ...)
  2. Gruppieren Sie die Wortvektoren selbst (z. B. kmeans) und erstellen Sie dann für jeden Tweet einen Vektor mit k Einträgen (einen für jeden Cluster), der codiert, ob er Wörter enthält, die zu diesem Cluster gehören. Ich glaube, ich habe dies in einem Kaggle-Tutorial auf word2vec gesehen. Ich freue mich über den Link, wenn Sie ihn finden!
Sharon
quelle
1

Anstatt zu mitteln und einen einzelnen Vektor für den Tweet zu erhalten, können Sie stattdessen Vektoren für jedes Wort und für Vektorgrößen unterschiedlicher Länge erhalten. Das Auffüllen kann mit Nullen erfolgen.

Hima Varsha
quelle
Hallo, danke für deine Antwort. Ich habe die Frage mit einem kleinen Beispiel aktualisiert. Würden Sie Ihre Antwort aktualisieren, um zu zeigen, wie Sie dies auf das von mir bereitgestellte Beispiel anwenden würden? Vielen Dank.
Antorqs
Ich verstehe es viel besser nach Ihrer Bearbeitung. Aber warum sollte man einen einzelnen Vektor wollen? Warum können Sie nicht alle Wörter (Vektoren) stattdessen für die Klassifizierung verwenden?
Hima Varsha
Ich benutze alle Wortvektoren. Aber ich muss jeden Tweet so darstellen, dass alle die gleiche Größe haben. Für den Klassifikator müssen alle Beispiele dieselbe Größe haben.
Antorqs
Haben Sie versucht, einen Vektorisierer zu verwenden und fit_transform für die Tweets auszuführen?
Hima Varsha
1

In meiner Arbeit habe ich den gleichen Weg gemacht, indem ich die Wortvektoren gemittelt habe. Aber es gibt noch eine andere Idee, die ich ausprobieren wollte. Es ist mit Hilfe von POS-Tags.

Erstellen Sie zunächst einen möglichst komplizierten Satz mit allen POS-Tags und legen Sie diese POS-Tags als Vorlage fest. Für jeden Satz im Twitter-Korpus markiert POS alle darin enthaltenen Wörter und wendet die Wortvektoren an, die den POS-Tags in der Vorlage entsprechen. Die unsichtbaren POS-Tags haben also Nullen.

Zum Beispiel: NNP PDT DT NNS VB MD JJS CC PRP RBSist die Vorlage. Somit enthält jede Position einen 300-dimensionalen Vektor, der vollständig ein 3000-dimensionaler Vektor ist. Und wenn die POS-Tags des ersten Tweets sind NNP VB JJS PRP, werden die Wortvektoren auf diese Positionen angewendet und haben Vektoren auf NNP VB JJS PRPPositionen und 300-dimensionale Nullvektoren auf anderen Positionen.

Diese Methode löst nicht nur das Problem der Darstellung des Satzes durch einen einzelnen Vektor, sondern bewahrt auch die syntaktische Struktur des Satzes durch Positionierung im rechten POS.

Natürlich gibt es Probleme, wenn mehr als ein POS-Tag oder eine durcheinandergebrachte Position der Tags vorhanden ist. Dies ist nur eine der Möglichkeiten.

Yazhi
quelle
Ich verstehe diesen Ansatz nicht ganz. Können Sie den Ansatz bearbeiten, um ihn zu klären / zu erläutern? Was planen Sie zu tun, wenn die POS-Tags in meinem Tweet nicht in derselben Reihenfolge wie Ihre Vorlage angezeigt werden? Was planen Sie zu tun, wenn mein Tweet POS-Tags enthält, die in Ihrer Vorlage nicht vorhanden waren? Das scheint ziemlich zerbrechlich.
DW
Inspiriert von Ihrer Antwort habe ich meiner Antwort eine Idee hinzugefügt , die auf Ihrer Idee basiert, aber versucht, die in meinem Kommentar erwähnte Fragilität anzugehen. Mir gefällt, was du dir ausgedacht hast!
DW