Dies ist die Aufzeichnung der 92. "Anwendung auf Analogiedaten" von Language Processing 100 Knock 2015. Die Wortvektorberechnung und das Extrahieren ähnlicher Wörter werden auf zwei Arten durchgeführt: unter Verwendung der in Kapitel 9 handgefertigten Wortvektordaten im Numpy-Format und unter Verwendung von "Gensim". Sie können die Wunderbarkeit von "Gensim" wie die Geschwindigkeit der Berechnung spüren.
Verknüpfung | Bemerkungen |
---|---|
092.Anwendung auf Analogiedaten_1.ipynb | AntwortprogrammGitHubLink(selbstgemacht) |
092.Anwendung auf Analogiedaten_2.ipynb | AntwortprogrammGitHubLink(Gensim-Version) |
100 Klicks Amateur-Sprachverarbeitung:92 | 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 |
pandas | 0.25.3 |
In Kapitel 10 werden wir weiter daran arbeiten, Wortvektoren aus dem vorherigen Kapitel zu lernen.
Für jeden Fall der in> 91 erstellten Bewertungsdaten wird vec (Wort in der zweiten Spalte) --vec (Wort in der ersten Spalte) + vec (Wort in der dritten Spalte) berechnet, und der Vektor und die Ähnlichkeit sind Finden Sie das höchste Wort und seine Ähnlichkeit. Fügen Sie das erhaltene Wort und die Ähnlichkeit am Ende jedes Falles hinzu. Wenden Sie dieses Programm auf den in 85 erstellten Wortvektor und den in 90 erstellten Wortvektor an.
import csv
import numpy as np
import pandas as pd
#Ich habe beim Speichern keine Argumente angegeben'arr_0'Gespeichert in
matrix_x300 = np.load('./../09.Vektorraummethode(I)/085.matrix_x300.npz')['arr_0']
print('matrix_x300 Shape:', matrix_x300.shape)
group_t = pd.read_pickle('./../09.Vektorraummethode(I)/083_group_t.zip')
#Berechnung der Kosinusähnlichkeit
def get_cos_similarity(v1, v1_norm, v2):
#Wenn der Vektor alle Null ist-Rückgabe 1
if np.count_nonzero(v2) == 0:
return -1
else:
return np.dot(v1, v2) / (v1_norm * np.linalg.norm(v2))
#Holen Sie sich Wörter mit hoher Ähnlichkeit
def get_similar_word(cols):
try:
vec = matrix_x300[group_t.index.get_loc(cols[1])] \
- matrix_x300[group_t.index.get_loc(cols[0])] \
+ matrix_x300[group_t.index.get_loc(cols[2])]
vec_norm = np.linalg.norm(vec)
#Schließen Sie Ihre eigenen 3 Wörter aus, die bei der Berechnung verwendet wurden
cos_sim = [-1 if group_t.index[i] in cols[:3] else get_cos_similarity(vec, vec_norm, matrix_x300[i]) for i in range(len(group_t))]
index = np.argmax(cos_sim)
cols.extend([group_t.index[index], cos_sim[index]])
except KeyError:
cols.extend(['', -1])
return cols
#Bewertungsdaten lesen
with open('./091.analogy_family.txt') as file_in:
result = [get_similar_word(line.split()) for line in file_in]
with open('092.analogy_word2vec_1.txt', 'w') as file_out:
writer = csv.writer(file_out, delimiter='\t', lineterminator='\n')
writer.writerows(result)
Ich bekomme hier ähnliche Worte. Ich habe es nicht in die Frage geschrieben, aber ich versuche, die in der Berechnung verwendeten Wörter auszuschließen. Ich weiß nicht, ob dies in Ordnung ist, aber wenn ich es ausschließe, erhöht sich der Prozentsatz der richtigen Antworten.
cos_sim = [-1 if group_t.index[i] in cols[:3] else get_cos_similarity(vec, vec_norm, matrix_x300[i]) for i in range(len(group_t))]
Wörter, die nicht auf dem Korpus stehen, haben eine Ähnlichkeit von -1.
except KeyError:
cols.extend(['', -1])
Danach gibt es viele Inhalte, die bisher durch Klopfen geschrieben wurden, und es gibt nicht viel Besonderes im Code, und es gibt keine besondere Erklärung. Es dauert ungefähr 17 Minuten, um es gelinde auszudrücken, also habe ich versucht, so viel wie möglich in die Listeneinschlussnotation zu schreiben. Wenn Sie die ersten 10 Zeilen des Inhalts der Ausgabedatei löschen, sieht es so aus. Es kann übereinstimmen oder nicht.
csv:091.analogy_family.txt
boy girl brother sister son 0.8804225566858075
boy girl brothers sisters sisters 0.8426790631091488
boy girl dad mom mum 0.8922065515297802
boy girl father mother mother 0.847494164274725
boy girl grandfather grandmother grandmother 0.820584129035444
boy girl grandpa grandma -1
boy girl grandson granddaughter grandfather 0.6794604718339272
boy girl groom bride seduce 0.5951703092628703
boy girl he she she 0.8144501058726975
boy girl his her Mihailov 0.5752869854520882
Unterlassung
import csv
from gensim.models import Word2Vec
model = Word2Vec.load('./090.word2vec.model')
print(model)
#Holen Sie sich Wörter mit hoher Ähnlichkeit
def get_similar_word(cols):
try:
cos_sim = model.wv.most_similar(positive=[cols[1], cols[2]], negative=[cols[0]], topn=4)
for word, similarity in cos_sim:
#Schließen Sie die 3 in der Berechnung verwendeten Wörter aus
if word not in cols[:2]:
cols.extend([word, similarity])
break
#Für Wörter, die nicht im ursprünglichen Korpus enthalten sind
except KeyError:
cols.extend(['', -1])
return cols
#Bewertungsdaten lesen
with open('./091.analogy_family.txt') as file_in:
result = [get_similar_word(line.split()) for line in file_in]
with open('./092.analogy_word2vec_2.txt', 'w') as file_out:
writer = csv.writer(file_out, delimiter='\t', lineterminator='\n')
writer.writerows(result)
Es ist etwas schlanker als die selbst erstellte Version, da es mit einem Paket erstellt wird. Und wie Sie sehen können, wenn Sie es ausführen, ist der Prozess schnell! Es dauert ungefähr 4 Sekunden und ist ** mehr als 200 Mal schneller als die selbst erstellte Version **. Gensim ist unglaublich. Dies ist das Ausgabeergebnis. ** Der Prozentsatz der richtigen Antworten steigt ebenfalls. ** ** **
csv:092.analogy_word2vec_2.txt
boy girl brother sister sister 0.745887041091919
boy girl brothers sisters sisters 0.8522343039512634
boy girl dad mom mum 0.7720432281494141
boy girl father mother mother 0.8608728647232056
boy girl grandfather grandmother granddaughter 0.8341050148010254
boy girl grandpa grandma -1
boy girl grandson granddaughter granddaughter 0.8497666120529175
boy girl groom bride bride 0.7476662397384644
boy girl he she she 0.7702984809875488
boy girl his her her 0.6540039777755737