Il s'agit de l'enregistrement du 94e "Calcul de similarité avec WordSimilarity-353" de Traitement de langue 100 knock 2015. Calcule la similitude entre les mots du fichier. Techniquement, ce n'est qu'un petit changement de codage pour ce que j'ai fait jusqu'à présent.
Lien | Remarques |
---|---|
094.WordSimilarity-Calcul de similarité à 353_1.ipynb | Lien GitHub du programme de réponse |
094.WordSimilarity-Calcul de similarité à 353_2.ipynb | Lien GitHub pour le programme de réponse de la version Gensim |
100 coups de traitement du langage amateur:94 | 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.
Saisissez les données d'évaluation de The WordSimilarity-353 Test Collection et utilisez les mots des première et deuxième colonnes. Créez un programme qui calcule la similitude et ajoute la valeur de similarité à la fin de chaque ligne. Appliquez ce programme au vecteur de mot créé en 85 et au vecteur de mot créé en 90.
Lorsque j'ai téléchargé le fichier ZIP, il y avait plusieurs fichiers, et j'ai utilisé «combiné.tab» dedans. La première ligne est la ligne d'en-tête, il y a deux mots dans les deux premières colonnes, et il semble que la valeur numérique que les humains jugent de la similitude vient à la troisième colonne (similarité sur 10 points). Pour la similarité cosinus, calculez sa similitude et définissez-la dans la 4ème colonne.
combined.tab
Word 1 Word 2 Human (mean)
love sex 6.77
tiger cat 7.35
tiger tiger 10.00
book paper 7.46
computer keyboard 7.62
computer internet 7.58
plane car 5.77
train car 6.31
telephone communication 7.50
Omission
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(line):
try:
v1 = matrix_x300[group_t.index.get_loc(line[0])]
v2 = matrix_x300[group_t.index.get_loc(line[1])]
#Si le vecteur est tout zéro-Renvoie 1
if np.count_nonzero(v1) == 0 \
or np.count_nonzero(v2) == 0:
line.extend([-1])
else:
line.extend([np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))])
except:
line.extend([-1])
return line
#Lire les données d'évaluation
with open('./combined.tab') as file_in:
reader = csv.reader(file_in, delimiter='\t')
header = next(reader)
result = [get_cos_similarity(line) for line in reader]
with open('094.combine_1.txt', 'w') as file_out:
writer = csv.writer(file_out, delimiter='\t', lineterminator='\n')
writer.writerows(result)
Il n'y a pas d'explication technique car ce n'est qu'une combinaison du contenu jusqu'à présent. Le résultat est généré sous forme de fichier texte délimité par des tabulations sans lignes d'en-tête. C'est peut-être naturel, mais c'est assez différent de la similitude établie par les humains. Cela n'extrait pas les mots similaires, donc cela prend moins d'une seconde.
text:094.combine_1.txt
love sex 6.77 0.28564147035983395
tiger cat 7.35 0.848285056343736
tiger tiger 10.00 1.0000000000000002
book paper 7.46 0.4900762715360672
computer keyboard 7.62 0.09513773584009234
computer internet 7.58 0.2659421289876719
plane car 5.77 0.48590778050802136
train car 6.31 0.2976902017313069
telephone communication 7.50 0.1848868997304664
television radio 6.77 0.7724947668094843
Omission
import csv
import numpy as np
from gensim.models import Word2Vec
model = Word2Vec.load('./090.word2vec.model')
print(model)
#Calcul de similarité cosinus
def get_cos_similarity(line):
try:
v1 = model.wv[line[0]]
v2 = model.wv[line[1]]
#Si le vecteur est tout zéro-Renvoie 1
if np.count_nonzero(v1) == 0 \
or np.count_nonzero(v2) == 0:
line.extend([-1])
else:
line.extend([np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))])
except KeyError:
line.extend([-1])
return line
#Lire les données d'évaluation
with open('./combined.tab') as file_in:
reader = csv.reader(file_in, delimiter='\t')
header = next(reader)
result = [get_cos_similarity(line) for line in reader]
with open('094.combine_2.txt', 'w') as file_out:
writer = csv.writer(file_out, delimiter='\t', lineterminator='\n')
writer.writerows(result)
Ce n'est pas très différent de mon propre programme. Quant au résultat, le résultat est bien meilleur dans la version Gensim que dans le programme self-made.
text:094.combine_2.txt
love sex 6.77 0.5481953
tiger cat 7.35 0.7811356
tiger tiger 10.00 1.0
book paper 7.46 0.5549785
computer keyboard 7.62 0.6746693
computer internet 7.58 0.6775914
plane car 5.77 0.5873176
train car 6.31 0.6229327
telephone communication 7.50 0.52026355
television radio 6.77 0.7744317
Omission