はじめに
この1週間はWordNet系のWebAPIを7本リリースしました。これらはすべてカーネギーメロン大学の嶋さんが作ったJavaライブラリを利用しています。今回はそのJavaライブラリの利用方法を紹介します。
WordNetのWebAPI作りました
- 概念辞書 ~WordNetが簡単に使える~
- 概念辞書 ~WordNet 完全版~
- 同義語辞書 (WordNet)
- 上位概念辞書 (WordNet)
- 下位概念辞書 (WordNet)
- 和英/英和辞書 (WordNet)
- 単語の意味類似度の評価 (8種類)
下準備
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.conf
とsimilarity.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を読み込むので、特に初期化は必要ないです。word1
とword2
には「犬」とか「猫」とかを入力します。少し癖がありますが、実は「犬#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を公開しているので、よろしければ使ってみてください。