Apitore blog

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

【API】日本語WordNetの全内容にアクセスできるWebAPIを公開した

はじめに

WordNetをご存知でしょうか?自然言語処理界隈では常識とも言える世界的に有名な意味辞書/概念辞書です。人手で整備されているため、非常に高品質です。最後の更新が2010年(?)なのでそこが残念ですが、まだまだ使えます。今回のWebAPIは、開発者や専門家向けにWordNetの全内容にアクセスできるWebAPIにしました。

API

サンプルコード

解説

WordNetの公式ページはこちらです。商用利用可能です。 日本語ワードネットに収録されたsynset数や単語数、語義数は次のとおりです。名詞、動詞、形容詞/形容動詞、副詞が対象です。

  • 57,238 概念 (synset数)
  • 93,834 words 語
  • 158058 語義 (synsetと単語のペア)
  • 135,692 定義文
  • 48,276 例文

WordNetを使うと以下の情報が得られます。

  • 同義語
  • 定義(文章、例文)
  • 上位概念
  • 下位概念
  • 構成要素
  • 被構成要素
  • 包含領域
  • 被包含領域
  • 例あり
  • 含意
  • 引き起こし
  • 関連
  • 属性
  • 近似
  • 反意(たぶん未収録)

こちらはWordNetの全内容にアクセスできることを売りにしたAPIなので、どんな内容が取れるか解説します。WordNetは5つのDBから構成されています。

  • Word DB
  • Sense DB
  • Synset DB
  • SynsetDef DB
  • Synlink DB

Word DB

主に単語と品詞と単語IDを管理する。

wordid
lang
lemma
pron
pos

Sense DB

主に単語IDとSynset(概念)を管理する。

synset
wordid
lang
rank
lexid
freq
src

Synset DB

主にSynset(概念)を管理する。

synset
pos
name
src

SynsetDef DB

主にSynset(概念)の説明を管理する。

synset
lang
def
sid

主にSynset(概念)間のつながりを管理する。

synset1
synset2
link
src

TIPS

名詞はそのまま使えますが、動詞や形容詞は語尾が活用します。WordNetは標準形のみを入力に取ります。「標準形なんてわかんねーよ」って場合は、形態素解析を挟むと良いです。 例えば、Apitoreで公開しているkuromoji WebAPIに単語を入力すると、レスポンスの中にbaseFormというものがあります。これが標準形です。 例を挙げると、「やってみる」の形態素解析結果から標準形を取ると、「やる」「て」「みる」になります。

使ってみた

実際に使ってみましょう。まずはWord DBからデータを引っ張ってきましょう。「lemma=犬」を入力してみます。こんな感じの出力が返ってきます。wordidが取れます。

"entries": [
  {
    "wordid": 185856,
    "lang": "jpn",
    "lemma": "犬",
    "pron": null,
    "pos": "n"
  }
]

続いて、概念を調べてみます。Sense DBで「wordid=185856」を入力してみます。2つ概念が登録されていますね。

"entries": [
  {
    "synset": "10641755-n",
    "wordid": 185856,
    "lang": "jpn",
    "rank": 0,
    "lexid": 0,
    "freq": 0,
    "src": "hand"
  },
  {
    "synset": "02084071-n",
    "wordid": 185856,
    "lang": "jpn",
    "rank": 0,
    "lexid": 0,
    "freq": 0,
    "src": "hand"
  }
]

それではSynset DBを覗いてみます。「synset=10641755-n」とすると・・・英語の概念でしょうか?「犬」が「スパイ」路線として定義されていることが確認できます。

"entries": [
  {
    "synset": "10641755-n",
    "pos": "n",
    "name": "spy",
    "src": "eng30"
  }
]

「synset=10641755-n」でSynsetDef DBを覗くと・・・「スパイ」の解説を得られます。

"synset": "10641755-n",
"lang": "jpn",
"def": "敵の情報を得るために国家に雇われた、または競合他社の企業秘密を得るために会社に雇われた秘密諜報部員",
"sid": 0

「synset=10641755-n」かつ「link=hypo」と指定してSynlink DBにもアクセスします。すなわち「スパイ」の下位概念を調べているわけです。いっぱいありますね。

"entries": [
  {
    "synset1": "10641755-n",
    "synset2": "09970192-n",
    "link": "hypo",
    "src": "eng30"
  },
  {
    "synset1": "10641755-n",
    "synset2": "10027476-n",
    "link": "hypo",
    "src": "eng30"
  },
  {
    "synset1": "10641755-n",
    "synset2": "10063919-n",
    "link": "hypo",
    "src": "eng30"
  },
  {
    "synset1": "10641755-n",
    "synset2": "10103228-n",
    "link": "hypo",
    "src": "eng30"
  },
  {
    "synset1": "10641755-n",
    "synset2": "10205833-n",
    "link": "hypo",
    "src": "eng30"
  },
  {
    "synset1": "10641755-n",
    "synset2": "10610850-n",
    "link": "hypo",
    "src": "eng30"
  }
]

とまあこんな感じで、WordNetの全内容にアクセスできるわけです。

おわりに

WordNetのWebAPIを公開しました。シンプルに使えるWordNetのWebAPIに比べて、使い勝手は悪いです。ただ、機械学習の素性に用いる場合は、こちらのAPIの方が有用です。単語を学習素性に加えつつ、Synset(概念)も素性に加えるとか、少し前のSVM (Support Vector Machine) の時代によくやられていたテクニックです。最近は深層学習ばかりよく聞きますが、対象によってはSVMとかAdaboostとか、一昔前の技術でも全然性能出ます(最近話題にもなりましたね)。もちろん深層学習の素性にも使えます。

備考

WordNetをWebAPIにして公開するにあたり、JavaのWrapperを使わせてもらいました。カーネギーメロン大学の嶋英樹さんが作成したJAWJAWです。JAWJAWのソースコードはこちらで公開されていますし、嶋さんの後輩の方かな?@ScissさんがMavenに登録するためにGithubでもソースコードを公開してます。今回はMavenを使いました。Githubを見ればサンプルコードもあるので、JAWJAWの使い方には困らないと思います。

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