[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 92

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).

Kapitel 10: Vektorraummethode (II)

In Kapitel 10 werden wir weiter daran arbeiten, Wortvektoren aus dem vorherigen Kapitel zu lernen.

92. Anwendung auf Analogiedaten

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.

Der fertige Code:

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'
fname_input = 'family.txt'
fname_output = 'family_out.txt'


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)
keys = list(dict_index_t.keys())

#Matrix lesen
matrix_x300 = io.loadmat(fname_matrix_x300)['matrix_x300']

#Bewertungsdaten lesen
with open(fname_input, 'rt') as data_file, \
		open(fname_output, 'wt') as out_file:

	for line in data_file:
		cols = line.split(' ')

		try:

			#Vektorberechnung
			vec = matrix_x300[dict_index_t[cols[1]]] \
					- matrix_x300[dict_index_t[cols[0]]] \
					+ matrix_x300[dict_index_t[cols[2]]]

			#Extrahieren Sie Wörter mit der höchsten Kosinusähnlichkeit
			dist_max = -1
			index_max = 0
			result = ''
			for i in range(len(dict_index_t)):
				dist = cos_sim(vec, matrix_x300[i])
				if dist > dist_max:
					index_max = i
					dist_max = dist

			result = keys[index_max]

		except KeyError:

			#Kosinusähnlichkeit von 0 Zeichen, wenn kein Wort vorhanden ist-Ausgabe bei 1
			result = ''
			dist_max = -1

		#Ausgabe
		print('{} {} {}'.format(line.strip(), result, dist_max), file=out_file)
		print('{} {} {}'.format(line.strip(), result, dist_max))

Ausführungsergebnis:

Das Ergebnis wird in "family_out.txt" gespeichert. Da die Verarbeitung einige Zeit in Anspruch nimmt, habe ich versucht, denselben Inhalt nicht nur in die Datei, sondern auch auf den Bildschirm auszugeben. Die Ausführungszeit beträgt 1 Stunde und 50 Minuten für den Wortvektor von Problem 85 auf Ihrem Computer, Problem 90. Der Wortvektor der Elemente / 890d34a40991dd634cdf) betrug ungefähr 25 Minuten. Gibt es eine Möglichkeit, es etwas schneller zu machen ...

Unten ist der Anfang des Ergebnisses für Problem 90.

Familie für den Wortvektor von Frage 90_out.Erster Teil von txt


boy girl brother sister brother 0.9401630421547305
boy girl brothers sisters brothers 0.8945072765275828
boy girl dad mom girl 0.7280971994658558
boy girl father mother father 0.9436608943376003
boy girl grandfather grandmother grandfather 0.8252139862667345
boy girl grandpa grandma  -1
boy girl grandson granddaughter granddaughter 0.8146889309237173
boy girl groom bride girl 0.7017715459762993
boy girl he she he 0.9651317504873835
boy girl his her his 0.9587287668802774
boy girl husband wife husband 0.9468113068648676
boy girl king queen king 0.9286736850752637
boy girl man woman man 0.9452997293828569
boy girl nephew niece niece 0.8271499425140075
boy girl policeman policewoman girl 0.7420750545104479
boy girl prince princess prince 0.7707574165422014
boy girl son daughter son 0.9564752654538731
boy girl sons daughters sons 0.9366514358470139
boy girl stepbrother stepsister  -1
boy girl stepfather stepmother girl 0.680540253333323
(Unten weggelassen)

Anwendung auf Analogiedaten

Was Sie mit diesem Problem tun, ist fast dasselbe wie Problem 89. Wiederholen Sie diesen Vorgang für das in Problem 91 erstellte Bewertungswort.

