Il s'agit de l'enregistrement de la 92e «Application aux données d'analogie» de Traitement du langage 100 knock 2015.
Le calcul des vecteurs de mots et l'extraction de mots similaires sont effectués de deux manières: en utilisant les données vectorielles de mots au format Numpy faites à la main au chapitre 9 et en utilisant Gensim
. Vous pouvez ressentir les merveilles de «Gensim» telles que la vitesse de calcul.
Lien | Remarques |
---|---|
092.Application aux données d'analogie_1.ipynb | LienGitHubduprogrammederéponse(faitmaison) |
092.Application aux données d'analogie_2.ipynb | LienGitHubduprogrammederéponse(VersionGensim) |
100 coups de traitement du langage amateur:92 | 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 |
---|---|
gensim | 3.8.1 |
numpy | 1.17.4 |
pandas | 0.25.3 |
Au chapitre 10, nous continuerons à travailler sur l'apprentissage des vecteurs de mots du chapitre précédent.
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.
import csv
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('./../09.Méthode de l'espace vectoriel(I)/085.matrix_x300.npz')['arr_0']
print('matrix_x300 Shape:', matrix_x300.shape)
group_t = pd.read_pickle('./../09.Méthode de l'espace vectoriel(I)/083_group_t.zip')
#Calcul de similarité cosinus
def get_cos_similarity(v1, v1_norm, 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))
#Obtenez des mots avec une grande similitude
def get_similar_word(cols):
try:
vec = matrix_x300[group_t.index.get_loc(cols[1])] \
- matrix_x300[group_t.index.get_loc(cols[0])] \
+ matrix_x300[group_t.index.get_loc(cols[2])]
vec_norm = np.linalg.norm(vec)
#Excluez vos propres 3 mots utilisés dans le calcul
cos_sim = [-1 if group_t.index[i] in cols[:3] else get_cos_similarity(vec, vec_norm, matrix_x300[i]) for i in range(len(group_t))]
index = np.argmax(cos_sim)
cols.extend([group_t.index[index], cos_sim[index]])
except KeyError:
cols.extend(['', -1])
return cols
#Lire les données d'évaluation
with open('./091.analogy_family.txt') as file_in:
result = [get_similar_word(line.split()) for line in file_in]
with open('092.analogy_word2vec_1.txt', 'w') as file_out:
writer = csv.writer(file_out, delimiter='\t', lineterminator='\n')
writer.writerows(result)
J'obtiens des mots similaires ici. Je ne l'ai pas écrit dans la question, mais j'essaie d'exclure les mots utilisés dans le calcul. Je ne sais pas si cela vous convient, mais son exclusion augmentera le pourcentage de bonnes réponses.
cos_sim = [-1 if group_t.index[i] in cols[:3] else get_cos_similarity(vec, vec_norm, matrix_x300[i]) for i in range(len(group_t))]
Les mots qui ne figurent pas sur le corpus ont une similitude de -1.
except KeyError:
cols.extend(['', -1])
Après cela, il y a de nombreux contenus écrits en frappant jusqu'à présent, et il n'y a pas grand chose de spécial dans le code, et il n'y a pas d'explication particulière. Si je le force, le traitement prendra environ 17 minutes, alors j'ai essayé d'écrire autant que possible dans la notation d'inclusion de liste. Si vous affichez les 10 premières lignes du contenu du fichier de sortie, cela ressemble à ceci. Cela peut ou non correspondre.
csv:091.analogy_family.txt
boy girl brother sister son 0.8804225566858075
boy girl brothers sisters sisters 0.8426790631091488
boy girl dad mom mum 0.8922065515297802
boy girl father mother mother 0.847494164274725
boy girl grandfather grandmother grandmother 0.820584129035444
boy girl grandpa grandma -1
boy girl grandson granddaughter grandfather 0.6794604718339272
boy girl groom bride seduce 0.5951703092628703
boy girl he she she 0.8144501058726975
boy girl his her Mihailov 0.5752869854520882
Omission
import csv
from gensim.models import Word2Vec
model = Word2Vec.load('./090.word2vec.model')
print(model)
#Obtenez des mots avec une grande similitude
def get_similar_word(cols):
try:
cos_sim = model.wv.most_similar(positive=[cols[1], cols[2]], negative=[cols[0]], topn=4)
for word, similarity in cos_sim:
#Excluez les 3 mots utilisés dans le calcul
if word not in cols[:2]:
cols.extend([word, similarity])
break
#Pour les mots ne faisant pas partie du corpus original
except KeyError:
cols.extend(['', -1])
return cols
#Lire les données d'évaluation
with open('./091.analogy_family.txt') as file_in:
result = [get_similar_word(line.split()) for line in file_in]
with open('./092.analogy_word2vec_2.txt', 'w') as file_out:
writer = csv.writer(file_out, delimiter='\t', lineterminator='\n')
writer.writerows(result)
C'est un peu plus mince que la version auto-fabriquée car il est fait à l'aide d'un package. Et, comme vous pouvez le voir lorsque vous l'exécutez, le processus est rapide! Cela prend environ 4 secondes et est ** plus de 200 fois plus rapide que la version faite maison **. Gensim est incroyable. Ceci est le résultat de sortie. ** Le pourcentage de bonnes réponses augmente également. ** **
csv:092.analogy_word2vec_2.txt
boy girl brother sister sister 0.745887041091919
boy girl brothers sisters sisters 0.8522343039512634
boy girl dad mom mum 0.7720432281494141
boy girl father mother mother 0.8608728647232056
boy girl grandfather grandmother granddaughter 0.8341050148010254
boy girl grandpa grandma -1
boy girl grandson granddaughter granddaughter 0.8497666120529175
boy girl groom bride bride 0.7476662397384644
boy girl he she she 0.7702984809875488
boy girl his her her 0.6540039777755737