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 | 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 |
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 |
Au chapitre 10, nous continuerons à travailler sur l'apprentissage des vecteurs de mots du chapitre précédent.
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.
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']))
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 |
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
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
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
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