この記事は、2019年6月時点の執筆内容のため技術的に古い内容になります。
Pythonの感情分析をして、文章の内容がネガティブよりなのか、ポジティブよりなのか数値でわかるようなProgramを作成してみました。
感情分析するためのツールとして、Python3.6、janome(形態素解析)、感情極性対応表を使います。
やってみた感想は、Twitterやチャットなどの発言、ブログなどの内容が、ネガティブなものなのか、ポジティブなものか判定できるようになりました。
感情分析は、単語単位でネガ、ポジを判定するので、文章の文脈を見て判断するのは、今回試した方法では難しいようです。
開発環境の準備
janomeのインストール
形態素解析(文章から単語単位に分割する)ならばMecabが有名ですが、Mecabの導入は意外に面倒(Mecab本体のイントールとpythonライブラリーが必要になる)なので、
以下のコマンドで一発でインストールができるjanomeを使用します。
$ pip install janome
感情辞書(感情極性対応表)のダウンロード
今回は感情極性対応表を使います。
感情極性対応表は、以下のサイトからダウンロードが可能です。
http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html
感情極性対応表は、単語ごとに感情の度合い(数値)を表した辞書です。
-1に近いほどネガティブ、+1に近いほどポジティブな単語になります。
最終的にマイナスよりの単語が多く使われていれば、ネガティブな文章。
ポジティブよりの単語が多ければ、ポジティブな文章と言えます。
私が実際に使ってみた感想は、(私個人としては)ポジティブな内容でもマイナスよりに判断されてしまったため、相当、前向き言葉を意識して使わないと、ネガティブになってしまうようです。
詳細は、次の「3つの文章を試した結果」を参照。
3つの文章を試した結果
3つの文章を試してみます。
■比較的ネガティブな文章
子供が煩すぎて、仕事が全く進みません。困ったものです。
こんなとき、どうしたら良いのでしょうか?
結果は以下の通り。
子供:-0.982188
仕事:-0.958117
全く:-0.888037
どう:-0.941861
良い:0.999995
分析した単語数:5 感情極性実数値合計:-2.7702080000000002 感情極性実数値平均値:-0.5540416
想定通りの結果に近くなりました。
実数値は、意外にネガティブ側が高いです。
しかし、「仕事」が-0.9以上ということは、日本人の殆どが仕事と聞くと嫌気を指すということでしょうか?
■比較的喜ばしい文章
30年間(年齢=彼女いないれき)彼女ができなかった、友人がついに結婚することになった。喜ばしいことである。
結果は以下の通り。
友人:-0.119046
結婚:0.924874
喜ばしい:0.995736
分析した単語数:3 感情極性実数値合計:1.801564 感情極性実数値平均値:0.6005213333333334
ポジティブよりの結果が出ました。
ほぼ想定通りの結果でした。
■勉強会に参加したときのレポートで前向きの感想のつもり
強化学習の勉強会に参加してきた。
感想としては、勉強会の内容そのものは、機械学習の中級者向けだった。
勉強になったこと
・強化学習を使いこなすには、エンジニアのセンスも問われる。
・強化学習を始めてやるならば、比較的簡単でシンプルなChainerRL、
Stable-BaseLineがおすすめ。
・Keras-RLもKerasを使ったことがある人ならばおすすめである。
・事例よりもアルゴリズム的な話が多く、初心者が話に付いていくのは難があった。
ゲームのどの部分で強化学習がつかえるのか?
ターン制コマンドバトルRPGのバランス確認で使う。
敵のパラメータ調整、バトルを繰り返して確認する
・確認箇所は、
・想定通りのダメージ量になっているか?
・乱数の影響は措定の範囲内になっているか?
強化学習は奥が深い。これからちゃんと理解してこう!
結果は以下の通り。
強化:0.970293
学習:-0.453892
勉強:-0.259514
会:-0.667583
参加:-0.444319
感想:-0.611605
勉強:-0.259514
会:-0.667583
内容:-0.850617
機械:-0.922509
学習:-0.453892
中級:-0.21123
者:-0.585529
勉強:-0.259514
強化:0.970293
学習:-0.453892
使いこなす:-0.219837
エンジニア:-0.176673
センス:0.116787
強化:0.970293
学習:-0.453892
比較的:-0.379158
簡単:-0.659501
事例:-0.29536
的:-0.573711
話:-0.996908
多く:-0.878433
話:-0.996908
難:-0.992095
ゲーム:-0.41637
強化:0.970293
学習:-0.453892
ターン:-0.100865
制:-0.652231
コマンド:-0.475198
バランス:-0.105016
確認:-0.202126
敵:-0.999579
調整:-0.253877
確認:-0.202126
確認:-0.202126
箇所:-0.717246
想定:-0.235376
通り:-0.528264
ダメージ:-0.990346
量:-0.880877
乱数:-0.294168
影響:-0.628764
措定:-0.302726
範囲:-0.852067
内:-0.967488
強化:0.970293
学習:-0.453892
奥:-0.771587
これから:-0.417106
ちゃんと:-0.280786
理解:-0.306709
分析した単語数:57 感情極性実数値合計:-21.446225000000002 感情極性実数値平均値:-0.3762495614035088
前向きな感想のつもりで書いた文章ですが、実数値はマイナスになってしまいネガティブな文章とみなされてしまいました。まだ、文章の内容を理解して感情を分類するのは、これから発展して行くでしょう。
実装する
分析に使ったソースコードを記載します。
単語の正規化などの前処理をちゃんとやっていないので、参考程度のコードです。
■単語の正規化
大文字、小文字をどちらかにあわせる、半角カタカナを全角カタカナへ。
数字は、一つの表現に。漢数字、ローマ字数字、数字などの処理をする。
'''
文章データから、形態素解析して、文字列に対して感情分析を実施する
単語感情極性対応表は、以下のものを使わせていただきました。
参考資料:
高村大也, 乾孝司, 奥村学
"スピンモデルによる単語の感情極性抽出", 情報処理学会論文誌ジャーナル, Vol.47 No.02 pp. 627--637, 2006.
http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html
'''
import re
import sys
from janome.tokenizer import Tokenizer
import codecs
#感情ファイルの辞書を作成する
def read_pn_di():
dic_pn = {}
f = open('semantic_orientations_of_words.txt')
lines = f.readlines() # 1行を文字列として読み込む(改行文字も含まれる)
for line in lines:
#フォーマット
#見出し語:読み(ひらがな):品詞:感情極性実数値
columns = line.split(':')
dic_pn[columns[0]] = float(columns[3])
f.close
return dic_pn
#文章データテキストファイルから読み込みます
param = sys.argv
if (len(param) == 0):
print ("Usage: $ python " + param[0] + " number")
quit()
f = codecs.open(param[1],'r',)
src_txt = f.read()
f.close()
#単語感情極性対応表データを取得する
dic_pn = read_pn_di()
#セパレータを「。」とする。
seperator = "。"
mixi_diary_origin = src_txt
mixi_diary_origin = re.sub("[| 「」\n]", "", mixi_diary_origin) # | と全角半角スペース、「」と改行の削除
mixi_diary_list = mixi_diary_origin.split(seperator) # セパレーターを使って文章をリストに分割する
mixi_diary_list = [x+seperator for x in mixi_diary_list] # 文章の最後に。を追加
#この時点でデータの準備が終わりです
#ここから形態素分析に入ります
t = Tokenizer()
mixi_diary_words = [] #形態素分析したあとに出てきた語句を格納するリスト(この例では、名詞、形容詞のみの語句を取っています)
semantic_value = 0
semantic_count = 0
for sentence in mixi_diary_list:
tokens = t.tokenize(sentence)
words = []
for token in tokens:
# 品詞を取り出し
partOfSpeech = token.part_of_speech.split(',')[0]
#感情分析(感情極性実数値より)
if( partOfSpeech in ['動詞','名詞', '形容詞', '副詞']):
if(token.surface in dic_pn):
data = token.surface + ":" + str(dic_pn[token.surface])
print(data)
semantic_value = dic_pn[token.surface] + semantic_value
semantic_count = semantic_count + 1
#if partOfSpeech == u'名詞' or partOfSpeech == u'形容詞' :
#print (token.surface)
words.append(token.surface)
if len(words) > 0:
mixi_diary_words.extend(words)
data = "分析した単語数:" + str(semantic_count) + " 感情極性実数値合計:" + str(semantic_value) + " 感情極性実数値平均値:" + str(semantic_value / semantic_count)
print(data)
まとめ
Pythonの感情分析は、面白かった。今回は、感情極性対応表を使ってみました。
文脈まで理解することとなると難しい部分になりますが、簡単な分類までならばできると言えます。
\IT未経験者からのサポートあり!転職サービス3選!!/
サービス名 | |||
---|---|---|---|
未経験 | 未経験OK | 未経験の転職専用 | 経験者向け |
公開の求人数 | ITエンジニア全体で1万件以上 ITエンジニア未経験で600件以上 |
未公開 | 5,000件以上 |
利用対象 | 全職種 | IT特化 | IT特化 |
特徴 | ✓誰もが知る転職サービス ✓経歴を登録しておくとオファーが来る |
✓企業担当者と条件交渉 ✓スキルの身につく企業を紹介 |
✓IT専門のエージェントが対応 ✓転職成功すると年収200万円以上の大幅アップがある |
転職サポート内容 |
|
|
|
公式サイト | リクナビネクスト | テックゲート | レバテックキャリア |
参考資料
・Python 感情極性対応表とjanomeを使って日本語
で良いニュースと悪いニュースの分類を試みる
・自然言語処理における前処理の種類とその威力
https://qiita.com/Hironsan/items/2466fe0f344115aff177
・高村大也, 乾孝司, 奥村学
“スピンモデルによる単語の感情極性抽出”, 情報処理学会論文誌ジャーナル, Vol.47 No.02 pp. 627–637, 2006.
http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html