Dies ist die Aufzeichnung des 90. "Learning with word2vec" von Language Processing 100 Knock 2015. Die Frage ist, lassen Sie uns einfach das tun, was wir in Kapitel 9 mit einem Paket getan haben. Die Tatsache, dass der Inhalt, den ich mir verzweifelt ausgedacht habe, während ich mir Sorgen über Speichermangel gemacht habe, mit etwa 3 Codezeilen erstellt werden kann, ist unwiderstehlich, aber ich bin mir seiner Pracht sehr bewusst. Dieses Mal wird anstelle von Googles word2vec, das in der Frage angegeben ist, Open Source Geinsim verwendet. /) Wird genutzt. Ich habe gehört, dass Pakete häufig aktualisiert und häufig verwendet werden (ich habe sie aufgrund meines Wissens nicht gründlich recherchiert).
Verknüpfung | Bemerkungen |
---|---|
090.Lernen mit word2vec.ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:90 | Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet |
Art | Ausführung | Inhalt |
---|---|---|
OS | Ubuntu18.04.01 LTS | Es läuft virtuell |
pyenv | 1.2.15 | Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze |
Python | 3.6.9 | python3 auf pyenv.6.Ich benutze 9 3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden Pakete werden mit venv verwaltet |
In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren.
Art | Ausführung |
---|---|
gensim | 3.8.1 |
numpy | 1.17.4 |
In Kapitel 10 werden wir weiter daran arbeiten, Wortvektoren aus dem vorherigen Kapitel zu lernen.
Wenden Sie word2vec auf den in 81 erstellten Korpus an und lernen Sie den Wortvektor. Konvertieren Sie außerdem das Format des gelernten Wortvektors und führen Sie das Programm 86-89 aus.
from pprint import pprint
from gensim.models import word2vec
corpus = word2vec.Text8Corpus('./../09.Vektorraummethode(I)/081.corpus.txt')
model = word2vec.Word2Vec(corpus, size=300)
model.save('090.word2vec.model')
# 86.Anzeige des Wortvektors
pprint(model.wv['United_States'])
# 87.Wortähnlichkeit
print(np.dot(model.wv['United_States'], model.wv['U.S']) / (np.linalg.norm(model.wv['United_States']) * np.linalg.norm(model.wv['U.S'])))
# 88.10 Wörter mit hoher Ähnlichkeit
pprint(model.wv.most_similar('England'))
# 89.Analogie durch additive Zusammensetzung
# vec("Spain") - vec("Madrid") + vec("Athens")
pprint(model.wv.most_similar(positive=['Spain', 'Athens'], negative=['Madrid']))
Lesen Sie zuerst die Datei. Ich dachte, dass es viele Beispiele für die Verwendung der Funktion "Text8Corpus" gibt, also fragte ich mich, was der "Text8Corpus" überhaupt war. Gemäß dem Artikel "Erstellen einer japanischen Version des Text8-Korpus und Erlernen verteilter Ausdrücke" (https://hironsan.hatenablog.com/entry/japanese-text8-corpus) handelt es sich bei text8 um Wikipedia-Daten, die wie folgt verarbeitet wurden. Es scheint.
--Halten Sie Text- und Bildunterschriften
Ich glaube, es gab Großbuchstaben, aber ich hatte das Gefühl, dass sie im Allgemeinen die Bedingungen erfüllen, also habe ich "Text8Corpus" verwendet.
corpus = word2vec.Text8Corpus('./../09.Vektorraummethode(I)/081.corpus.txt')
Alles, was Sie tun müssen, ist die Funktion "Word2Vec" zu verwenden, um den 300-dimensionalen Wortvektor zu vervollständigen. Die Generierung dauerte weniger als 4 Minuten. Beeindruckend ... Ich habe keine Optionen verwendet, aber die gemsim word2vec Optionsliste war leicht zu verstehen.
model = word2vec.Word2Vec(corpus, size=300)
Speichern Sie dann die Datei für nachfolgende Klopfen.
model.save('090.word2vec.model')
Dann scheinen die folgenden 3 Dateien erstellt worden zu sein. Es ist unangenehm, keiner zu sein.
Datei | Größe |
---|---|
090.word2vec.model | 5MB |
090.word2vec.model.trainables.syn1neg.npy | 103MB |
090.word2vec.model.wv.vectors.npy | 103MB |
Lesen Sie das in> 85 erhaltene Wortbedeutungsvektor und zeigen Sie den Vektor "USA" an. Beachten Sie jedoch, dass "USA" intern als "United_States" bezeichnet wird.
In model.wv
befindet sich ein Vektor. Geben Sie ihn einfach an.
pprint(model.wv['United_States'])
array([ 2.3478289 , -0.61461514, 0.0478639 , 0.6709404 , 1.1090833 ,
-1.0814637 , -0.78162867, -1.2584596 , -0.04286158, 1.2928476 ,
Ergebnis weggelassen
Lesen Sie den in> 85 erhaltenen Wortbedeutungsvektor und berechnen Sie die Kosinusähnlichkeit zwischen "USA" und "USA". Beachten Sie jedoch, dass "USA" intern als "USA" ausgedrückt wird.
Verwenden Sie model
, um die Kosinusähnlichkeit zwischen denselben Vektoren wie in Kapitel 9 zu berechnen.
In Kapitel 9 war es 0,837516976284694, was einen höheren Grad an Ähnlichkeit ergibt.
print(np.dot(model.wv['United_States'], model.wv['U.S']) / (np.linalg.norm(model.wv['United_States']) * np.linalg.norm(model.wv['U.S'])))
0.8601596
Lesen Sie den Bedeutungsvektor des in> 85 erhaltenen Wortes und geben Sie 10 Wörter mit hoher Kosinusähnlichkeit zu "England" und deren Ähnlichkeit aus.
Sie können nur mit der Funktion modst_similar
ausgeben.
pprint(model.wv.most_similar('England'))
[('Scotland', 0.7884809970855713),
('Wales', 0.7721374034881592),
('Ireland', 0.6838206052780151),
('Britain', 0.6335258483886719),
('Hampshire', 0.6147407293319702),
('London', 0.6021863222122192),
('Cork', 0.5809425115585327),
('Manchester', 0.5767091512680054),
('Liverpool', 0.5765234231948853),
('Orleans', 0.5624016523361206)]
Übrigens war das Ergebnis in Kapitel 9 wie folgt, aber dieses Mal können Sie sehen, dass die Wörter, die sich auf England beziehen, höher erscheinen und korrektere Daten ausgegeben werden.
Scotland 0.6364961613062289
Italy 0.6033905306935802
Wales 0.5961887337227456
Australia 0.5953277272306978
Spain 0.5752511915429617
Japan 0.5611603300967408
France 0.5547284075334182
Germany 0.5539239745925412
United_Kingdom 0.5225684232409136
Cheshire 0.5125286144779688
Lesen Sie den Bedeutungsvektor des in 85 erhaltenen Wortes, berechnen Sie vec ("Spanien") --vec ("Madrid") + vec ("Athen") und berechnen Sie 10 Wörter mit hoher Ähnlichkeit zu diesem Vektor und deren Ähnlichkeit. Gib es aus.
Wenn Sie "positiv" und "negativ" an die Funktion "modst_similar" übergeben, werden 10 Wörter mit hoher Ähnlichkeit berechnet und ausgegeben.
pprint(model.wv.most_similar(positive=['Spain', 'Athens'], negative=['Madrid']))
[('Denmark', 0.7606724500656128),
('Italy', 0.7585107088088989),
('Austria', 0.7528095841407776),
('Greece', 0.7401891350746155),
('Egypt', 0.7314825057983398),
('Russia', 0.7225484848022461),
('Great_Britain', 0.7184625864028931),
('Norway', 0.7148114442825317),
('Rome', 0.7076312303543091),
('kingdom', 0.6994863748550415)]
Das Ergebnis in Kapitel 9 war übrigens wie folgt, aber diesmal liegt Griechenland ebenfalls auf dem 4. Platz und Sie können sehen, dass korrektere Daten ausgegeben werden.
Spain 0.8178213952646727
Sweden 0.8071582503798717
Austria 0.7795030693787409
Italy 0.7466099164394225
Germany 0.7429125848677439
Belgium 0.729240312232219
Netherlands 0.7193045612969573
Télévisions 0.7067876635156688
Denmark 0.7062857691945504
France 0.7014078181006329