Gensim - Word Embedding entwickeln
Das Kapitel wird uns helfen, die Entwicklung der Worteinbettung in Gensim zu verstehen.
Die Worteinbettung, ein Ansatz zur Darstellung von Wörtern und Dokumenten, ist eine dichte Vektordarstellung für Text, bei der Wörter mit derselben Bedeutung eine ähnliche Darstellung haben. Im Folgenden sind einige Merkmale der Worteinbettung aufgeführt:
Es ist eine Klasse von Techniken, die die einzelnen Wörter als reelle Vektoren in einem vordefinierten Vektorraum darstellen.
Diese Technik wird häufig in das Feld des DL (Deep Learning) zusammengefasst, da jedes Wort einem Vektor zugeordnet wird und die Vektorwerte auf die gleiche Weise wie ein NN (Neural Networks) gelernt werden.
Der Schlüsselansatz der Worteinbettungstechnik ist eine dicht verteilte Darstellung für jedes Wort.
Verschiedene Methoden / Algorithmen zum Einbetten von Wörtern
Wie oben diskutiert, lernen Worteinbettungsmethoden / -algorithmen eine reelle Vektordarstellung aus einem Textkorpus. Dieser Lernprozess kann entweder mit dem NN-Modell für Aufgaben wie die Klassifizierung von Dokumenten verwendet werden oder ist ein unbeaufsichtigter Prozess wie die Dokumentenstatistik. Hier werden wir zwei Methoden / Algorithmen diskutieren, die verwendet werden können, um ein Wort zu lernen, das aus Text eingebettet wird -
Word2Vec von Google
Word2Vec, entwickelt von Tomas Mikolov et al. al. Bei Google im Jahr 2013 handelt es sich um eine statistische Methode zum effizienten Erlernen eines aus Textkorpus eingebetteten Wortes. Es wurde als Reaktion entwickelt, um das NN-basierte Training der Worteinbettung effizienter zu gestalten. Es ist zum De-facto-Standard für die Worteinbettung geworden.
Das Einbetten von Wörtern durch Word2Vec umfasst die Analyse der gelernten Vektoren sowie die Untersuchung der Vektormathematik zur Darstellung von Wörtern. Im Folgenden sind die zwei verschiedenen Lernmethoden aufgeführt, die als Teil der Word2Vec-Methode verwendet werden können:
- CBoW-Modell (Continuous Bag of Words)
- Kontinuierliches Skip-Gram-Modell
GloVe von Standford
GloVe (Globale Vektoren für die Wortdarstellung) ist eine Erweiterung der Word2Vec-Methode. Es wurde von Pennington et al. in Stanford. Der GloVe-Algorithmus ist eine Mischung aus beidem -
- Globale Statistik von Matrixfaktorisierungstechniken wie LSA (Latent Semantic Analysis)
- Lokales kontextbasiertes Lernen in Word2Vec.
Wenn wir über seine Funktionsweise sprechen, erstellt GloVe anstelle eines Fensters zur Definition des lokalen Kontexts eine explizite Matrix für das gleichzeitige Auftreten von Wörtern unter Verwendung von Statistiken über den gesamten Textkorpus.
Entwickeln der Word2Vec-Einbettung
Hier werden wir die Einbettung von Word2Vec mithilfe von Gensim entwickeln. Um mit einem Word2Vec-Modell arbeiten zu können, stellt uns Gensim zur VerfügungWord2Vec Klasse, aus der importiert werden kann models.word2vec. Word2vec benötigt für seine Implementierung viel Text, z. B. den gesamten Amazon-Überprüfungskorpus. Aber hier werden wir dieses Prinzip auf Text mit kleinem Speicher anwenden.
Implementierungsbeispiel
Zuerst müssen wir die Word2Vec-Klasse wie folgt aus gensim.models importieren:
from gensim.models import Word2Vec
Als nächstes müssen wir die Trainingsdaten definieren. Anstatt eine große Textdatei zu verwenden, verwenden wir einige Sätze, um dieses Prinzip zu implementieren.
sentences = [
['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
['this', 'is', 'the', 'tutorials' 'point', 'website'],
['you', 'can', 'read', 'technical','tutorials', 'for','free'],
['we', 'are', 'implementing','word2vec'],
['learn', 'full', 'gensim', 'tutorial']
]
Sobald die Trainingsdaten vorliegen, müssen wir das Modell trainieren. es kann wie folgt gemacht werden -
model = Word2Vec(sentences, min_count=1)
Wir können das Modell wie folgt zusammenfassen -;
print(model)
Wir können das Vokabular wie folgt zusammenfassen:
words = list(model.wv.vocab)
print(words)
Als nächstes greifen wir auf den Vektor für ein Wort zu. Wir machen es für das Wort "Tutorial".
print(model['tutorial'])
Als nächstes müssen wir das Modell speichern -
model.save('model.bin')
Als nächstes müssen wir das Modell laden -
new_model = Word2Vec.load('model.bin')
Drucken Sie das gespeicherte Modell abschließend wie folgt aus:
print(new_model)
Vollständiges Implementierungsbeispiel
from gensim.models import Word2Vec
sentences = [
['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
['this', 'is', 'the', 'tutorials' 'point', 'website'],
['you', 'can', 'read', 'technical','tutorials', 'for','free'],
['we', 'are', 'implementing','word2vec'],
['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
print(model)
words = list(model.wv.vocab)
print(words)
print(model['tutorial'])
model.save('model.bin')
new_model = Word2Vec.load('model.bin')
print(new_model)
Ausgabe
Word2Vec(vocab=20, size=100, alpha=0.025)
[
'this', 'is', 'gensim', 'tutorial', 'for', 'free', 'the', 'tutorialspoint',
'website', 'you', 'can', 'read', 'technical', 'tutorials', 'we', 'are',
'implementing', 'word2vec', 'learn', 'full'
]
[
-2.5256255e-03 -4.5352755e-03 3.9024993e-03 -4.9509313e-03
-1.4255195e-03 -4.0217536e-03 4.9407515e-03 -3.5925603e-03
-1.1933431e-03 -4.6682903e-03 1.5440651e-03 -1.4101702e-03
3.5070938e-03 1.0914479e-03 2.3334436e-03 2.4452661e-03
-2.5336299e-04 -3.9676363e-03 -8.5054158e-04 1.6443320e-03
-4.9968651e-03 1.0974540e-03 -1.1123562e-03 1.5393364e-03
9.8941079e-04 -1.2656028e-03 -4.4471184e-03 1.8309267e-03
4.9302122e-03 -1.0032534e-03 4.6892050e-03 2.9563988e-03
1.8730218e-03 1.5343715e-03 -1.2685956e-03 8.3664013e-04
4.1721235e-03 1.9445885e-03 2.4097660e-03 3.7517555e-03
4.9687522e-03 -1.3598346e-03 7.1032363e-04 -3.6595813e-03
6.0000515e-04 3.0872561e-03 -3.2115565e-03 3.2270295e-03
-2.6354722e-03 -3.4988276e-04 1.8574356e-04 -3.5757164e-03
7.5391348e-04 -3.5205986e-03 -1.9795434e-03 -2.8321696e-03
4.7155009e-03 -4.3349937e-04 -1.5320212e-03 2.7013756e-03
-3.7055744e-03 -4.1658725e-03 4.8034848e-03 4.8594419e-03
3.7129463e-03 4.2385766e-03 2.4612297e-03 5.4920948e-04
-3.8912550e-03 -4.8226118e-03 -2.2763973e-04 4.5571579e-03
-3.4609400e-03 2.7903817e-03 -3.2709218e-03 -1.1036445e-03
2.1492650e-03 -3.0384419e-04 1.7709908e-03 1.8429896e-03
-3.4038599e-03 -2.4872608e-03 2.7693063e-03 -1.6352943e-03
1.9182395e-03 3.7772327e-03 2.2769428e-03 -4.4629495e-03
3.3151123e-03 4.6509290e-03 -4.8521687e-03 6.7615538e-04
3.1034781e-03 2.6369948e-05 4.1454583e-03 -3.6932561e-03
-1.8769916e-03 -2.1958587e-04 6.3395966e-04 -2.4969708e-03
]
Word2Vec(vocab=20, size=100, alpha=0.025)
Visualisieren der Worteinbettung
Wir können auch die Worteinbettung mit Visualisierung untersuchen. Dies kann mithilfe einer klassischen Projektionsmethode (wie PCA) erfolgen, um die hochdimensionalen Wortvektoren auf 2D-Diagramme zu reduzieren. Einmal reduziert, können wir sie dann grafisch darstellen.
Zeichnen von Wortvektoren mit PCA
Zuerst müssen wir alle Vektoren aus einem trainierten Modell wie folgt abrufen:
Z = model[model.wv.vocab]
Als nächstes müssen wir ein 2-D-PCA-Modell von Wortvektoren erstellen, indem wir die PCA-Klasse wie folgt verwenden:
pca = PCA(n_components=2)
result = pca.fit_transform(Z)
Jetzt können wir die resultierende Projektion mithilfe der Matplotlib wie folgt zeichnen:
Pyplot.scatter(result[:,0],result[:,1])
Wir können die Punkte in der Grafik auch mit den Wörtern selbst versehen. Zeichnen Sie die resultierende Projektion mit der Matplotlib wie folgt:
words = list(model.wv.vocab)
for i, word in enumerate(words):
pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
Vollständiges Implementierungsbeispiel
from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
sentences = [
['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
['this', 'is', 'the', 'tutorials' 'point', 'website'],
['you', 'can', 'read', 'technical','tutorials', 'for','free'],
['we', 'are', 'implementing','word2vec'],
['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model.wv.vocab)
for i, word in enumerate(words):
pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()