Dokumentklassifizierung unter Verwendung eines Faltungsnetzwerks

11

Ich versuche, CNN (Convolutional Neural Network) zu verwenden, um Dokumente zu klassifizieren. CNN für kurze Texte / Sätze wurde in vielen Artikeln untersucht. Es scheint jedoch, dass keine Papiere CNN für Langtext oder Dokumente verwendet haben.
Mein Problem ist, dass ein Dokument zu viele Funktionen enthält. In meinem Datensatz enthält jedes Dokument mehr als 1000 Token / Wörter. Um jedes Beispiel einem CNN zuzuführen , konvertiere ich jedes Dokument in eine Matrix, indem ich word2vec oder einen Handschuh verwende , der eine große Matrix ergibt. Für jede Matrix ist die Höhe die Länge des Dokuments und die Breite die Größe des Worteinbettungsvektors. Mein Datensatz enthält mehr als 9000 Beispiele und das Trainieren des Netzwerks (eine ganze Woche) nimmt viel Zeit in Anspruch, was die Feinabstimmung der Parameter erschwert.
Eine andere Methode zum Extrahieren von Merkmalen besteht darin, für jedes Wort einen heißen Vektor zu verwenden, dies erzeugt jedoch sehr spärliche Matrizen. Und natürlich dauert das Trainieren dieser Methode sogar länger als die vorherige.
Gibt es also eine bessere Methode zum Extrahieren von Features, ohne große Eingabematrizen zu erstellen?
Und wie sollen wir mit variabler Länge von Dokumenten umgehen? Derzeit füge ich spezielle Zeichenfolgen hinzu, damit das Dokument dieselbe Länge hat, aber ich denke nicht, dass dies eine gute Lösung ist.

lenhhoxung
quelle
2
Scheint die Verwendung des TfIdf-Vektorisierers geeignet? Vielleicht in Kombination mit word2vec, um nur die obersten x Wörter für jedes Dokument zu belassen?
Diego
Nun, ich weiß nicht, was Tfldf ist. Ich werde es überprüfen, um zu sehen, ob es funktioniert. Vielen Dank
Lenhhoxung
scikit-learn.org/stable/modules/… hier zum Beispiel
Diego
Ich überprüfe es einfach und ich denke, es hilft mir nicht. Grundsätzlich erstellt diese Hilfsklasse eine Matrix für eine Reihe von Dokumenten. Jeder Zeilenvektor (binär oder Wortanzahl) in der Matrix entspricht einem Dokument, aber für CNN benötigen wir eine Matrix für jedes Dokument.
Lenhhoxung
Es ging darum, nur x nicht triviale Wörter pro Dokument zu belassen, die nach ihrem TfIdf geordnet sind. Verwenden Sie dann Ihre ursprüngliche Codierung, um Dokumentmatrizen zu erstellen. Ich bin mir nicht sicher, ob diese zweistufige Ansatzidee aufkam.
Diego

Antworten:

8

Sie können die Länge Ihrer Eingabedaten verringern, indem Sie Ihre Dokumente als eine Reihe von Satzvektoren anstelle einer längeren Reihe von Wortvektoren darstellen. Doc2vec ist eine Möglichkeit, dies zu tun (jeder Satz wäre ein "Dokument").

Wenn Sie Doc2vec nicht verwenden möchten, besteht eine Möglichkeit zum Erstellen der Satzvektoren darin, die Wortvektoren für jeden Satz zu mitteln, sodass Sie für jeden Satz einen einzelnen Vektor mit der gleichen Breite erhalten. Dies ist möglicherweise nicht so genau wie einige über Doc2Vec verfügbare Methoden, aber ich habe es mit beachtlichem Erfolg für die Themenmodellierung verwendet.

So oder so, sobald Sie Ihre Satzvektoren haben, richten Sie sie nacheinander für jedes Dokument aus, wie Sie es bereits für Ihre Wortvektoren tun, und durchlaufen Sie dann Ihr Modell. Da die Sequenzlänge für jedes Dokument kürzer ist, sollte Ihr Modell schneller trainieren als mit Wortvektoren.

Übrigens könnte diese Methode funktionieren, wenn sie vergrößert oder verkleinert wird, um Ihre Genauigkeits- und Geschwindigkeitsanforderungen zu erfüllen. (Wenn Ihr CNN beispielsweise immer noch zu langsam mit Satzvektoren trainiert, können Sie stattdessen Absatzvektoren erstellen.)

Eine Möglichkeit, Dokumente unterschiedlicher Länge zu verarbeiten, ist das Auffüllen. Ihre Dokumentsequenzen sollten alle gleich lang sein wie Ihr längstes Dokument. Wenn Ihr längstes Dokument also 400 Sätze umfasst, sind alle Dokumentsequenzen 400 Vektoren lang. Dokumente, die kürzer als die maximale Länge sind, werden mit Vektoren aufgefüllt, die mit Nullen gefüllt sind.

Andrew
quelle
Interessante Idee. Ich werde es versuchen :)
Lenhhoxung
Dürfte ich eine Frage stellen? Wie kann ich mit Dokumenten umgehen, die signifikant unterschiedliche Längen haben (5 Sätze / Dokument, 500 Sätze / Dokument), selbst wenn ich sie in Satzvektoren darstelle? Polsterung hier scheint seltsam ...
Stackunderflow
1
Bei der Sprachverarbeitung ordnen einige Personen die Sequenzen basierend auf ihrer Länge an, sodass sich Sequenzen mit ähnlicher Länge im selben Stapel befinden. Dies funktioniert möglicherweise für die Textsequenz.
Suthee
4

Sie können Regionseinbettungen verwenden. Anstatt einzelne "Token" in Vektoren zu konvertieren, können Sie eine Strategie verwenden, um Textbereiche in Vektoren zu konvertieren. Dieser Ansatz wird hier verwendet: https://arxiv.org/abs/1504.01255

Wenn Sie nicht auf CNN beschränkt sind, können Sie hierarchische Aufmerksamkeitsmodelle wie dieses verwenden: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf, in denen Sie eine Pipeline dieser Art haben: word vectors (combined into) sentence vectors (combined into) final document vector

Beachten Sie, dass Sie bei dieser Methode weiterhin alle Wortvektoren in Einbettungen konvertieren müssen, jedoch nicht alle gleichzeitig.

Für Dokumente unterschiedlicher Länge ist bisher das Auffüllen / Schneiden die einzige Lösung.

Um die Geschwindigkeit zu erhöhen, können Sie versuchen, die Dimension des Textes zu verringern, indem Sie nur wichtige Abschnitte einbeziehen (möglicherweise reicht nur der Anfang des Dokuments aus, um eine gute Klassifizierungsgenauigkeit zu erzielen.)

Pygabriel
quelle
1
Vielen Dank für Ihren Referenzlink. Die Einbettung der Region ist interessant. In Bezug auf Dokumente mit variabler Größe können wir , wie in diesem Artikel arxiv.org/abs/1412.1058 (gleicher Autor) erwähnt, mehrere Pooling-Einheiten anstelle von Polstern / Schneiden verwenden.
Lenhhoxung