Wenden Sie Worteinbettungen auf das gesamte Dokument an, um einen Feature-Vektor zu erhalten


38

Wie verwende ich eine Worteinbettung, um ein Dokument einem Feature-Vektor zuzuordnen, der für die Verwendung mit überwachtem Lernen geeignet ist?

Ein Wort Einbettungs bildet jedes Wort auf einen Vektor v R d , wobei d einige nicht allzu große Anzahl (zB 500). Beliebte Wort Einbettungen sind word2vec und Handschuh .wvRdd

Ich möchte betreutes Lernen anwenden, um Dokumente zu klassifizieren. Momentan ordne ich jedes Dokument einem Merkmalsvektor mithilfe der Wortsackdarstellung zu und wende dann einen Standardklassifizierer an. Ich möchte den Merkmalsvektor der Wortsammlung durch etwas ersetzen, das auf einer vorhandenen vorgeübten Worteinbettung basiert, um das semantische Wissen zu nutzen, das in der Worteinbettung enthalten ist. Gibt es eine Standardmethode dafür?

Ich kann mir einige Möglichkeiten vorstellen, aber ich weiß nicht, ob es etwas gibt, das am sinnvollsten ist. Kandidatenansätze, über die ich nachgedacht habe:

  • Ich könnte den Vektor für jedes Wort im Dokument berechnen und alle mitteln. Dies scheint jedoch eine Menge Informationen zu verlieren. Zum Beispiel kann der Klassifizierer bei der Darstellung in Wortsäcken leicht lernen, dass es einige Wörter gibt, die für die Klassifizierungsaufgabe von hoher Relevanz sind und die meisten Wörter irrelevant sind. Wenn ich die Vektoren für alle Wörter im Dokument mittle, hat der Klassifikator keine Chance.

  • Das Verketten der Vektoren für alle Wörter funktioniert nicht, da dies nicht zu einem Merkmalsvektor mit fester Größe führt. Es scheint auch eine schlechte Idee zu sein, da es übermäßig empfindlich auf die spezifische Platzierung eines Wortes ist.

  • Ich könnte die Worteinbettung verwenden, um das Vokabular aller Wörter in eine feste Menge von Clustern zu gruppieren, beispielsweise 1000 Cluster, wobei ich die Kosinusähnlichkeit auf den Vektoren als Maß für die Wortähnlichkeit verwende. Dann könnte ich anstelle eines Wortbeutels einen Clusterbeutels haben: Der Merkmalsvektor, den ich dem Klassifizierer zuführe, könnte ein 1000-Vektor sein, bei dem die te Komponente die Anzahl der Wörter in dem Dokument zählt, das dies ist sind Teil von Cluster i .ii

  • Mit einem gegebenen Wort lassen mich diese Worteinbettungen einen Satz der 20 ähnlichsten Wörter w 1 , , w 20 und ihre Ähnlichkeitswerte s 1 , , s 20 berechnen . Ich könnte den wortreichen Merkmalsvektor damit anpassen. Wenn ich das Wort sehen w , zusätzlich zum Inkrementieren des Elements zu Wort entspricht w von 1 konnte ich auch das Element inkrementieren Wort entspricht , w 1 von s 1 , inkrementieren das Element zu Wort entspricht w 2 durchww1,,w20s1,,s20ww1w1s1w2 und so weiter.s2

Gibt es einen speziellen Ansatz, der sich für die Klassifizierung von Dokumenten eignet?


Ich suche nicht nach paragraph2vec oder doc2vec. Diese erfordern Training auf einem großen Datenkorpus, und ich habe keinen großen Datenkorpus. Stattdessen möchte ich eine vorhandene Worteinbettung verwenden.


1
Haben Sie sich für eine bestimmte Methode zur Darstellung von Dokumenten mit vorgefertigten Einbettungen entschieden? Vielleicht dies könnte ein wenig helfen?
turdus-merula

1
@ user115202, ordentlich! Das löst nicht ganz das Problem, das ich hatte, aber es ist eine clevere Idee, die sich gut anhört - danke, dass Sie darauf hingewiesen haben! Ich habe nie eine sehr gute Lösung für dieses Problem gefunden, die wesentlich besser war als die einfache Verwendung von Wortbeuteln. Vielleicht ist das einfach nicht das, wozu Worteinbettungen gut sind. Vielen Dank!
DW

Dies hängt auch mit Ihrem Problem zusammen, wahrscheinlich etwas mehr als das vorhergehende: Repräsentationslernen für sehr kurze Texte mit gewichteter Worteinbettungsaggregation .
Turdus-Merula


1
Warum nicht eine RNN verwenden? Dokumente mit variabler Länge sind für RNNs kein Problem. wildml.com/2015/09/…
kalu

Antworten:


23

Eine einfache Technik, die bei kurzen Texten (z. B. einem Satz oder einem Tweet) recht gut zu funktionieren scheint, besteht darin, den Vektor für jedes Wort im Dokument zu berechnen und diese dann mit dem koordinatenweisen Mittelwert, dem min-Wert oder dem max-Wert zu aggregieren.

