Il s'agit du record du 88e "10 mots à haute similitude" de Traitement linguistique 100 knock 2015. Extrayez des types similaires de chaque mot. C'est également le processus que vous souhaitez effectuer à partir de votre boîte aux lettres ou de vos minutes. Techniquement, c'est presque le même que le contenu précédent.
Lien | Remarques |
---|---|
088.10 mots à forte similitude.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:88 | 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 |
---|---|
numpy | 1.17.4 |
pandas | 0.25.3 |
enwiki-20150112-400-r10-105752.txt.bz2 Le texte de 105 752 articles est-il échantillonné au hasard au 1/10 des articles composés d'environ 400 mots ou plus parmi les articles de Wikipedia anglais au 12 janvier 2015, compressé au format bzip2. y a-t-il. En utilisant ce texte comme corpus, je souhaite apprendre un vecteur (expression distribuée) qui exprime le sens d'un mot. Dans la première moitié du chapitre 9, le processus d'apprentissage du vecteur de mot est mis en œuvre en le divisant en plusieurs processus en appliquant l'analyse en composantes principales à la matrice de cooccurrence de contexte de mot créée à partir du corpus. Dans la seconde moitié du chapitre 9, le vecteur de mots (300 dimensions) obtenu par apprentissage est utilisé pour calculer la similitude des mots et analyser (analogique).
Notez que si le problème 83 est implémenté de manière obéissante, une grande quantité (environ 7 Go) de stockage principal sera nécessaire. Si vous manquez de mémoire, concevez un processus ou un corpus d'échantillonnage 1/100 enwiki-20150112-400-r100-10576.txt.bz2 Utilisez /nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2).
Cette fois * "Corpus d'échantillonnage 1/100 [enwiki-20150112-400-r100-10576.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-" 400-r100-10576.txt.bz2) "* est utilisé.
Lisez le vecteur de signification du mot obtenu en> 85, et sortez 10 mots avec une forte similitude cosinus avec "England" et leur similitude.
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('085.matrix_x300.npz')['arr_0']
print('matrix_x300 Shape:', matrix_x300.shape)
# 'Lisez le vecteur de mot anglais et calculez la norme
v1 = matrix_x300[group_t.index.get_loc('England')]
v1_norm = np.linalg.norm(v1)
#Calcul de similarité cosinus
def get_cos_similarity(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))
cos_sim = [get_cos_similarity(matrix_x300[i]) for i in range(len(group_t))]
print('Cosign Similarity result length:', len(cos_sim))
#Trier en quittant l'index
cos_sim_sorted = np.argsort(cos_sim)
#De la toute fin du tableau triés par ordre croissant-11(-12)Sortie jusqu'à un par un(Le sommet est l'Angleterre lui-même)
for index in cos_sim_sorted[:-12:-1]:
print('{}\t{}'.format(group_t.index[index], cos_sim[index]))
La partie de calcul de similarité cosinus est transformée en fonction. À en juger par la fonction count_nonzero
, -1 est renvoyé lorsque tous les vecteurs sont à zéro.
#Calcul de similarité cosinus
def get_cos_similarity(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))
Le résultat est obtenu à la fois avec la notation d'inclusion pour le tableau.
cos_sim = [get_cos_similarity(matrix_x300[i]) for i in range(len(group_t))]
Pour le calcul ci-dessus, j'ai pensé qu'il serait plus rapide d'utiliser cette ʻapply_along_axis` pour numpy, mais c'était plutôt lent, donc elle n'est pas adoptée.
cos_sim = np.apply_along_axis(get_cos_similarity, 1, matrix_x300)
Ceci est le résultat final. L'Écosse et l'Italie sont en tête. Il est surprenant qu'il y ait aussi le Japon. Est-ce parce que c'est un pays insulaire?
England 1.0000000000000002
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
Recommended Posts