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

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 9: Méthode de l'espace vectoriel (I)

enwiki-20150112-400-r10-105752.txt.bz2 Le texte de 105 752 articles est-il échantillonné au hasard au 1/10 des articles composés d'environ 400 mots ou plus parmi les articles de Wikipédia en anglais au 12 janvier 2015, compressé au format bzip2. y a-t-il. En utilisant ce texte comme corpus, je souhaite apprendre un vecteur (expression distribuée) qui exprime le sens d'un mot. Dans la première moitié du chapitre 9, le processus d'apprentissage du vecteur de mot est mis en œuvre en le divisant en plusieurs processus en appliquant l'analyse en composantes principales à la matrice de cooccurrence de contexte de mot créée à partir du corpus. Dans la seconde moitié du chapitre 9, le vecteur de mots (300 dimensions) obtenu par apprentissage est utilisé pour calculer la similitude des mots et analyser (analogique).

Notez que si le problème 83 est implémenté de manière obéissante, une grande quantité (environ 7 Go) de stockage principal sera nécessaire. Si vous manquez de mémoire, concevez un processus ou un corpus d'échantillonnage 1/100 enwiki-20150112-400-r100-10576.txt.bz2 Utilisez /nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2).

89. Analogie par composition additive

Lisez le vecteur de signification du mot obtenu en> 85, calculez vec ("Espagne") --vec ("Madrid") + vec ("Athènes"), et calculez 10 mots avec une grande similitude avec ce vecteur et leur similitude. Sortez-le.

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'


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)

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

# vec("Spain") - vec("Madrid") + vec("Athens")Calcul de similarité cosinus avec
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))]

#Afficher le top 10
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]))

Résultat de l'exécution:

Résultat d'exécution


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

Analogie par composition additive

La constructivité additive signifie apparemment que la signification peut être calculée en ajoutant ou en soustrayant des vecteurs. Une analogie est une analogie, et ici elle semble se référer à deviner une relation qui a déjà été confirmée en l'appliquant à autre chose.

Puisque le vecteur créé dans Problème 85 a une constructivité additive, la relation entre les mots peut être extraite en calculant la différence. Par exemple, si vous soustrayez "Madrid" de "Espagne" comme dans le problème, vous pouvez obtenir le sens de "un mot qui est utilisé comme la relation entre le pays et la capitale". Le problème cette fois est d'utiliser cela pour déduire le pays de la capitale "Athènes".

vec("Spain") - vec("Madrid") $ \fallingdotseq $ vec("?") - vec("Athens")

En raison de l'hypothèse que cette relation tient, si la formule est transformée

vec("?") $ \fallingdotseq $ vec("Spain") - vec("Madrid") + vec("Athens")

Ce sera. Vous pouvez calculer ce côté droit et rechercher des mots proches de ce vecteur comme dans Problème 88.

À propos du résultat de l'exécution

Si c'est la relation entre le pays et la capitale, la bonne réponse est «Grèce», mais le résultat était 8e. Cependant, puisque seuls les pays européens sont alignés dans les résultats, on peut dire que l'analogie est à peu près celle attendue. Il y a une limite car il n'est vectorisé que par l'information des mots environnants, mais c'est assez intéressant.

C'est tout pour le 90e 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: 24
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
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: 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
100 coups de traitement du langage amateur: 27
100 coups de traitement du langage amateur: 10
100 coups de traitement du langage amateur: 03