Apitore blog

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

【API】日本語WordNetをシンプルに使えるWebAPIを公開した

はじめに

WordNetをご存知でしょうか?自然言語処理界隈では常識とも言える世界的に有名な意味辞書/概念辞書です。人手で整備されているため、非常に高品質です。最後の更新が2010年(?)なのでそこが残念ですが、まだまだ使えます。今回のWebAPIはWordNetの複雑性を廃して、とてもシンプルに使えるようにしました。

API

サンプルコード

解説

WordNetの公式ページはこちらです。商用利用可能です。日本語版はNICTが監修しています。

国立研究開発法人情報通信研究機構(NICT)では、大規模かつどなたでもご入手いただける日本語の意味辞書を開発することを目的とし、 2006年から日本語ワードネットの開発を進めて参りました。その後2009年2月に 日本語ワードネット0.9版 をまず公開いたしました。 日本語ワードネットは、プリンストン大学で開発された Princeton WordNet やPrinceton WordNetとヨーロッパのEuroWordNet協会が推進す るGlobal WordNet Gridに 着想を得て開発されました。 ライセンスを保持していただければ、基本的に日本語ワードネットは無償で使用、複写、改変、頒布していただけます。 詳細はライセンスをご参照下さい。

ありがたい。 日本語ワードネットに収録されたsynset数や単語数、語義数は次のとおりです。名詞、動詞、形容詞/形容動詞、副詞が対象です。

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

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

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

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>

TIPS

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

使ってみた

実際にAPIをコールしてみましょう。今回のWebAPIは単語と品詞を入力に、同義語や上位概念語などを出力します。 ApitoreのSwaggerページからWebAPIをコールします。 「犬」の場合はこんな感じのレスポンスが返ってきます。同義の単語とか、上位/下位概念の単語とか。個人的にアタリだと思うのは、和英/英和翻訳できるところですね。

"entries": [
  {
    "labelen": "syns",
    "labelja": "同義語",
    "pos": "n",
    "words": [
      "工作員",
      "間者",
      "回し者",
      "飼い犬",
      "探",
      "飼犬",
      "廻し者",
      "密偵",
      "探り",
      "廻者",
      "ドッグ",
      "回者",
      "洋犬",
      "秘密捜査員",
      "いぬ",
      "イヌ",
      "スパイ",
      "隠密",
      "諜報員",
      "諜者",
      "まわし者",
      "間諜"
    ]
  },
  {
    "labelen": "hype",
    "labelja": "上位語",
    "pos": "n",
    "words": [
      "スパイ",
      "密偵",
      "イヌ科動物",
      "家畜"
    ]
  },
  {
    "labelen": "hypo",
    "labelja": "下位語",
    "pos": "n",
    "words": [
      "工作員",
      "わんわん",
      "雑種犬",
      "ウェルシュ・コーギー",
      "仔犬",
      "わんこ",
      "狆ころ",
      "グリフォン",
      "子犬",
      "ブリュッセルグリフォン",
      "カウンタースパイ",
      "猟犬",
      "ワーキングドッグ",
      "雑犬",
      "犬児",
      "犬子",
      "犬ころ",
      "ワンワン",
      "小型犬",
      "小犬",
      "プードル",
      "グリフォンブリュッセロワ",
      "諜報員",
      "パグ",
      "わんちゃん",
      "駄犬",
      "ダブルエージェント"
    ]
  },
  {
    "labelen": "holo",
    "labelja": "構成要素",
    "pos": "n",
    "words": [
      "群",
      "群れ",
      "イヌ属"
    ]
  },
  {
    "labelen": "dmn",
    "labelja": "被包含領域",
    "pos": "n",
    "words": [
      "軍勢",
      "軍旅",
      "軍隊"
    ]
  },
  {
    "labelen": "hasi",
    "labelja": "例あり",
    "pos": "n",
    "words": [
      "マタ・ハリ"
    ]
  },
  {
    "labelen": "dfn",
    "labelja": "定義",
    "pos": "n",
    "words": [
      "(military) a secret agent hired by a state to obtain information about its enemies or by a business to obtain industrial secrets from competitors",
      "a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times; occurs in many breeds; \"the dog barked all night\""
    ]
  },
  {
    "labelen": "tran",
    "labelja": "翻訳",
    "pos": "n",
    "words": [
      "undercover_agent",
      "domestic_dog",
      "canis_familiaris",
      "spy",
      "dog"
    ]
  }
]

私は今、「ピザ」が食べたい。「ピザ」の場合はこういう感じになります。同義語が「ピッツァ」とか面白い。下位概念に「チーズピザ」しかないなんて・・・マルゲリータとかはどうなっているんでしょうか?

"entries": [
  {
    "labelen": "syns",
    "labelja": "同義語",
    "pos": "n",
    "words": [
      "ピッツア",
      "ピッツァ",
      "ピザパイ"
    ]
  },
  {
    "labelen": "hype",
    "labelja": "上位語",
    "pos": "n",
    "words": [
      "一皿分の料理",
      "料理",
      "皿に盛った料理",
      "一品"
    ]
  },
  {
    "labelen": "hypo",
    "labelja": "下位語",
    "pos": "n",
    "words": [
      "チーズピザ"
    ]
  },
  {
    "labelen": "dfn",
    "labelja": "定義",
    "pos": "n",
    "words": [
      "Italian open pie made of thin bread dough spread with a spiced mixture of e.g. tomato sauce and cheese"
    ]
  },
  {
    "labelen": "tran",
    "labelja": "翻訳",
    "pos": "n",
    "words": [
      "pizza_pie",
      "pizza"
    ]
  }
]

残念ながら、あらゆる単語を網羅しているわけではありません。例えば、「魔女の宅急便」はレスポンスが返ってきません。

"entries": []

おわりに

WordNetのWebAPIを公開しました。複雑性を排除して、シンプルに使えるようにしています。これを使うと、例えば検索語の拡張ができます。他には、誰かのつぶやきの単語を上位概念に言い換えてやることで、ちょっと哲学的なつぶやきにすることもできます(誰特だけどそういうbotもアリじゃない?)。辞書は何かと使えるので、うまくつかってみてください。