[PYTHON] 100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353

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 de référence

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

environnement

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

Tâche

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.

94. Calcul de similarité avec WordSimilarity-353

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.

Supplément de problème

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

Répondre

Programme de réponse personnalisé [094.Similarity calcul in WordSimilarity-353_1.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/10.%E3%83%99%E3%82%AF % E3% 83% 88% E3% 83% AB% E7% A9% BA% E9% 96% 93% E6% B3% 95% 20 (II) /094.WordSimilarity-353%E3%81%A7%E3% 81% AE% E9% A1% 9E% E4% BC% BC% E5% BA% A6% E8% A8% 88% E7% AE% 97_1.ipynb)

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)

Répondre au commentaire

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

Programme de réponse de version Gensim [094.Similarity calcul with WordSimilarity-353_2.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/10.%E3%83%99%E3%82% AF% E3% 83% 88% E3% 83% AB% E7% A9% BA% E9% 96% 93% E6% B3% 95% 20 (II) /094.WordSimilarity-353%E3%81%A7%E3 % 81% AE% E9% A1% 9E% E4% BC% BC% E5% BA% A6% E8% A8% 88% E7% AE% 97_2.ipynb)

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)

Répondre au commentaire

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

Recommended Posts

100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353
100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
Traitement du langage 100 knocks-88: 10 mots à haute similitude
Traitement du langage 100 Knock-87: similitude des mots
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
100 traitements de langage avec Python
100 traitements de langage avec Python (chapitre 3)
100 traitement du langage knock-31 (en utilisant des pandas): verbe
100 traitement du langage knock-73 (en utilisant scikit-learn): apprentissage
100 traitement du langage knock-74 (en utilisant scicit-learn): prédiction
100 traitement du langage knock-38 (en utilisant des pandas): histogramme
100 traitement du langage knock-97 (en utilisant scicit-learn): clustering k-means
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
100 Language Processing Knock-33 (en utilisant des pandas): nom sahen
100 coups de traitement linguistique (2020): 28
100 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitement de la langue knock-96 (en utilisant Gensim): Extraction du vecteur lié au nom du pays
100 traitement du langage knock-35 (utilisant des pandas): concaténation de nomenclature
100 traitements de langage avec Python (chapitre 2, partie 1)
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 Language Processing Knock-39 (en utilisant des pandas): la loi de Zipf
100 traitement de langage knock-34 (utilisant des pandas): "B of A"
100 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement de 100 langues knock-98 (en utilisant des pandas): Clustering par méthode Ward
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 traitement du langage knock-99 (à l'aide de pandas): visualisation par t-SNE
100 traitement du langage knock-72 (en utilisant Stanford NLP): Extraction d'identité
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 Traitement du langage Knock-52: Stemming
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
Traitement du langage 100 knock-80 (remplacé par une expression régulière): formatage du corpus
100 Language Processing Knock: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)
100 Language Processing Knock-83 (en utilisant des pandas): Mesure de la fréquence des mots / contextes
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
100 traitement du langage Knock-51: découpage de mots
100 Language Processing Knock-58: Extraction de Taple
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock-25: Extraction de modèles