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/
コメント
[…] 関連記事:【Python】PymlaskでML-ASK感情分析をやってみた話 […]
[…] 関連記事:【Python】PymlaskでML-ASK感情分析をやってみた話 […]