Il s'agit de l'enregistrement de la 89e «Analogie par circonscription additive» de Language Processing 100 Knock 2015. Puisqu'il s'agit d'une "composition additive", le résultat est obtenu en effectuant une opération vectorielle. C'est le fameux calcul "roi + femme-homme = princesse". C'est un calcul comme "boss-competents =?" Que je veux essayer dans diverses choses dans le monde.
Lien | Remarques |
---|---|
089.Analogie par composition additive.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:89 | Je vous suis toujours redevable de 100 coups de traitement linguistique |
type | version | Contenu |
---|---|---|
OS | Ubuntu18.04.01 LTS | Il fonctionne virtuellement |
pyenv | 1.2.15 | J'utilise pyenv car j'utilise parfois plusieurs environnements Python |
Python | 3.6.9 | python3 sur pyenv.6.J'utilise 9 3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8 Les packages sont gérés à l'aide de venv |
Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.
type | version |
---|---|
numpy | 1.17.4 |
pandas | 0.25.3 |
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 Wikipedia 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).
Cette fois * "Corpus d'échantillonnage 1/100 [enwiki-20150112-400-r100-10576.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-" 400-r100-10576.txt.bz2) "* est utilisé.
Lisez le vecteur de signification du mot obtenu en 85, calculez vec ("Espagne") --vec ("Madrid") + vec ("Athènes"), et trouvez 10 mots avec une grande similitude avec ce vecteur et leur similitude. Sortez-le.
import numpy as np
import pandas as pd
#Je n'ai spécifié aucun argument lors de l'enregistrement'arr_0'Stocké dans
matrix_x300 = np.load('085.matrix_x300.npz')['arr_0']
print('matrix_x300 Shape:', matrix_x300.shape)
group_t = pd.read_pickle('./083_group_t.zip')
# 'vec("Spain") - vec("Madrid") + vec("Athens")Calcul vectoriel
vec = matrix_x300[group_t.index.get_loc('Spain')] \
- matrix_x300[group_t.index.get_loc('Madrid')] \
+ matrix_x300[group_t.index.get_loc('Athens')]
vec_norm = np.linalg.norm(vec)
#Calcul de similarité cosinus
def get_cos_similarity(v2):
#Si le vecteur est tout zéro-Renvoie 1
if np.count_nonzero(v2) == 0:
return -1
else:
return np.dot(v1, v2) / (v1_norm * np.linalg.norm(v2))
cos_sim = [get_cos_similarity(matrix_x300[i]) for i in range(len(group_t))]
print('Cosign Similarity result length:', len(cos_sim))
#Trier en quittant l'index
cos_sim_sorted = np.argsort(cos_sim)
#De la toute fin du tableau triés par ordre croissant-10(-11)Sortie jusqu'à un par un
for index in cos_sim_sorted[:-11:-1]:
print('{}\t{}'.format(group_t.index[index], cos_sim[index]))
C'est la partie principale de ce temps. Il s'agit simplement d'ajouter et de soustraire.
# 'vec("Spain") - vec("Madrid") + vec("Athens")Calcul vectoriel
vec = matrix_x300[group_t.index.get_loc('Spain')] \
- matrix_x300[group_t.index.get_loc('Madrid')] \
+ matrix_x300[group_t.index.get_loc('Athens')]
Ceci est le résultat final. Puisque la capitale Madrid est soustraite de l'Espagne et Athènes est ajoutée, la Grèce est-elle la bonne réponse en termes de sens? La Grèce était à la 12e place avec une similitude cosinus de 0,686.
Spain 0.8178213952646727
Sweden 0.8071582503798717
Austria 0.7795030693787409
Italy 0.7466099164394225
Germany 0.7429125848677439
Belgium 0.729240312232219
Netherlands 0.7193045612969573
Télévisions 0.7067876635156688
Denmark 0.7062857691945504
France 0.7014078181006329
Recommended Posts