Apitore blog

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

WordNetをJavaから使う

はじめに

この1週間はWordNet系のWebAPIを7本リリースしました。これらはすべてカーネギーメロン大学の嶋さんが作ったJavaライブラリを利用しています。今回はそのJavaライブラリの利用方法を紹介します。

WordNetのWebAPI作りました

下準備

Mavenに公開されているので、ありがたく使わせてもらいます。

<dependency>
  <groupId>de.sciss</groupId>
  <artifactId>ws4j</artifactId>
  <version>0.1.0</version>
</dependency>

日本語WordNetの最新版のsqliteデータをダウンロードします。これを執筆している時点(2017/5/22)ではversion 1.1が最新です。ダウンロードしたら解凍して、wnjpn.dbという名前で/src/main/resourcesの下に置きましょう。 次に、Githubのこちらにあるjawjaw.confsimilarity.confの2つのファイルを/src/main/resourcesの下に設置してください。 以上で下準備は終了です。

使い方

Githubにサンプルがあります。

少し解説します。

JAWJAWシンプル

キモは以下の部分です。posにはn,v,a,rのいずれかが入ります。JAWJAWクラスはstaticにDBを読み込むので、特に初期化は必要ないです。

Set<String> synonyms = JAWJAW.findSynonyms(word, pos);
Set<String> hypernyms = JAWJAW.findHypernyms(word, pos);
Set<String> hyponyms = JAWJAW.findHyponyms(word, pos);
Set<String> meronyms = JAWJAW.findMeronyms(word, pos);
Set<String> holonyms = JAWJAW.findHolonyms(word, pos);
Set<String> translations = JAWJAW.findTranslations(word, pos);
Set<String> definitions = JAWJAW.findDefinitions(word, pos);

JAWJAW発展

キモは以下の部分です。posはさっきと同じです。こちらの方がWordNetを細かくアクセスします。こちらもstaticにDBを読み込むので、特に初期化は必要ないです。

List<Word> words = WordDAO.findWordsByLemmaAndPos(word, pos);
List<Sense> senses = SenseDAO.findSensesByWordid( words.get(0).getWordid() );
String synsetId = senses.get(0).getSynset();
Synset synset = SynsetDAO.findSynsetBySynset( synsetId );
SynsetDef synsetDef = SynsetDefDAO.findSynsetDefBySynsetAndLang(synsetId, Lang.eng);
List<Synlink> synlinks = SynlinkDAO.findSynlinksBySynset( synsetId );

WordSimilarity

キモは以下の部分です。こちらも例に漏れずstaticにDBを読み込むので、特に初期化は必要ないです。word1word2には「犬」とか「猫」とかを入力します。少し癖がありますが、実は「犬#n」とか「走る#v」とかも入力できます。これは「#」で区切って品詞(POS)情報を指定できます。品詞はn,v,a,rのいずれかが入りますが、指定しなくても動作はします。

private ILexicalDatabase db = new NictWordNet();
private RelatednessCalculator[] rcs = { new HirstStOnge(db), new LeacockChodorow(db), new Lesk(db),  new WuPalmer(db), new Resnik(db), new JiangConrath(db), new Lin(db), new Path(db)};
WS4JConfiguration.getInstance().setMFS(true);
for ( RelatednessCalculator rc : rcs ) {
  double s = rc.calcRelatednessOfWords(word1, word2);
}

おわりに

こういうものは大抵先人が作ってくれていて、大変ありがたいですね。今や自然言語処理でも深層学習が大流行していて、皆Pythonに流れていった感じがします。なので、今回のJavaでのTipsはあまりミートしないかも?まあ、なにかの役に立てばってことで。Apitoreでは今回のライブラリを使ってWebAPIを公開しているので、よろしければ使ってみてください。