はじめに
WordNet::SimilarityというPerlのライブラリがあります。単語の意味的な近さを評価することが目的で、これまでに提案されたいくつかの手法が実装されています。今回はこちらをWebAPIにしました。
API
サンプルコード
解説
Perlのライブラリはこちらにあります。今回はこちらのJava版であるWS4Jを使います。こちらは、前回紹介したWordNetのJava版(JAWJAW)を作った嶋さんのものです。前回同様、Mavenに上げるためにGithubにもソースコードが公開されています。
<dependency>
<groupId>de.sciss</groupId>
<artifactId>ws4j</artifactId>
<version>0.1.0</version>
</dependency>
アルゴリズムは8種類あります。それぞれのアルゴリズムの詳細はリンク先を参照ください。 ※・・・というか私も調べてないです。使えりゃいいんだよ、使えりゃ!
- HSO:Hirst and St-Onge (1998)
- JCN:Jiang and Conrath (1997)
- LCH:Leacock and Chodorow (1998)
- LESK:Banerjee and Pedersen (2002)
- LIN:Lin (1998)
- PATH
- RES:Resnik (1995)
- WUP:Wu & Palmer (1994)
使い方は簡単です。類似度を評価したい単語を2つ入力するだけです。ただし、WordNetなので単語の標準形しか受け付けません。名詞はそのまま使えますが、動詞や形容詞は語尾が活用します。「標準形なんてわかんねーよ」って場合は、形態素解析を挟むと良いです。例えば、Apitoreで公開しているkuromoji WebAPIに単語を入力すると、レスポンスの中にbaseForm
というものがあります。これが標準形です。例を挙げると、「やってみる」の形態素解析結果から標準形を取ると、「やる」「て」「みる」になります。
使ってみた
各手法の特徴を見てみましょう。
HSO:Hirst and St-Onge
- min score = 0.0
- max score = 16.0
- error score = -1.0
"word1": "犬",
"word2": "密偵",
"similarity": 16
JCN:Jiang and Conrath
- min score = 0.0
- max score = Infinity
- error score = -1.0
"word1": "犬",
"word2": "密偵",
"similarity": 12876699.500047589
LCH:Leacock and Chodorow
- min score = 0.0
- max score = Infinity
- error score = -1.0
"word1": "犬",
"word2": "密偵",
"similarity": 3.6888794541139363
LESK:Banerjee and Pedersen
- min score = 0.0
- max score = Infinity
- error score = -1.0
"word1": "犬",
"word2": "密偵",
"similarity": 15
LIN:Lin
- min score = 0.0
- max score = 1.0
- error score = -1.0
"word1": "犬",
"word2": "密偵",
"similarity": 1
PATH
- min score = 0.0
- max score = 1.0
- error score = -1.0
"word1": "犬",
"word2": "密偵",
"similarity": 1
RES:Resnik
- min score = 0.0
- max score = Infinity
- error score = -1.0
"word1": "犬",
"word2": "密偵",
"similarity": 10.379465487524683
WUP:Wu & Palmer
- min score = 0.0
- max score = 1.0
- error score = -1.0
"word1": "犬",
"word2": "密偵",
"similarity": 1
おわりに
単語の意味的な近さを計算するWordNet::SimilarityをWebAPIで公開しました。全部で8種類の計算方法がありますが、どれも高い数字であるほど意味的に近いと判定できます。ただ、日本語の動作に不具合があるのか仕様なのか、日本語の単語は類似度を評価出来ないものも結構ありました。兎にも角にも、こういうアルゴリズムは使い方次第なので、思う存分ハックしてみてはいかがでしょうか?