Python 自然言語処理

【Python】PymlaskでML-ASK感情分析をやってみた話

この記事は約8分で読めます。

 

ML-Askで何ができるのか

 

ML-Askでは感情の推定ができます。デフォルトの辞書では2,100語の辞書によるパターンマッチングで{喜, 怒, 哀, 怖, 恥, 好, 厭, 昂, 安, 驚}の10種類の感情を推定します。この2,100語は、感情表現辞典に基づいているそうです。加えて間投詞、擬態語、がさつな言葉、顔文字、「!」や「?」の数で感情の強さを推定します。

 

文脈の考慮
Contextual Valence Shifters (CVS) という概念に基づいて, 文脈を考慮した感情推定を行います. たとえば, 「好きとは言えない」という文の場合、「好き」が否定されているので、「好き」の逆の感情である「嫌」だと推定します。

 

開発用リポジトリ
https://github.com/ikegami-yukino/pymlask

 

前準備

 

まずはpipでライブラリをインストールします

 

※MeCabがないと動きません

$ pip install mecab-python3
$ pip install pymlask

 

・ツイートデータの準備

関連記事:【Python】TwitterのAPIを簡単操作できる「Tweepy」の使い方

実際に集めたもの⇒https://github.com/beginerSE/sample_tweetdata

 

PymlaskでML-ASK感情分析サンプル

 

import mlask
emotion_analyzer = mlask.MLAsk("-d 'C:\Program Files (x86)\MeCab\dic\ipadic'")
emotion_analyzer.analyze('近年では、親愛の情を込めて友人、知人や親族にも贈るお歳暮へと少しずつ変化してきているようです。')

 

引数で辞書を指定することが可能。Mecabのbinのパスを環境変数に通していないとエラーを吐くことがあるみたいです。

 

Windowsの場合は以下を環境変数に通します

C:\Program Files (x86)\MeCab\bin

 

環境変数への設定方法は↓参照

【Python】Window10でGaraphVizがインポートできないエラーの対処法

 

<実行結果>

{'text': '近年では、親愛の情を込めて友人、知人や親族にも贈るお歳暮へと少しずつ変化してきているようです。',
 'emotion': defaultdict(list, {'suki': ['親愛']}),
 'orientation': 'POSITIVE',
 'activation': 'NEUTRAL',
 'emoticon': None,
 'intension': 0,
 'intensifier': {},
 'representative': ('suki', ['親愛'])}

 

 

スポンサーリンク
スポンサーリンク

PymlaskでML-ASK感情分析をやってみる

 

先ほどのcsvを読み込んでデーやフレームにしてツイート列の情報に対してml-askで分析をかけます

 

import pandas as pd
import glob
import mlask

df = pd.DataFrame(columns = [])
for twitter_df in glob.glob("csvファイル/*.csv"):
    tmp = pd.read_csv(twitter_df, encoding = "cp932", engine="c", index_col=None)
    tmp.columns = ['日付','アカウント名','ツイート']
    df = pd.concat([df, tmp], ignore_index=True)
print(df.head())

emotion_lists = []
num=0
for text in df['ツイート']:
    num+=1
    if num % 1000==0:
        print(num)
    emotion_list = []
    try:
        res = emotion_analyzer.analyze(text)
    #     print(res)
        try:
            t = res['emotion']['odoroki']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['kowa']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['yasu']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['yorokobi']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['iya']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['aware']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['haji']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['ikari']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['suki']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        try:
            t = res['emotion']['takaburi']
            emotion_list.append(t)
        except:
            emotion_list.append([])
        emotion_lists.append(emotion_list)
    except:
        emotion_lists.append([[],[],[],[],[],[],[],[],[],[]])
        print(text)


emotion_df = pd.DataFrame(emotion_lists, columns=['aware', 'haji', 'ikari', 'iya', 'kowa', 'odoroki', 'suki', 'takaburi', 'yasu', 'yorokobi'])
print(emotion_df)

 

 

<実行結果>

 

for文でもっとシンプルにできます。なんかめんどくさくなったのでここで止まっていますが、あとはこれをlambdaかなんかを使って集計すれば数値化できます。

 

関連記事:【Python】データフレームの列データをapply関数+lambdaで条件分岐して一括変換する

 

見れば分かりますが、Ml-askではTwitterのデータの半分くらいしか判定できていません。辞書を変えればもう少し精度が上がるみたいですが、googleのAPIみたくポジネガみたいなのが結果が出やすいかな~と思いました。

 

では~

 

 

参考:https://qiita.com/yukinoi/items/ef6fb48b5e3694e9659c

参考:https://qiita.com/hnishi/items/0d32a778e375a99aff13

参考:https://colabmix.co.jp/tech-blog/centos8-ml-ask-python/

コメント

タイトルとURLをコピーしました