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.
quelle
Antworten:
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.
quelle
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.)
quelle