[PYTHON] Générer automatiquement un dictionnaire polaire utilisé pour l'analyse des émotions

introduction

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.

référence

J'ai fait référence à ce qui suit lors de l'apprentissage de Fasttext.

Qu'est-ce que l'analyse des émotions

Résumé de l'analyse des émotions

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.

Méthode d'analyse 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.

Dictionnaire de polarité

À propos du dictionnaire de polarité

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.

Les défis de l'analyse émotionnelle

Il existe peu de dictionnaires polaires qui peuvent être utilisés facilement

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.

Très difficile à régler

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.

Résoudre les problèmes ci-dessus

Génération automatique du dictionnaire de polarité en utilisant Fasttext

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. ** **

Génération automatique du dictionnaire de polarité

Vue d'ensemble du programme généré automatiquement

J'ai créé un programme de génération automatique de dictionnaire polaire avec le mécanisme suivant.

  1. Spécifiez plusieurs ** «mots très positifs» ** et ** «mots très négatifs» ** dans le groupe de documents que vous voulez juger comme négatifs ou positifs.
  2. En utilisant le modèle de texte rapide qui a pleinement appris la page japonaise de wikipedia, la similitude moyenne avec les ** "mots très positifs" ** et ** "très négatifs" ci-dessus pour les éléments morphologiques de chaque phrase Mesurez le degré moyen de similitude avec les «mots» **.
  3. Adoptez la polarité avec la similitude moyenne la plus élevée. S'il est "positif", la valeur de similarité est utilisée telle quelle, et si elle est "négative", un moins est ajouté pour en faire le score négatif / positif de l'élément morphologique.
  4. Convertissez l'échelle de score de tous les mots de -1 à 1 pour compléter le dictionnaire de polarité.

Implémentation d'un programme de génération automatique de dictionnaire de polarité

À propos du texte rapide

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!

Jugement automatique du degré négatif / positif

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

Programme de génération automatique de dictionnaire polaire

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.

スクリーンショット 2019-12-07 8.51.39.png

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.

スクリーンショット 2019-12-07 8.58.11.png

Cliquez ici pour le ** Positive Word Top 20 ** du dictionnaire de polarité créé par le programme ci-dessus.

スクリーンショット 2019-12-07 9.00.54.png

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

Générer automatiquement un dictionnaire polaire utilisé pour l'analyse des émotions
Générer automatiquement EDT pour le message ECHONET
Metaclass (wip) pour générer un dictionnaire
Utilisons un langage de script pour une vie C ++ confortable 2 Générer automatiquement une source C ++
Créer un dictionnaire Hatena pour SKK (supplémentaire)
J'ai créé un fichier de dictionnaire python pour Neocomplete
Préparer un environnement de langage de programmation pour l'analyse des données
Générer un dictionnaire MeCab à partir des données de l'Encyclopédie Nico Nico
Astro: modules / fonctions python fréquemment utilisés pour l'analyse
J'ai créé un outil pour générer automatiquement un diagramme de transition d'état pouvant être utilisé à la fois pour le développement Web et le développement d'applications