極性辞書を用いたネガポジ分析|実践的自然言語処理入門 #5

#1〜#3まではBoWのような自然言語の行列形式とそれに派生して局所表現と分散表現の話をし、分散表現の例としてWord2vecについて取り扱いました。

BoWと形態素解析|実践的自然言語処理入門 #1 - lib-arts’s diary

特徴語抽出とtf-idf|実践的自然言語処理入門 #2 - lib-arts’s diary

分散表現とWord2vec|実践的自然言語処理入門 #3 - lib-arts’s diary
#4からは実際に応用に焦点を当てて簡単な応用タスクを解いてみようということで、#4ではcos類似度と文書分類について取り扱いました。

#5では極性辞書を用いたテキストのネガポジ分析について行っていければと思います。
以下目次になります。

1. ネガポジ分析とは
2. ネガポジ分析を実装していくにあたってのアプローチ
3. 極性辞書を用いたネガポジ分析の実装
4. まとめ


1. ネガポジ分析とは

よく聞く言葉の割になかなか良さげな定義が見つからなかったので、英語のWikipediaから引っ張ってきました。

Sentiment analysis - Wikipedia
ネガポジ分析は実際に感情の分析ではあるのでセンチメント分析の分脈に沿って理解で良いかと思います。(要出典なので後日更新の可能性があります)

f:id:lib-arts:20190127161057p:plain

上記はリンク先のWikipediaから引っ張ってきましたが、自然言語処理やテキスト分析を用いて「主観的な情報(subjective information)」を抽出、定量化するだったりレビューやSNSのデータのような「顧客の声(voice of the customer)」知るにあたって分析を行うだったりがまとめられています。

このように文章から感情を読み取るのがセンチメント分析です。ネガポジ分析はこの中でも発言のポジティブネガティブを定量化した極性(polarity)に基づいて文章のポジティブとネガティブを分析します。


2. ネガポジ分析を実装していくにあたってのアプローチ

◆ 極性辞書について

ネガポジ分析を実装していく上でのアプローチですが、色々と方法がありますが一番シンプルな方法だと公開されている極性辞書(単語のネガティブ、ポジティブを数値化したもの)を使用するというのがあります。

Open Resources/Japanese Sentiment Polarity Dictionary - 東北大学 乾・鈴木研究室 / Communication Science Lab, Tohoku University

上記のように極性辞書が公開されていますので、個人の趣味的な制作や簡単なPoC制作レベルであれば拝借するのが良いと思います。(それなりに予算がついた上で実行できるなら極性辞書の作成自体もさほど難しい話ではないので、極性辞書の制作から始めるのも良いと思います。が、今回は単なる解説目的の連載なので極性辞書の作成については方針の提示に限りたいと思います。)

優れる:すぐれる:動詞:1
良い:よい:形容詞:0.999995
喜ぶ:よろこぶ:動詞:0.999979
褒める:ほめる:動詞:0.999979

~~~

ない:ない:形容詞:-0.999882
浸ける:つける:動詞:-0.999947
罵る:ののしる:動詞:-0.999961
ない:ない:助動詞:-0.999997
酷い:ひどい:形容詞:-0.999997

~~~

上記は極性辞書からの抜粋です。見てわかる通り、ポジティブな単語が+1に近く、ネガティブな単語が-1に近いということがわかります。 

 

 ◆ 実装にあたってのアプローチ

基本的には形態素解析の結果を極性辞書の結果に照らし合わせて足し算していくと良いです。具体的には辞書型で単語とスコアを持つようにしておけば、辞書のキーに存在する場合は値を足し合わせていけば実装できそうです。実装については実際の実装例とともに3節でまとめます。

 

◆ 極性辞書の学習

今回はすでにあるものを拝借しましたが、場合によっては極性辞書を1から作ることを検討する場合もあると思います。例えば株価予測などのドメイン特化型の極性辞書を作りたい時などです。このように分析対象のテキストに偏りがある際は自作するのもありだと思います。

極性辞書の作り方としては、一番簡単な方法だと教師あり学習と同様の手順で作成することができます。1,000〜10,000ほどのネガティブかポジティブがわかった文章のBoWを作成し、ロジスティック回帰分析のようなモデルを適用し、係数(coefficient)を分析することで単語のポジティブネガティブは計算することができます。詳細は機会があれば簡単な実装例を作成して公開できればと思います。


3. 極性辞書を用いたネガポジ分析の実装

from janome.tokenizer import Tokenizer

# 極性辞書の作成
dict_polarity = {}
with open('./polarity.txt', 'r') as f:
    line = f.read()
    lines = line.split('\n')
    for i in range(len(lines)):
        line_components = lines[i].split(':')
        dict_polarity[line_components[0]] = line_components[3]

 

# ネガポジ分析用の関数の作成
def judge_polarity(text):
    t = Tokenizer()
    tokens = t.tokenize(text)
    pol_val = 0
    for token in tokens:
        word = token.surface
        pos = token.part_of_speech.split(',')[0]
        if word in dict_polarity:
            pol_val = pol_val + float(dict_polarity[word])

    if pol_val > 0.3:
        print("Positive. Score:"+str(pol_val))
    elif pol_val < -0.3:
        print("Negative. Score:"+str(pol_val))
    else:
        print("Neutral. Score:"+str(pol_val))

 

# ネガポジ分析の実行
judge_polarity("気品溢れる英傑")
judge_polarity("不遇の境遇を嘆く")
judge_polarity("普通")

上記が極性分析のサンプルコードになります。

http://www.lr.pi.titech.ac.jp/~takamura/pubs/pn_ja.dic
ここで、"polarity.txt"は上記のサイトよりコピーしてテキスト化しました。

実行結果は上記のようになりました。


4. まとめ

#5では簡単な極性分析について取り扱いました。もちろんいろいろなアプローチ方法はあるのですが、シンプルな方法を一つ知っておくだけでも応用の幅が広がるので、一旦基本としては今回の内容で十分なのではと思います。
アルゴリズム自体は単純でも応用タスクをアプリケーションの形で作り直す際にやり方次第ではよく見せられるというのが#4から一貫して面白いところだと思います。

 

↓以降の記事は下記になります。

言語処理におけるグラフ理論とネットワーク分析|実践的自然言語処理入門 #6 - lib-arts’s diary

 

↓また、当記事の内容を元に再構成と少しだけ加筆を行い電子書籍化を行いました!pdf版が欲しいなどありましたら下記をご購入いただけたら大変嬉しいです!!