L'autre jour, j'ai participé à une session d'étude Python sponsorisée par Team Zet Co., Ltd. Le thème cette fois est "Texte des émotions en utilisant word2vec" "Une analyse". Pour être honnête, c'était un thème fou pour moi qui ai touché Python pour la première fois il y a une semaine, mais je me demande s'il est possible de découvrir comment la grammaire que j'étudie est mise à profit. Je me suis précipité et suis monté à bord un jour avant l'événement.
En passant, je vais laisser l'introduction dans cette mesure et entrer dans le sujet principal.
Modèle de réseau neuronal (apprentissage automatique) qui analyse les mots. En termes simples, il semble que les mots puissent être vectorisés et pondérés. (Pour plus d'informations, consultez ici)
Cette fois White Goat Corporation J'ai utilisé le modèle word2vec de.
Cliquez ici pour savoir comment installer word2vec (https://qiita.com/opankopan/items/2a999e0209504dca0a3f)
Tout d'abord Assurez-vous que les mots sont vectorisés par word2vec. Tapons ce code avec word2vec implémenté.
sample.py
import gensim.models.word2vec.Word2Vec as wv
print(len(model.wv["Amour"]))
model.wv["Amour"]
Puis
50 array([ 0.09289702, -0.16302316, -0.08176763, -0.29827002, 0.05170078, 0.07736144, -0.06452437, 0.19822665, -0.11941547, -0.11159643, 0.03224859, 0.03042056, -0.09065174, -0.1677992 , -0.19054233, 0.10354111, 0.02630192, -0.06666993, -0.06296805, 0.00500843, 0.26934028, 0.05273635, 0.0192258 , 0.2924312 , -0.23919497, 0.02317964, -0.21278766, -0.01392282, 0.24962738, 0.11264788, 0.05772769, 0.20941015, -0.01239212, -0.1256235 , -0.19794041, 0.1267719 , -0.12306885, 0.01006295, 0.08548331, -0.08936502, -0.05429656, -0.09757583, 0.10338967, 0.13714872, 0.23966707, 0.02216845, 0.02270923, 0.32569838, -0.0311841 , -0.00150117], dtype=float32)
Le résultat sera retourné. C'est le mot «amour» composé de 50 dimensions. Il montre que le composant est composé des éléments ci-dessus.
prochain
sample.py
#Extraire des mots similaires au mot-clé
sim_do = model.wv.most_similar(positive=["Petite amie"], topn=30)
#Comme il est répertorié, il est conçu pour une visualisation facile
print(*[" ".join([v, str("{:.5f}".format(s))]) for v, s in sim_do], sep="\n")
Quand tu frappes Elle-même 0.82959 Molly 0.82547 He 0.82406 Sylvia 0.80452 Charlie 0.80336 Amant 0.80197 Vous pouvez extraire des mots avec des significations similaires telles que. Le nombre sur le côté droit du mot est une quantification de combien vous êtes avec le mot «elle».
Aussi, lorsque vous voulez savoir combien de temps les deux mots sont
similarity = model.wv.similarity(w1="pomme", w2="fraise")
print(similarity)
similarity = model.wv.similarity(w1="pomme", w2="Aomori")
print(similarity)
similarity = model.wv.similarity(w1="pomme", w2="Anpanman")
print(similarity)
Puis 0.79041845 0.30861858 0.45321244 Sera retourné. Nous avons quantifié la similitude des mots w1 et w2. Aomori si vous dites pommes! Je pense que beaucoup de gens l'associent à Aomori, mais depuis que j'ai décidé qu'Anpanman est plus similaire à Aomori, je comprends que ce modèle n'est pas encore parfait.
Bien ici
"Roi" - "Homme" + "Femme" = "Reine" ???
Je vais considérer la fameuse proposition.
sample.py
sim_do = model.wv.most_similar(positive = ["Roi", "Femme"], negative=["Masculin"], topn=5)
print(*[" ".join([v, str("{:.5f}".format(s))]) for v, s in sim_do], sep="\n")
#Les mots positifs comparent le degré de similitude, les mots négatifs comparent le degré de dissimilarité
Le résultat est…
Princess 0.85313 Mariée 0.83918 Bête 0.83155 Sorcière 0.82982 Maiden 0.82356
J'ai eu une réponse similaire, même si elle ne correspondait pas exactement à la "reine".
Soit dit en passant, nous n'avons comparé que des mots jusqu'à présent, mais il est également possible de quantifier le type d'émotions qu'une phrase contient.
sample.py
import numpy as np
t = Tokenizer()
s = '
# Entrez vos phrases préférées.
'
output_data=[]
x = np.empty((0,4), float)
for token in t.tokenize(s):
if token.part_of_speech.split(',')[0]=="nom" or token.part_of_speech.split(',')[0]=="adjectif":
print(token.surface)
similarity1 = model.wv.similarity(w1=token.surface, w2="heureux")
#print("joie:{0}".format(similarity1))
similarity2 = model.wv.similarity(w1=token.surface, w2="agréable")
#print("chagrin:{0}".format(similarity2))
similarity3 = model.wv.similarity(w1=token.surface, w2="triste")
#print("anxiété:{0}".format(similarity3))
similarity4 = model.wv.similarity(w1=token.surface, w2="excitation")
#print("Intérêt:{0}".format(similarity4))
x = np.append(x, np.array([[similarity1, similarity2, similarity3, similarity4]]), axis=0)
print("-"*30)
print(np.mean(x, axis=0))
print("Heureux:{0}".format(np.mean(x, axis=0)[0]))
print("facile:{0}".format(np.mean(x, axis=0)[1]))
print("Tristesse:{0}".format(np.mean(x, axis=0)[2]))
print("Xing:{0}".format(np.mean(x, axis=0)[3]))
Entrez votre phrase préférée dans la variable s Par exemple "J'ai fait une proposition dans un restaurant avec vue sur la nuit." Mettons une phrase romantique Le résultat est
Vue nocturne Restaurant proposer
[0.29473324 0.44027831 0.27123818 0.20060815]
Heureux: 0.29473323623339337 Facile: 0,4402783115704854 Triste: 0,27123818174004555 Xing: 0,20060815351704755
Sortira. Donc ce système "J'ai fait une proposition dans un restaurant avec vue sur la nuit." Est considérée comme une phrase «amusante». (Plus le nombre est élevé, plus la sensation est forte)
Puis un autre exemple "Un meurtre par arme à feu a eu lieu dans une prison à minuit." Mettons une phrase punpun aura très négative Puis
Minuit prison Pistolet de poing meurtre Incident
[-0.00661952 0.01671012 0.12141706 0.23172273] Heureux: -0.0006619524117559195 Amusement: 0.01671011543367058 Triste: 0,12141705807298422 Excitation: 0,2317227303981781
Par conséquent, En fait, la valeur peut prendre une valeur négative. Certes, je ne me sens pas heureux même un millimètre.
C'est un moment merveilleux pour pouvoir analyser si facilement les émotions des phrases. Je suis profondément reconnaissant à Team Zet de m'avoir offert un lieu d'apprentissage aussi utile.
Recommended Posts