Dies ist ein Memo für mich, während ich Einführung in Anwendungen zur Verarbeitung natürlicher Sprache in 15 Schritten lese. Notieren Sie sich diesmal in Kapitel 3, Schritt 11 Ihre eigenen Punkte. Persönlich ist dies eine Technologie, die mich besonders an der Verarbeitung natürlicher Sprache interessiert.
Bisher war die Methode zur Merkmalsextraktion BoW (oder eine Variante von BoW), die durch die Anzahl der Dimensionen ausgedrückt wurde, die der Anzahl der Vokabeln entspricht. Bei Worteinbettungen kann es durch einen Vektor einer bestimmten Anzahl von Dimensionen dargestellt werden (** verteilte Darstellung von Wörtern **). Dieser Vektor hat Informationen, als ob er die Bedeutung eines Wortes darstellt.
Vergleich mit One-Hot-Ausdrücken wie BoW
Artikel | One-heißer Ausdruck | Word embeddings |
---|---|---|
Anzahl der Dimensionen des Vektors | ・ Anzahl der Vokabeln ・ Es kann Zehntausende bis Millionen sein |
・ Vom Designer festgelegter fester Wert ・ Hunderte |
Vektorwert | 1 für bestimmte Dimensionen, 0 für andere | Alle Dimensionen nehmen reale Werte an |
Analogy task
analogy_sample.Versuchen Sie es mit py
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python analogy_sample.py
tokyo - japan + france = ('paris', 0.9174968004226685)
gensim.downloader.load ('<Worteinbettungsmodell>')
enthält den dem Wort entsprechenden Merkmalsvektor. Je nach Modell dürfen jedoch nur englische Wörter verwendet werden.
In diesem Beispiel werden die Wörter "Tokio", "Japan" und "Frankreich" behandelt. Wenn Sie eine Pseudoberechnung versuchen, die auf der Bedeutung der Wörter basiert, Es ist ersichtlich, dass es ausgedrückt werden kann als "(tokyo --japan) + frankreich = (kapital) + frankreich ≒ paris".
Probieren wir einige der Beispiele aus, die wir in anderen Büchern gelesen haben.
king - man + woman = [('king', 0.8859834671020508), ('queen', 0.8609581589698792), ('daughter', 0.7684512138366699), ('prince', 0.7640699148178101), ('throne', 0.7634970545768738), ('princess', 0.7512727975845337), ('elizabeth', 0.7506488561630249), ('father', 0.7314497232437134), ('kingdom', 0.7296158075332642), ('mother', 0.7280011177062988)]
gone - go + see = [('see', 0.8548812866210938), ('seen', 0.8507398366928101), ('still', 0.8384071588516235), ('indeed', 0.8378400206565857), ('fact', 0.835073709487915), ('probably', 0.8323071002960205), ('perhaps', 0.8315557837486267), ('even', 0.8241520524024963), ('thought', 0.8223952054977417), ('much', 0.8205327987670898)]
Es kann von model.wv.similar_by_vector (..)
abgerufen werden, wie in der Analogie-Aufgabe behandelt.
Die durch Word-Einbettungen erhaltene verteilte Darstellung weist die folgenden Eigenschaften auf.
Artikel | Inhalt |
---|---|
Word2Vec | Erhalten Sie einen verteilten Ausdruck, indem Sie sich auf mehrere aufeinanderfolgende Wörter in einem Satz konzentrieren |
Glove | Erhalten Sie eine verteilte Darstellung unter Verwendung von Häufigkeitsinformationen zum gleichzeitigen Auftreten von Wörtern in den gesamten Trainingsdaten |
fastText | Zeichen n-Holen Sie sich die verteilte Darstellung von Gramm und addieren Sie sie, um die verteilte Darstellung von Wörtern zu erstellen |
Wie oben erwähnt, können bei Word-Einbettungen bereits trainierte Modelle verwendet werden (beim Einbetten in eine Anwendung und bei der Verwendung trainierter Modelle ist es besser, das Transferlernen durchzuführen und es vor der Verwendung in gewissem Umfang für Daten geeignet zu machen. damit)
Beachten Sie bei der Verwendung des trainierten Modells, das später verteilt wird, die Lizenz und die Nutzungsbedingungen dieses Modells.
simple_we_classification.py
befindet sich unter sec130_140_cnn_rnn / klassifikation /
. Da tokenize.py in diesem Verzeichnis nicht vorhanden ist, habe ich "sec40_preprocessing / tokenizer.py" verwendet.
Ergänzungen / Änderungen gegenüber dem vorherigen Kapitel (Schritt 09)
def calc_text_feature(text):
"""
Finden Sie die Funktion von Text basierend auf dem verteilten Ausdruck von Wörtern.
Nachdem Sie den Text getoken und die verteilte Darstellung jedes Tokens gefunden haben,
Die Summe aller verteilten Darstellungen sei die Merkmalsmenge des Textes.
"""
tokens = tokenize(text)
word_vectors = np.empty((0, model.wv.vector_size))
for token in tokens:
try:
word_vector = model[token]
word_vectors = np.vstack((word_vectors, word_vector))
except KeyError:
pass
if word_vectors.shape[0] == 0:
return np.zeros(model.wv.vector_size)
return np.sum(word_vectors, axis=0)
Ausführungsergebnis
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python simple_we_classification.py
0.40425531914893614
Normale Implementierung (Schritt 01): 37,2% Vorverarbeitung hinzugefügt (Schritt 02): 43,6% Änderung der Vorverarbeitung + Merkmalsextraktion (Schritt 04): 58,5% Vorverarbeitung + Änderung der Merkmalsextraktion (Schritt 11): 40,4%
Die Leistung ist mit den Funktionen auf Satzebene, die durch einfaches Hinzufügen von Worteinbettungen erhalten werden, gering.
Vorverarbeitung + Änderung der Merkmalsextraktion + Änderung des Klassifikators (Schritt 06): 61,7% Vorverarbeitung + Änderung der Merkmalsextraktion + Änderung des Klassifikators (Schritt 09): 66,0%
Es ist wünschenswert, dass das Modell der zu verwendenden Worteinbettungen ** reproduziert wird, wenn dieselbe Schreib- und Vorverarbeitungsmethode verwendet wird, die beim Lernen verwendet wurde **.
Recommended Posts