お手軽実装で評判分析
あの商品を買うべきか買わざるべきか?いま一つ踏ん切りが付かない時に頼りになるが、ネット上にある商品のレビュー記事。しかしレビューをしらみつぶしにチェックするのは大変ということで、ここ数年 評判分析(Sentiment Analysis)が使われるようになってきました。
この評判分析が具体的にどんな問題を解決できるのかというと、以下の画像は評判分析のさらにその応用に当たる評判要約(Sentiment Summarization)に関する文献からの引用になりますが、沢山ある感想文をカテゴライズできたりします。
A Joint Model of Text and Aspect Ratings for Sentiment Summarization
Ivan Titov, Ryan McDonald
46th Meeting of Association for Computational Linguistics (ACL-08). Columbus, OH, USA, 2008.
つまり、似たような意見ばかりで全然参考にならなかった。もう帰る!という事態が防げるわけです。きっと楽天の人気商品なんかでは効果てきめんでしょう。なにせ感想文の数が3桁とか4桁に上るものがざらにありますからね。こんな便利な評判分析(要約)ですが、実は”精度をあまり求めなければ”簡単に作れます。以下はそんなお手軽評判分析の作り方。
評価表現辞書の作成
最初にやるべきことは評価表現辞書の作成です。ここでいう評価表現(Evaluative Expressions)とは、商品属性に当たる観点(Aspect)と評価(Evaluation)のペアを刺したもので、例えば"値段"が"安い"などがそうです。これを手動で作っていたらいくら時間があっても足らないので、ネット上で集めたレビューから自動生成する方法を考えます。今時、価格.comやAmazonが提供するAPIなどから、商品レビューなんていくらでも取れますので、分析する対象に最も近いと思うドメインのレビューを絞り込みましょう。
次に構文解析で以下のルールでレビューから語句を抽出します。自分がこれならお手軽に出来るだろうと思ったルールが以下に2つ紹介します。品詞体系はUniDic準拠です(IPA辞書などの場合は、形状詞=名詞/形容動詞語幹に置き換えて下さい)
パターン1 名詞+助詞+形容(状)詞
- 形容(状)詞を探索します。品詞が連続している場合はひとまとめにします。
- ただし品詞体系が助動詞語幹及び文字列が"ない|なく|なかっ|"に該当するものは除外します。
- 上記の形態素を含む文節(前方)及びその係り元の文節から、名詞及び助詞を列挙します。
- 名詞は品詞体系が"副詞可能|人名"に該当するものは除外します。
- 助詞は文字列が"が|は|も|に|を"に限定します。
- 名詞及び形容(状)詞の直後に接尾辞が入る場合はそれも含めます。
- この時点で名詞と助詞がそれぞれ1つ以上獲得できなければ破棄します。
パターン2 形容(状)詞+名詞
- 形容(状)詞を探索します。品詞が連続している場合はひとまとめにします。
- ただし品詞体系が助動詞語幹及び文字列が"ない|なく|なかっ|"に該当するものは除外します。
- 上記の形態素を含むを含む文節(後方)及びその係り先の文節から、名詞を列挙します。
- 名詞は品詞体系が"副詞可能|人名"に該当するものは除外します。
- 名詞及び形容(状)詞の直後に接尾辞が入る場合はそれも含めます。
- この時点で名詞が1つ以上獲得できなければ破棄します。
ただし間違っても、上記パターンだけで評価表現が漏れなく取得できるとは決して思われないように!例えば、「お買い得だった」「好感触だった」など、名詞(あるいは接頭詞+名詞)だけで表現できるものなど、例外パターンはいくらでも考えられます。
獲得できた形態素群を名詞(BODY)+形容(状)詞(HEAD)としてトランザクション出力します。今回は、ゲームドメインでその相関を求めてみました。括弧内のパーセンテージは、観点が支持度(Support)、表現が信頼度(Confidence)に当たります。それぞれが上位のものから順にソートして並べたものが以下の表です。
観点 | 評価1 | 評価2 | 評価3 | 評価4 |
---|---|---|---|---|
ゲーム(4.3) | 面白い(6.6) | いい(6.2) | 良い(4.3) | 好き(3.2) |
こと(3.1) | いい(4.9) | 可能(4.3) | 多い(4.2) | 残念(4.1) |
方(3) | いい(18) | 好き(16) | 良い(8.6) | 多い(4.2) |
人(2.3) | 好き(24) | いい(12) | 多い(6.3) | 良い(4.3) |
もの(1.9) | いい(5) | 多い(4.3) | 良い(3.9) | 面白い(3.2) |
点(1.7) | 悪い(21) | 良い(21) | 良かっ(7.3) | 残念(6.9) |
感じ(1.7) | いい(13) | 良い(7.8) | 好き(2.1) | 残念(1.9) |
プレイ(1.6) | いい(6.4) | 楽しく(4.8) | 面白い(3.7) | 良い(3.5) |
気(1.5) | いい(6.5) | 多い(3.9) | 良い(3) | 少ない(2.4) |
キャラ(1.5) | 好き(10) | いい(6.5) | 良い(3.5) | 多い(2.6) |
事(1.4) | 多い(4.9) | 可能(4.4) | 残念(3.4) | いい(3.3) |
作品(1.4) | 良い(7.6) | いい(6) | 好き(5.5) | 素晴らしい(4.9) |
ストーリー(1.4) | いい(6.6) | 良い(5.4) | 面白い(3.3) | 良かっ(3.1) |
難易度(1) | 高い(16) | 高め(7.2) | 高く(5.3) | 低い(4.5) |
ほう(0.89) | いい(37) | 良い(8.3) | 良かっ(4.3) | よかっ(4.2) |
グラフィック(0.85) | 綺麗(18) | いい(4.9) | 良い(4.5) | 素晴らしい(3.3) |
敵(0.78) | 強い(8) | 強さ(5.5) | 強く(4.1) | いい(3.4) |
戦闘(0.76) | 楽しい(5.5) | いい(5.4) | 面白い(5) | 良い(2.8) |
注:上記の例では単純なスコアリングで求めていますが、例えば感嘆詞("すごい!"など)や副詞+形容詞("とても美味しかった"、など)の組み合わせではウェイトを大きくするなど、様々な改造が考えられます。興味のある方は是非トライしてみてください。
この時点では、パッと見たところゲームに関連のありそうな語句が確認できる一方、そうでないものも多数散見されます。こうした語句はどうやって機械的に分別すればよいでしょうか?実は最も簡単な方法として、検索エンジンAPIを使うテクニックがあります。例えば、ゲームに関連する語句、ここでは仮に"ドラゴンクエスト"とすると、それぞれのHit数は以下のような結果になりました。
観点の候補 | Hit数(観点∩ドラゴンクエスト) | Hit数(観点) | 割合 | |
---|---|---|---|---|
こと | 4,850,000 | 367,000,000 | 1.3% | |
プレイ | 1,750,000 | 33,300,000 | 5.2% |
上記の表からは、大雑把ですが"こと"よりも"プレイ"のほうが"ドラゴンクエスト"に関連していそうだなということがわかります。(※こうした検索エンジンから意味の相関を求める方法は、Hit数以外にもSnippetから解析するなど様々な方法が提案されています)。こうしたWebの力を借りることで、観点や評価をクラスリングすることが出来るというわけです。しかし、単純には分類できないものも存在します。それは評価表現には違いないが、実はゲーム自体には関係がないというものです。例えば、(商品の)"配達"が"遅い"などがその例です。こうした評価表現の分類については、また機会を改めて考察してみたいと思います。