[PYTHON] 100 coups de traitement du langage amateur: 92

C'est un record de défi de 100 langues de traitement knock 2015. L'environnement est Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64 bits). Cliquez ici pour une liste des coups passés (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Chapitre 10: Méthode de l'espace vectoriel (II)

Au chapitre 10, nous continuerons à travailler sur l'apprentissage des vecteurs de mots du chapitre précédent.

92. Application aux données d'analogie

Pour chaque cas des données d'évaluation créées en> 91, vec (mot dans la deuxième colonne) --vec (mot dans la première colonne) + vec (mot dans la troisième colonne) est calculé, et le vecteur et la similitude sont Trouvez le mot le plus élevé et sa similitude. Ajoutez le mot obtenu et la similitude à la fin de chaque cas. Appliquez ce programme au vecteur de mot créé en 85 et au vecteur de mot créé en 90.

Le code fini:

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):
	'''Calcul de la similitude cosinus
Vecteur vec_a、vec_Trouver la similitude cosinus de b

Valeur de retour:
Similitude cosinus
	'''
	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:
		#La valeur la plus basse car il n'est même pas possible de juger si la norme vectorielle est similaire à 0
		return -1


#Lire le dictionnaire
with open(fname_dict_index_t, 'rb') as data_file:
		dict_index_t = pickle.load(data_file)
keys = list(dict_index_t.keys())

#Lecture de la matrice
matrix_x300 = io.loadmat(fname_matrix_x300)['matrix_x300']

#Lire les données d'évaluation
with open(fname_input, 'rt') as data_file, \
		open(fname_output, 'wt') as out_file:

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

		try:

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

			#Extraire les mots avec la plus grande similitude cosinus
			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:

			#Similitude cosinus de 0 caractère s'il n'y a pas de mot-Sortie à 1
			result = ''
			dist_max = -1

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

Résultat de l'exécution:

Le résultat est enregistré dans "family_out.txt". Comme le traitement prend du temps, j'ai essayé de produire le même contenu non seulement dans le fichier, mais également à l'écran. Le temps d'exécution est de 1 heure et 50 minutes pour le vecteur de mots du Problème 85 sur votre ordinateur, Problème 90 Le mot vecteur d'éléments / 890d34a40991dd634cdf) durait environ 25 minutes. Y a-t-il un moyen de le rendre un peu plus rapide ...

Voici le début du résultat pour Problème 90.

Famille pour le vecteur de mot de la question 90_out.Première partie de 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
(Omis ci-dessous)

Application aux données d'analogie

Ce que vous faites avec ce problème est presque identique au Problème 89. Répétez cette opération pour le mot d'évaluation créé dans Problème 91.

De plus, le mot d'évaluation créé dans Problème 91 peut ne pas être inclus dans le mot vecteur. Les mots qui ne sont pas utilisés dans les données d'échantillonnage de wikipedia ne sont pas inclus et word2vec spécifie de supprimer les mots à basse fréquence, de sorte que ces mots ne sont pas inclus. Les mots qui ne sont pas inclus ne peuvent pas être calculés, donc les mots résultants produisent une chaîne vide et la similitude est -1.

La première partie du résultat d'exécution ci-dessus est le vecteur de mots de word2vec créé par Problème 90. "garçon fille petit-fils petite-fille" et "garçon fille neveu nièce", les autres ont presque tort ... Le taux de réponse correcte est calculé à la question 93 ci-dessous.

C'est tout pour le 93e coup. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.


Recommended Posts

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