Pythonで自然言語処理!janomeと 感情極性を使って日本語の感情分析をやってみた

この記事は、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

 

最新情報をチェックしよう!