nv1,v2,,vnRdmin(v1,,vn)max(v1,,vn)uui=min(vi1,,vin)und ebenso für die max. Der Merkmalsvektor ist die Verkettung dieser beiden Vektoren, daher erhalten wir einen Merkmalsvektor in . Ich weiß nicht, ob dies besser oder schlechter ist als eine Wortsack-Darstellung, aber bei kurzen Dokumenten ist die Leistung meines Erachtens möglicherweise besser als bei Wortsäcken, und es können vorgefertigte Worteinbettungen verwendet werden.R2d

TL; DR: Überraschenderweise funktioniert die Verkettung von min und max ziemlich gut.

Referenz:

Repräsentationslernen für sehr kurze Texte mit gewichteter Worteinbettungsaggregation. Cedric De Boom, Steven Van Canneyt, Thomas Demeester und Bart Dhoedt. Mustererkennungsbuchstaben; arxiv: 1607.00570. Zusammenfassung , pdf . Siehe insbesondere Tabellen 1 und 2.

Danksagung: Vielen Dank an @ user115202, der mich auf dieses Papier aufmerksam gemacht hat.


4
für kurzen Text mag avg / min / max gut funktionieren, aber was ist, wenn langer Text, wie zum Beispiel ein Nachrichtenartikel?
Avocado

1
Für alle, die dieses Papier lesen und genauso verwirrt sind wie ich: Das Papier konzentriert sich nicht auf den von @DW erwähnten Ansatz, sondern erwähnt ihn nur kurz unter "5.1. Baselines" als Basisansatz. Der Hauptteil der Arbeit konzentriert sich auf ihre eigene Technik, bei der ein Klassifikator unter Verwendung von Einbettungen trainiert wird. Dies ist viel komplexer als der hier beschriebene Ansatz!
Migwell

16

Sie können doc2vec ähnlich wie word2vec verwenden und ein vorab trainiertes Modell aus einem großen Korpus verwenden. Verwenden Sie dann etwas wie .infer_vector()in gensim, um einen Dokumentvektor zu konstruieren. Das doc2vec-Training muss nicht unbedingt aus dem Trainingsset stammen.

Eine andere Methode ist die Verwendung eines RNN-, CNN- oder Feedforward-Netzwerks zur Klassifizierung. Dies kombiniert effektiv die Wortvektoren zu einem Dokumentvektor.

Sie können auch spärliche Merkmale (Wörter) mit dichten Merkmalen (Wortvektoren) kombinieren, um sich gegenseitig zu ergänzen. Ihre Merkmalsmatrix wäre also eine Verkettung der spärlichen Wortmatrix mit dem Durchschnitt der Wortvektoren. https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html

Eine andere interessante Methode besteht darin, einen ähnlichen Algorithmus wie word2vec zu verwenden. Statt jedoch ein Zielwort vorherzusagen, können Sie auch eine Zielbezeichnung vorhersagen. Dadurch werden die Wortvektoren direkt auf die Klassifizierungsaufgabe abgestimmt. http://arxiv.org/pdf/1607.01759v2.pdf

Bei mehr Ad-hoc-Methoden können Sie versuchen, die Wörter je nach Syntax unterschiedlich abzuwägen. Beispielsweise können Sie Verben stärker wiegen als Determinatoren.


6

Wenn Sie mit englischem Text arbeiten und vorab trainierte Worteinbettungen wünschen, lesen Sie diese Informationen : https://code.google.com/archive/p/word2vec/

Dies ist die ursprüngliche C-Version von word2vec. Zusammen mit dieser Version veröffentlichten sie auch ein Modell, das auf 100 Milliarden Wörtern aus Google News-Artikeln trainiert wurde (siehe Abschnitt "Vorab trainierte Wort- und Phrasenvektoren").

Meiner Meinung nach und meiner Erfahrung mit der Arbeit an Worteinbettungen zur Klassifizierung von Dokumenten funktioniert ein Modell wie doc2vec (mit CBOW) viel besser als jede Menge Wörter.

Da Sie über einen kleinen Korpus verfügen, sollten Sie Ihre Worteinbettungsmatrix anhand der oben genannten vorgefertigten Einbettungen initialisieren. Trainieren Sie anschließend den Absatzvektor im doc2vec-Code. Wenn Sie mit Python vertraut sind, können Sie die Gensim-Version ausprobieren, die sehr einfach zu ändern ist.

Lesen Sie auch dieses Dokument, in dem die Funktionsweise von word2vec / doc2vec beschrieben wird: http://arxiv.org/abs/1411.2738 . Dadurch wird das Verständnis des Gensim-Codes sehr einfach.


1
Danke für die Vorschläge. Ich bitte nicht um ein Wort Einbettung; Ich weiß bereits, wie man eine vorgefertigte Worteinbettung erhält (ich habe word2vec in meiner Frage erwähnt). Meine Frage ist, wie Merkmalsvektoren aus einer vorab trainierten Worteinbettung konstruiert werden können. Ich schätze den Verweis auf doc2vec, aber mein Korpus ist ziemlich klein, und daher befürchte ich, dass der Versuch, doc2vec-Codes zu trainieren, zu Überanpassung und schlechter Leistung führt (auch wenn ich die Matrix mit vorgefertigten Einbettungen initialisiere).
DW
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.