Es ist ein Herausforderungsrekord von 100 Sprachverarbeitungsklopfen 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).
enwiki-20150112-400-r10-105752.txt.bz2 Ist der Text von 105.752 Artikeln zufällig 1/10 aus den Artikeln ausgewählt, die zum 12. Januar 2015 aus etwa 400 Wörtern oder mehr der englischen Wikipedia-Artikel bestehen und im bzip2-Format komprimiert sind. Gibt es. Mit diesem Text als Korpus möchte ich einen Vektor (verteilten Ausdruck) lernen, der die Bedeutung eines Wortes ausdrückt. In der ersten Hälfte von Kapitel 9 wird der Prozess des Lernens des Wortvektors implementiert, indem er in mehrere Prozesse unterteilt wird, indem die Hauptkomponentenanalyse auf die aus dem Korpus erstellte Matrix für das gleichzeitige Auftreten von Wortkontexten angewendet wird. In der zweiten Hälfte von Kapitel 9 wird der durch Lernen erhaltene Wortvektor (300 Dimensionen) verwendet, um die Ähnlichkeit von Wörtern zu berechnen und zu analysieren (analog).
Beachten Sie, dass bei gehorsamer Implementierung von Problem 83 eine große Menge (ca. 7 GB) Hauptspeicher erforderlich ist. Wenn Ihnen der Speicher ausgeht, erstellen Sie einen Prozess oder ein 1/100 Stichproben-Korpus enwiki-20150112-400-r100-10576.txt.bz2. Verwenden Sie /nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2).
Lesen Sie den Bedeutungsvektor des in> 85 erhaltenen Wortes, berechnen Sie vec ("Spanien") --vec ("Madrid") + vec ("Athen") und finden Sie 10 Wörter mit hoher Ähnlichkeit zu diesem Vektor und ihrer Ähnlichkeit. Gib es aus.
main.py
# coding: utf-8
import pickle
from collections import OrderedDict
from scipy import io
import numpy as np
fname_dict_index_t = 'dict_index_t'
fname_matrix_x300 = 'matrix_x300'
def cos_sim(vec_a, vec_b):
'''Berechnung der Kosinusähnlichkeit
Vektor vec_a、vec_Finden Sie die Kosinusähnlichkeit von b
Rückgabewert:
Kosinusähnlichkeit
'''
norm_ab = np.linalg.norm(vec_a) * np.linalg.norm(vec_b)
if norm_ab != 0:
return np.dot(vec_a, vec_b) / norm_ab
else:
#Der niedrigste Wert, da nicht einmal beurteilt werden kann, ob die Vektornorm 0 ähnlich ist
return -1
#Wörterbuch lesen
with open(fname_dict_index_t, 'rb') as data_file:
dict_index_t = pickle.load(data_file)
#Matrix lesen
matrix_x300 = io.loadmat(fname_matrix_x300)['matrix_x300']
# vec("Spain") - vec("Madrid") + vec("Athens")Kosinusähnlichkeitsberechnung mit
vec = matrix_x300[dict_index_t['Spain']] \
- matrix_x300[dict_index_t['Madrid']] \
+ matrix_x300[dict_index_t['Athens']]
distances = [cos_sim(vec, matrix_x300[i])
for i in range(0, len(dict_index_t))]
#Top 10 anzeigen
index_sorted = np.argsort(distances)
keys = list(dict_index_t.keys())
for index in index_sorted[:-11:-1]:
print('{}\t{}'.format(keys[index], distances[index]))
Ausführungsergebnis
Spain 0.8915792748600528
Sweden 0.8719563254078373
Italy 0.8157221349558227
Austria 0.8086425542832402
Netherlands 0.7820356485764023
Denmark 0.7785976171354217
Belgium 0.7654520863664993
Greece 0.7513058649568729
Norway 0.749115358268825
France 0.7441934553247148
Additive Konstruktivität bedeutet anscheinend, dass die Bedeutung durch Addieren oder Subtrahieren von Vektoren berechnet werden kann. Eine Analogie ist eine Analogie, und hier scheint sie sich auf das Erraten einer Beziehung zu beziehen, die bereits durch Anwendung auf etwas anderes bestätigt wurde.
Da der in Problem 85 erstellte Vektor eine additive Konstruktivität aufweist, kann die Beziehung zwischen Wörtern durch Berechnung der Differenz extrahiert werden. Wenn Sie beispielsweise "Madrid" wie im Problem von "Spanien" subtrahieren, erhalten Sie die Bedeutung von "einem Wort, das wie die Beziehung zwischen dem Land und der Hauptstadt verwendet wird". Das Problem ist diesmal, dies zu nutzen, um das Land für die Hauptstadt "Athen" abzuleiten.
vec("Spain") - vec("Madrid") $ \fallingdotseq $ vec("?") - vec("Athens")
Aufgrund der Annahme, dass diese Beziehung gilt, wenn die Formel transformiert wird
vec("?") $ \fallingdotseq $ vec("Spain") - vec("Madrid") + vec("Athens")
Es wird sein. Sie können diese rechte Seite berechnen und Wörter in der Nähe dieses Vektors wie in Problem 88 nachschlagen.
Wenn es sich um die Beziehung zwischen dem Land und der Hauptstadt handelt, lautet die richtige Antwort "Griechenland", aber das Ergebnis war der 8. Platz. Da jedoch nur europäische Länder in den Ergebnissen aufgereiht sind, kann gesagt werden, dass die Analogie in etwa den Erwartungen entspricht. Es gibt eine Grenze, weil es nur durch die Information der umgebenden Wörter vektorisiert wird, aber es ist ziemlich interessant.
Das ist alles für den 90. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.
Recommended Posts