Apitore blog

Apitoreを運営していた元起業家のブログ

【API】単語間の意味的な近さを計算する(WordNet利用)

はじめに

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種類あります。それぞれのアルゴリズムの詳細はリンク先を参照ください。 ※・・・というか私も調べてないです。使えりゃいいんだよ、使えりゃ!

使い方は簡単です。類似度を評価したい単語を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::SimilarityWebAPIで公開しました。全部で8種類の計算方法がありますが、どれも高い数字であるほど意味的に近いと判定できます。ただ、日本語の動作に不具合があるのか仕様なのか、日本語の単語は類似度を評価出来ないものも結構ありました。兎にも角にも、こういうアルゴリズムは使い方次第なので、思う存分ハックしてみてはいかがでしょうか?