[PYTHON] 100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec

Il s'agit d'un enregistrement de la 90e "Apprendre avec word2vec" de Language Processing 100 Knock 2015. La question est, faisons facilement ce que nous avons fait au chapitre 9 en utilisant un paquet. Le fait que le contenu que j'ai désespérément créé en me souciant du manque de mémoire puisse être créé avec environ 3 lignes de code est irrésistible, mais je suis tout à fait conscient de sa splendeur. Cette fois, au lieu d'utiliser [word2vec] de Google (https://code.google.com/p/word2vec/) spécifié dans la question, l'open source Geinsim /) Est utilisé. J'ai entendu dire que les paquets sont mis à jour fréquemment et sont souvent utilisés (je ne les ai pas étudiés à fond à cause de mes connaissances).

Lien de référence

Lien Remarques
090.Apprendre avec word2vec.ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:90 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

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.

90. Apprendre avec word2vec

Appliquez word2vec au corpus créé en 81 et apprenez le mot vecteur. De plus, convertissez le format du vecteur de mot appris et exécutez le programme 86-89.

Répondre

Programme de réponse [090.word2vec learning.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) /090.word2vec%E3%81%AB%E3%82%88%E3%82%8B% E5% AD% A6% E7% BF% 92.ipynb)

from pprint import pprint

from gensim.models import word2vec