Darüber hinaus ist das in Problem 91 erstellte Bewertungswort möglicherweise nicht im Wortvektor enthalten. Wörter, die nicht in den Wikipedia-Stichprobendaten verwendet werden, sind nicht enthalten, und word2vec gibt an, dass niederfrequente Wörter entfernt werden sollen, sodass solche Wörter nicht enthalten sind. Wörter, die nicht enthalten sind, können nicht berechnet werden, daher geben die resultierenden Wörter eine leere Zeichenfolge aus und die Ähnlichkeit ist -1.

Der erste Teil des obigen Ausführungsergebnisses ist der Wortvektor von word2vec, der von Problem 90 erstellt wurde. Wenn Sie sich jedoch nur diesen ersten Teil ansehen, ist dies " "Junge Mädchen Enkel Enkel Tochter" und "Junge Mädchen Neffe Nichte", die anderen sind fast falsch ... Die richtige Antwortrate wird in Frage 93 unten berechnet.

Das ist alles für den 93. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.


Recommended Posts

100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 84
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 33
100 Amateur-Sprachverarbeitungsklopfen: 46
100 Amateur-Sprachverarbeitungsklopfen: 88
100 Amateur-Sprachverarbeitungsklopfen: 89
100 Amateur-Sprachverarbeitungsklopfen: 40
100 Amateur-Sprachverarbeitungsklopfen: 45
100 Amateur-Sprachverarbeitungsklopfen: 43
100 Amateur-Sprachverarbeitungsklopfen: 55
100 Amateur-Sprachverarbeitungsklopfen: 22
100 Amateur-Sprachverarbeitungsklopfen: 61
100 Amateur-Sprachverarbeitungsklopfen: 94
100 Amateur-Sprachverarbeitungsklopfen: 54
100 Amateur-Sprachverarbeitungsklopfen: 04
100 Amateur-Sprachverarbeitungsklopfen: 63
100 Amateur-Sprachverarbeitungsklopfen: 78
100 Amateur-Sprachverarbeitungsklopfen: 12
100 Amateur-Sprachverarbeitungsklopfen: 14
100 Amateur-Sprachverarbeitungsklopfen: 08
100 Amateur-Sprachverarbeitungsklopfen: 42
100 Amateur-Sprachverarbeitungsklopfen: 19
100 Amateur-Sprachverarbeitungsklopfen: 73
100 Amateur-Sprachverarbeitungsklopfen: 75
100 Amateur-Sprachverarbeitungsklopfen: 98
100 Amateur-Sprachverarbeitungsklopfen: 83
100 Amateur-Sprachverarbeitungsklopfen: 95
100 Amateur-Sprachverarbeitungsklopfen: 32
100 Amateur-Sprachverarbeitungsklopfen: 96
100 Amateur-Sprachverarbeitungsklopfen: 87
100 Amateur-Sprachverarbeitungsklopfen: 72
100 Amateur-Sprachverarbeitungsklopfen: 79
100 Amateur-Sprachverarbeitungsklopfen: 23
100 Amateur-Sprachverarbeitungsklopfen: 05
100 Amateur-Sprachverarbeitungsklopfen: 00
100 Amateur-Sprachverarbeitungsklopfen: 02
100 Amateur-Sprachverarbeitungsklopfen: 37
100 Amateur-Sprachverarbeitungsklopfen: 21
100 Amateur-Sprachverarbeitungsklopfen: 68
100 Amateur-Sprachverarbeitungsklopfen: 11
100 Amateur-Sprachverarbeitungsklopfen: 90
100 Amateur-Sprachverarbeitungsklopfen: 74
100 Amateur-Sprachverarbeitungsklopfen: 66
100 Amateur-Sprachverarbeitungsklopfen: 28
100 Amateur-Sprachverarbeitungsklopfen: 64
100 Amateur-Sprachverarbeitungsklopfen: 34
100 Amateur-Sprachverarbeitungsklopfen: 36
100 Amateur-Sprachverarbeitungsklopfen: 77
100 Amateur-Sprachverarbeitungsklopfen: 01
100 Amateur-Sprachverarbeitungsklopfen: 16