C'est le 7ème jour du "Calendrier de l'Avent du traitement du langage naturel 2019". J'ai ressenti un problème dans l'article "Noter le degré négatif / positif des articles de presse par l'analyse des émotions", ** "Un grand nombre de dictionnaires polaires qui peuvent être utilisés" J'ai essayé de résoudre "Pas de problème" **. Cette fois, nous allons essayer de générer automatiquement un dictionnaire de polarité en utilisant fasttext.
J'ai fait référence à ce qui suit lors de l'apprentissage de Fasttext.
L'analyse des émotions est une méthode permettant d'analyser les émotions de diverses informations textuelles à l'aide de techniques d'exploration de texte et d'apprentissage automatique. L'analyse à un axe du positif ou du négatif est l'impression la plus orthodoxe, mais il y en a qui vont dans une analyse plus détaillée des émotions.
La méthode la plus courante d'analyse des émotions consiste à ** se concentrer sur les mots contenus dans une phrase **, qui repose sur l'idée que les phrases positives (négatives) doivent contenir des mots spécifiques. Une liste de ces mots spécifiques est appelée un ** dictionnaire polaire **, et ce dictionnaire polaire est utilisé dans cette analyse émotionnelle.
Les dictionnaires polaires sont ** des dictionnaires avec des indicateurs sémantiques tels que «positif» et «négatif» pour chaque mot ou terme **. Certains sont simplement des indicateurs tels que «positif» et «négatif», tandis que d'autres reçoivent des degrés positifs et négatifs sous forme de scores discrets.
J'ai cherché divers dictionnaires polaires parce que je voulais analyser les émotions, mais il n'y avait que les deux dictionnaires polaires suivants que je pouvais réellement utiliser. Tableau de correspondance de polarité d'émotion de mot montre les valeurs discrètes de négatif et positif (-1 à 1) pour un grand nombre de mots. Il est très pratique car il est donné (dans la plage de), mais il n'est pas disponible pour un usage commercial.
En fait, même si vous dites que vous attribuez une valeur de degré négative / positive à chaque mot **, le mot doit-il être jugé positif ou reflété comme négatif en fonction de l'objet à analyser, du contexte et du point de vue de l'inversion négative / positive? Est différent. ** Par conséquent, le dictionnaire de polarité doit être entièrement réglé en fonction de la tâche, mais cela prend beaucoup de temps.
Comme solution au problème ci-dessus, je voudrais créer un programme qui peut facilement et automatiquement générer un dictionnaire polaire et est facile à régler. ** **
J'ai créé un programme de génération automatique de dictionnaire polaire avec le mécanisme suivant.
Cette fois, fasttext est utilisé pour mesurer la similitude entre les mots. Je l'ai aussi comparé à Word2vec, mais fasttext semble être plus résistant aux contre-mots, j'ai donc choisi fasttext. J'ai créé le modèle fasttext à partir de zéro, mais il m'a fallu 300 heures pour apprendre ... Certaines personnes ont publié le modèle entraîné (J'ai publié le modèle entraîné de fastText etc. ) Donc, fondamentalement, je pense qu'il n'y a aucun problème à l'utiliser.
De plus, il y a des gens qui viennent d'écrire sur Fasttext sur le calendrier de l'Avent, alors jetez un œil. Utilisons rapidement l'expression distribuée des mots avec fastText!
Tout d'abord, créez un programme qui détermine le degré de négatif / positivité d'un mot spécifique.
import gensim
#Charger un modèle de texte rapide
model = gensim.models.KeyedVectors.load_word2vec_format('./wikimodel_20191102.bin', binary=True)
#Préciser arbitrairement "mots très positifs" et "mots très négatifs"
posi_list = ['Excellent', 'bien','Réjouir','louange', 'Toutes nos félicitations','intelligent','bien', 'Adapté','Tensei',
'célébrer', 'Réussite','prix','heureux','joie','esprit et intelligence','Toku', 'Talent','Génial','aromatique','Honneur',
'Approprié','culte','Aidez-moi','Je me retire','Shimizu','Majestueux','Assortiment','Heureusement','Signe de bon augure','exceller']
nega_list = ['mal', 'mourir', 'malade', 'terrible', 'Jurer', 'Tremper', 'Humble',
'pauvre', 'souffrir', 'douloureux', 'Attacher', 'Strict', 'difficile', 'tuer', 'dur', 'Rugueux',
'cruel', 'faire des reproches', 'ennemi', 'Désobéir', 'Railleur', 'Souffrance', 'Épicé', 'solitaire', 'Châtiment', 'Infidèle',
'Du froid', 'sans valeur', 'Pardon']
def posi_nega_score(x):
#Jugement de degré positif
posi = []
for i in posi_list:
try:
n = model.similarity(i, x)
posi.append(n)
except:
continue
try:
posi_mean = sum(posi)/len(posi)
except:
posi_mean = 0
#Jugement de degré négatif
nega = []
for i in nega_list:
try:
n = model.similarity(i, x)
nega.append(n)
except:
continue
try:
nega_mean = sum(nega)/len(nega)
except:
nega_mean = 0
if posi_mean > nega_mean:
return posi_mean
if nega_mean > posi_mean:
return -nega_mean
else:
return 0
Si vous utilisez le programme ci-dessus pour juger du négatif / positif d'un mot, il ressemblera à ceci.
print(posi_nega_score('excellence'))
0.2679512406197878
print(posi_nega_score('Désagréable'))
-0.2425743742631032
Cette fois, nous utiliserons le "corpus d'actualités de livingoor" pour l'ensemble de données. Pour plus de détails sur l'ensemble de données et la méthode d'analyse morphologique, veuillez consulter Publié dans l'article précédemment publié. Je vais. Le résultat de l'analyse morphologique est produit comme ceci.
Un dictionnaire de polarité est généré à partir de ces données.
import pandas as pd
ddf = pd.read_csv('news_word.csv')
#Attribuez un score à chaque mot
ddf['But'] = ddf['mot'].apply(lambda x : posi_nega_score(x))
import numpy as np
#Score donné-Ajuster de 1 à 1
score = np.array(ddf['But'])
score_std = (score - score.min())/(score.max() - score.min())
score_scaled = score_std * (1 - (-1)) + (-1)
ddf['But'] = score_scaled
Cliquez ici pour le ** Negative Word Top 20 ** du dictionnaire de polarité créé par le programme ci-dessus.
Cliquez ici pour le ** Positive Word Top 20 ** du dictionnaire de polarité créé par le programme ci-dessus.
Vous pouvez voir que des mots comme ça entrent correctement. Il y a des mots négatifs et des mots que je n'ai pas spécifiés comme des mots positifs, donc je pense que la précision est relativement bonne.
Next Merci d'avoir regardé jusqu'à la fin. C'était la première fois que je participais au «Calendrier de l'Avent», mais j'aimerais continuer à y participer activement. Demain, c'est oumugai mori! !!
Recommended Posts