[PYTHON] 100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie

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

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

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.

92. Application aux données d'analogie

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.

Répondre

Programme de réponse personnalisé [092. Application à l'analogie data_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) /092.%E3%82%A2%E3%83%8A%E3% 83% AD% E3% 82% B8% E3% 83% BC% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 81% B8% E3% 81% AE% E9% 81% A9% E7% 94% A8_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(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)

Répondre au commentaire

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

Programme de réponse d'utilisation Gensim [092. Application to analogy data_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) /092.%E3%82%A2%E3%83%8A%E3 % 83% AD% E3% 82% B8% E3% 83% BC% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 81% B8% E3% 81% AE% E9% 81 % A9% E7% 94% A8_2.ipynb)

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)

Répondre au commentaire

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

Recommended Posts

100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
100 traitement du langage knock-91: Préparation des données d'analogie
100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
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 langage de traitement knock-70 (en utilisant Stanford NLP): Obtention et formatage des données
100 traitement du langage knock-97 (en utilisant scicit-learn): clustering k-means
100 Language Processing Knock-33 (en utilisant des pandas): nom sahen
100 Language Processing Knock-89: Analogie avec la constitution additive
100 coups de traitement linguistique (2020): 28
100 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword
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 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 traitement du langage knock-93 (en utilisant des pandas): calcul du taux de précision de la tâche d'analogie
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 14-16
100 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
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
Préparation à l’essai de «Data Science 100 Knock (traitement des données structurées)»
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 07-09
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
Une personne inexpérimentée en Python tente de frapper 100 traitement du langage 10 ~ 13
100 traitement du langage knock-99 (à l'aide de pandas): visualisation par t-SNE
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 05-06
100 traitement du langage knock-72 (en utilisant Stanford NLP): Extraction d'identité
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 00-04
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
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
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
100 coups de traitement du langage avec Python 2015
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