corpus = word2vec.Text8Corpus('./../09.Méthode de l'espace vectoriel(I)/081.corpus.txt')

model = word2vec.Word2Vec(corpus, size=300)
model.save('090.word2vec.model')

# 86.Affichage du vecteur de mot
pprint(model.wv['United_States'])

# 87.Similitude des mots
print(np.dot(model.wv['United_States'], model.wv['U.S']) / (np.linalg.norm(model.wv['United_States']) * np.linalg.norm(model.wv['U.S'])))

# 88.10 mots à forte similitude
pprint(model.wv.most_similar('England'))

# 89.Analogie par composition additive
# vec("Spain") - vec("Madrid") + vec("Athens")
pprint(model.wv.most_similar(positive=['Spain', 'Athens'], negative=['Madrid']))

Répondre au commentaire

Génération de vecteur de mot

Tout d'abord, lisez le fichier. Je pensais qu'il y avait de nombreux exemples d'utilisation de la fonction Text8Corpus, donc je me suis demandé ce qu'était le Text8Corpus en premier lieu. Selon l'article «Créer une version japonaise du corpus text8 et apprendre les expressions distribuées» (https://hironsan.hatenablog.com/entry/japanese-text8-corpus), text8 est une donnée Wikipédia qui a été traitée comme suit. Il semble.

Je pense qu'il y avait des lettres majuscules, mais j'ai senti qu'elles remplissaient généralement les conditions, j'ai donc utilisé Text8Corpus.

corpus = word2vec.Text8Corpus('./../09.Méthode de l'espace vectoriel(I)/081.corpus.txt')

Tout ce que vous avez à faire est d'utiliser la fonction Word2Vec pour compléter le vecteur de mot de 300 dimensions. Il a fallu moins de 4 minutes pour générer. Sensationnel ... Je n'ai utilisé aucune option, mais la liste d'options de gemsim word2vec était facile à comprendre.

model = word2vec.Word2Vec(corpus, size=300)

Ensuite, enregistrez le fichier pour les coups suivants.

model.save('090.word2vec.model')

Ensuite, il semble que les 3 fichiers suivants sont créés. C'est désagréable de ne pas en être un.

Fichier Taille
090.word2vec.model 5MB
090.word2vec.model.trainables.syn1neg.npy 103MB
090.word2vec.model.wv.vectors.npy 103MB

86. Affichage des vecteurs de mots

Lisez le mot signifiant vecteur obtenu en> 85 et affichez le vecteur "États-Unis". Cependant, notez que "États-Unis" est appelé en interne "États-Unis".

Il y a un vecteur dans model.wv, alors spécifiez-le simplement.

pprint(model.wv['United_States'])
array([ 2.3478289 , -0.61461514,  0.0478639 ,  0.6709404 ,  1.1090833 ,
       -1.0814637 , -0.78162867, -1.2584596 , -0.04286158,  1.2928476 ,
Résultat omis

87. Similitude des mots

Lisez le mot signifiant vecteur obtenu en> 85 et calculez la similitude cosinus entre «États-Unis» et «États-Unis». Cependant, notez que «U.S.

Utilisez model pour calculer la similitude cosinus entre les mêmes vecteurs que dans le chapitre 9. Au chapitre 9, il était de 0,837516976284694, ce qui donne un degré plus élevé de similitude.

print(np.dot(model.wv['United_States'], model.wv['U.S']) / (np.linalg.norm(model.wv['United_States']) * np.linalg.norm(model.wv['U.S'])))
0.8601596

88. 10 mots avec une grande similitude

Lisez le vecteur de signification du mot obtenu en> 85, et sortez 10 mots avec une forte similitude cosinus avec "England" et leur similitude.

Vous pouvez sortir simplement en utilisant la fonction modst_similar.

pprint(model.wv.most_similar('England'))
[('Scotland', 0.7884809970855713),
 ('Wales', 0.7721374034881592),
 ('Ireland', 0.6838206052780151),
 ('Britain', 0.6335258483886719),
 ('Hampshire', 0.6147407293319702),
 ('London', 0.6021863222122192),
 ('Cork', 0.5809425115585327),
 ('Manchester', 0.5767091512680054),
 ('Liverpool', 0.5765234231948853),
 ('Orleans', 0.5624016523361206)]

À propos, le résultat du chapitre 9 était le suivant, mais cette fois, vous pouvez voir que les mots liés à l'Angleterre apparaissent plus haut et que des données plus correctes sont produites.

Scotland    0.6364961613062289
Italy   0.6033905306935802
Wales   0.5961887337227456
Australia   0.5953277272306978
Spain   0.5752511915429617
Japan   0.5611603300967408
France  0.5547284075334182
Germany 0.5539239745925412
United_Kingdom  0.5225684232409136
Cheshire    0.5125286144779688

89. Analogie par composition additive

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.

Si vous passez «positif» et «négatif» à la fonction «modst_similar», elle calculera et affichera 10 mots avec une grande similitude.

pprint(model.wv.most_similar(positive=['Spain', 'Athens'], negative=['Madrid']))
[('Denmark', 0.7606724500656128),
 ('Italy', 0.7585107088088989),
 ('Austria', 0.7528095841407776),
 ('Greece', 0.7401891350746155),
 ('Egypt', 0.7314825057983398),
 ('Russia', 0.7225484848022461),
 ('Great_Britain', 0.7184625864028931),
 ('Norway', 0.7148114442825317),
 ('Rome', 0.7076312303543091),
 ('kingdom', 0.6994863748550415)]

À propos, le résultat du chapitre 9 était le suivant, mais cette fois, la Grèce est également à la 4e place et vous pouvez voir que des données plus correctes sont produites.

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

100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 traitement du langage knock-73 (en utilisant scikit-learn): apprentissage
100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
100 coups de traitement du langage avec Python 2015
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
100 traitements de langage avec Python
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock 2020 Chapitre 6: Apprentissage automatique
100 traitement du langage knock-31 (en utilisant des pandas): verbe
100 traitement du langage knock-74 (en utilisant scicit-learn): prédiction
100 traitement du langage knock-38 (en utilisant des pandas): histogramme
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
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 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitement du langage knock-35 (utilisant des pandas): concaténation de nomenclature
100 traitements de langage avec Python (chapitre 2, partie 1)
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"
Traitement du langage 100 knocks-88: 10 mots à haute similitude
100 traitement de la langue knock-96 (en utilisant Gensim): Extraction du vecteur lié au nom du pays
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 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
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 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 coups de traitement du langage amateur: 09
100 traitement du langage knock-99 (à l'aide de pandas): visualisation par t-SNE
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-72 (en utilisant Stanford NLP): Extraction d'identité
Traitement du langage 100 knock-80 (remplacé par une expression régulière): formatage du corpus
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 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