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 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.
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']
# 'United States'Wann'U.S'Cosinus-Ähnlichkeitsanzeige
vec_a = matrix_x300[dict_index_t['United_States']]
vec_b = matrix_x300[dict_index_t['U.S']]
print(cos_sim(vec_a, vec_b))
Ausführungsergebnis
0.832760703627
Die Kosinusähnlichkeit ist ein Maß dafür, wie gut zwei Vektoren in derselben Richtung ausgerichtet sind. Es ist nicht möglich zu beurteilen, ob die Wörter ähnlich sind wie sie sind, aber dank der Vektorisierung der Wörter ist es jetzt möglich zu beurteilen, ob sie ähnlich sind, indem die Kosinusähnlichkeit untersucht wird.
Die Kosinusähnlichkeit der Vektoren $ \ boldsymbol {A} $ und $ \ boldsymbol {B} $ kann durch die folgende Formel berechnet werden.
Apropos$ |\boldsymbol{A}| numpy.linalg.norm()
Wird benötigt bei.
Die maximale Kosinusähnlichkeit beträgt 1, und je höher der Wert, desto ähnlicher. Das Ergebnis dieser Hinrichtung war ungefähr 0,83, also denke ich, dass "USA" und "USA" ziemlich ähnliche Wörter sind. Es ist ziemlich erstaunlich zu erraten, dass "USA" und "USA" enge Worte sind, wenn man sich nur auf den Wikipedia-Artikel stützt.
Weitere Informationen zur Kosinusähnlichkeit finden Sie bei Google unter "Kosinusähnlichkeit".
Das ist alles für den 88. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.
Recommended Posts