自分は自然言語処理の人間ではないのですが、文章がネガティブな意味合いを持つのか、ポジティブな意味合いを持つのか判定させる必要(以降、ネガポジ分析と表現します)が出てきたため、いろいろな方の記事を参考に挑戦してみました。
#ネガポジ分析
ネット上を探してみると、文章のネガティブさ、ポジティブさを判定しようとしている方がたくさんいらっしゃいます。
1.R言語 - テキストのネガポジ度を分析する
http://qiita.com/uchim/items/db20d662d762efbfa9e5
2.ハセテツラボ PythonでTwitterでのツイートをネガポジ判定してみた結果。。。
http://tt-house.com/2013/08/twitter-nega-posi.html
3.Atrae Tech Blog 僕が感情豊かであることをネガ・ポジ判定で証明する
http://atraetech.tumblr.com/post/129177167869/%E5%83%95%E3%81%8C%E6%84%9F%E6%83%85%E8%B1%8A%E3%81%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E3%83%8D%E3%82%AC%E3%83%9D%E3%82%B8%E5%88%A4%E5%AE%9A%E3%81%A7%E8%A8%BC%E6%98%8E%E3%81%99%E3%82%8B
みなさん、ネガポジ分析の道具として、東工大の高村教授が作成したPN Tableという辞書を使っています。
PN Table
http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html
この辞書には岩波国語辞書(岩波書店)に載っている単語がポジティブであるほど+1に近い値、ネガティブであるほど-1に近い値がふられています。
しかし、この辞書は2番目に紹介したブログの通り、全単語55,125中、ポジティブワード(スコア0以上)が5,242語、ネガティブワードが49,983語のようで、文章を形態素解析して含まれている単語の値を足し合わせるといった単純な手法だとうまく判定ができないようです。
いろんな手法が自然言語の分野で研究されているようですが、調べた限り王道なネガポジ分析の手法はないみたいです。
私は素人なので、複雑な手法を試すのはできそうにないので、なんとか単純なスコアリングで判定ができないか探ってみました。
#日本語評価極性辞書
東北大学の乾・岡崎研究室が公開している日本語評価極性辞書というものを見つけました。
http://www.cl.ecei.tohoku.ac.jp/index.php?Open%20Resources%2FJapanese%20Sentiment%20Polarity%20Dictionary
こちらの辞書は用言の感情極性をネガティブ、ポジティブの2値で
名詞の感情極性をネガティブ、ポジティブ、ニュートラル(どちらでもない)の3値で評価しています。
ネガ(経験) 偽る
ネガ(経験) 疑う
ポジ(評価) 良い
ポジ(評価) 良い なる
ポジ(評価) 良識 的 だ
あからさま n 〜である・になる(評価・感情)主観
あきらめ n 〜がある・高まる(存在・性質)
あく e 〜がある・高まる(存在・性質)
あく抜け p 〜する(出来事)
あこがれ p 〜がある・高まる(存在・性質)
厳密にはこれほど単純な評価ではありませんが、
用言が
ネガティブ3171
ポジティブ2106
名詞が
ネガティブ4993
ニュートラル4959
ポジティブ3390
と、比較的バランスのとれた配分になっているため、単純な数え上げ手法ならば相性がいいだろうと思い、今回辞書として選択しました。
#手法の説明
日本語評価極性辞書のネガティブを-1,ニュートラルを0,ポジティブを1と対応してスコアリングをします。
例えば、次の文章があったとします。
今日は晴れたことだし、外に散歩にでも出かけることにするか
これを形態素解析ツールのMeCabを使って単語ごとに区切ると
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
晴れ 動詞,自立,*,*,一段,連用形,晴れる,ハレ,ハレ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
こと 名詞,非自立,一般,*,*,*,こと,コト,コト
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
し 助詞,接続助詞,*,*,*,*,し,シ,シ
、 記号,読点,*,*,*,*,、,、,、
外 名詞,一般,*,*,*,*,外,ソト,ソト
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
散歩 名詞,サ変接続,*,*,*,*,散歩,サンポ,サンポ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
でも 助詞,副助詞,*,*,*,*,でも,デモ,デモ
出かける 動詞,自立,*,*,一段,基本形,出かける,デカケル,デカケル
こと 名詞,非自立,一般,*,*,*,こと,コト,コト
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
か 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
と、いった結果が得られます。この結果から用言、名詞の基本形をとってきます。すると
["今日", "晴れる" , "こと", "出かける", "する"]
だけが残ります。
この中で、日本語評価極性辞書に載っていたのは
["晴れる", "散歩"]の二つで、そのスコアは
晴れる=>1, 散歩=>1
よって、合計2となり、この文章はポジティブだと判定されます。
だいぶ単語が少なくなってしまいましたが、この文章では「晴れたから散歩に行く」ということが大事なので概ね正しいのではないかと。
#gem negapoji
gemとしてGitHubには公開中。色々と至らない部分が多いのでRubygems.orgには登録していないため野良gemです。
https://github.com/hatt0519/negapoji.git
#テスト
早速自作gemをインストール
$ git clone https://github.com/hatt0519/negapoji.git
$ bundle install
$ gem build negapoji.gemspec
$ gem install negapoji
Successfully installed negapoji-0.1.0
Parsing documentation for negapoji-0.1.0
Done installing documentation for negapoji after 0 seconds
1 gem installed
簡単なテストスクリプトを書いてみます。
# coding: utf-8
require "negapoji"
while text = STDIN.gets
p Negapoji.judge(str) if text.is_a?(String)
end
今のところ用意したメソッドはjudgeのみで、引数で渡ってきた文章がポジティブかネガティブか判定します。
この場合は標準入力から渡ってきたテキストですね。
##実行結果
ひとまず、自分のツイッターのつぶやきを分析させてみた。
最近になって片頭痛がひどい
— はっとりぬ (@moroku0519) 2016年6月14日
$ ruby test_negapoji.rb
最近になって片頭痛がひどい
"negative"
これはネガティブで正しそう。
iTerm2アップデートしたら⌘+数字でタブ切り替えできるようになって超便利
— はっとりぬ (@moroku0519) 2016年6月10日
$ ruby test_negapoji.rb
iTerm2アップデートしたら⌘+数字でタブ切り替えできるようになって超便利
"positive"
これも正しい。
世の中にあんぱんダイエットなるものがあることに感動を覚えながら今日も俺はあんぱんを食らう
— はっとりぬ (@moroku0519) 2016年4月25日
$ ruby test_negapoji.rb
世の中にあんぱんダイエットなるものがあることに感動を覚えながら今日も俺はあんぱんを食らう
"positive"
ぱっと見よくわからないけど感動しているのでポジティブで正しそう。
割とそれっぽく判定してくれています。
しかし、やはりおかしな場合もあって、例えば
美人さんが目の前を通って、「綺麗な人だな〜」と思ったけど、
— はっとりぬ (@moroku0519) 2016年6月14日
人とすれ違いざまにぶつかって「チッ」と舌打ちだけして立ち去って行ったのを見て株が急落した
$ ruby test_negapoji.rb
美人さんが目の前を通って、「綺麗な人だな〜」と思ったけど、 人とすれ違いざまにぶつかって「チッ」と舌打ちだけして立ち去って行ったのを見て株が急落した
"positive"
文章中に逆接があって、ポジティブな単語が多くても全体としてはネガティブになる場合などには対応ができていませんでした。
#終わりに
単純な単語のスコア合計で判定するところまではできているので、あまり難しいことはできないにしろ逆接に対応させてみたり、精度が高く複雑でない分析手法があればまたnegapojiを改良していけたらと思います。
#参考
1.R言語 - テキストのネガポジ度を分析する
http://qiita.com/uchim/items/db20d662d762efbfa9e5
2.ハセテツラボ PythonでTwitterでのツイートをネガポジ判定してみた結果。。。
http://tt-house.com/2013/08/twitter-nega-posi.html
3.Atrae Tech Blog 僕が感情豊かであることをネガ・ポジ判定で証明する
http://atraetech.tumblr.com/post/129177167869/%E5%83%95%E3%81%8C%E6%84%9F%E6%83%85%E8%B1%8A%E3%81%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E3%83%8D%E3%82%AC%E3%83%9D%E3%82%B8%E5%88%A4%E5%AE%9A%E3%81%A7%E8%A8%BC%E6%98%8E%E3%81%99%E3%82%8B
小林のぞみ,乾健太郎,松本裕治,立石健二,福島俊一. 意見抽出のための評価表現の収集. 自然言語処理,Vol.12, No.3, pp.203-222, 2005. / Nozomi Kobayashi, Kentaro Inui, Yuji Matsumoto, Kenji Tateishi. Collecting Evaluative Expressions for Opinion Extraction, Journal of Natural Language Processing 12(3), 203-222, 2005.
東山昌彦, 乾健太郎, 松本裕治, 述語の選択選好性に着目した名詞評価極性の獲得, 言語処理学会第14回年次大会論文集, pp.584-587, 2008. / Masahiko Higashiyama, Kentaro Inui, Yuji Matsumoto. Learning Sentiment of Nouns from Selectional Preferences of Verbs and Adjectives, Proceedings of the 14th Annual Meeting of the Association for Natural Language Processing, pp.584-587, 2008.
高村大也, 乾孝司, 奥村学
"スピンモデルによる単語の感情極性抽出", 情報処理学会論文誌ジャーナル, Vol.47 No.02 pp. 627--637, 2006.