読者です 読者をやめる 読者になる 読者になる

MeCabのWebAPIを公開してみた

仕事でmecabを使わざるを得ない機会が出てきました。
やりたいことは複合名詞の取得。

SEOを目的としたサイト内リンクの増加の為に、キーワードを増やしたいわけですが、これがどうしてもサイトがターゲットの業界でよく使われるキーワードが多く、データは毎日何万、何十万という単位での変更があるため、手動では追いつきません。
そこでMeCabでの複合名詞の自動取得というわけです。

ただ、サーバのOSのバージョンやライブラリの関係から全サーバにMeCabを入れるのが辛い状況。
そこでWebAPIなのですが、仕事用ということでどうしても独自性が出てきて汎用的ではありません。また割り込みも多く開発がどうしても遅くなりがちです。
個人的にNLP機械学習系は興味があったのですが、これを機会に個人で作ろうかと思いたち公開しました。


サイトはここです。
形態素解析 Mecab(複合名詞対応) Web版


とりあえず、以前作成した http://sqale.yoseba.org/ と同じくSqaleさんを利用します。
内容的には大したことないですし(DataBaseすら必要無い),個人でクラウド借りてサーバの管理までしたくはないので、これで十分でしょう。

ちなみに、mohadanaはMeCab->和布蕪->海苔から調べると、こういう記述がありまして、パクりました。
海苔 - Wikipedia

和銅3年(710年)に遷都した平城京には、海草類を売る「にぎめだな」(和布店)、海苔や昆布を佃煮のように加工したものを売る「もはだな」(藻葉店)という市場も存在した。

WebAPIを使ってみる

http://mohadana-khondalit.sqale.jp/api のサンプルから持ってきます。
complexオプションを付けることにより、複合名詞を推測します

$ curl -G http://mohadana-khondalit.sqale.jp/api/v1/parse --data-urlencode sentence="日本語の形態素解析" -d complex|jq
{
  "status": 200,
  "message": "Success",
  "results": [
    {
      "surface": "日本語",
      "reading": "ニホンゴ",
      "pronunciation": "ニホンゴ",
      "pos": "名詞",
      "pos_detail": [
        "一般"
      ],
      "conjugated_form": null,
      "conjugated_type": null,
      "infinitive": "日本語"
    },
    {
      "surface": "の",
      "reading": "ノ",
      "pronunciation": "ノ",
      "pos": "助詞",
      "pos_detail": [
        "連体化"
      ],
      "conjugated_form": null,
      "conjugated_type": null,
      "infinitive": "の"
    },
    {
      "surface": "形態素解析",
      "reading": "ケイタイソカイセキ",
      "pronunciation": "ケイタイソカイセキ",
      "pos": "名詞",
      "pos_detail": [
        "複合"
      ],
      "conjugated_form": "",
      "conjugated_type": null,
      "infinitive": null
    }
  ]
}

複合名詞の判定

品詞の種類で判定しています。
初めは名詞+名詞という単純なルールで実験をしていましたが、これが結構ダメなようでして色々調べた所、幾つかのパターンがあるようです。

例えば、「医療機関」。これは一般名詞の連続で、この場合は複合名詞と判定して良いようです。

$ echo 医療機関|mecab
医療    名詞,一般,*,*,*,*,医療,イリョウ,イリョー
機関    名詞,一般,*,*,*,*,機関,キカン,キカン
EOS

$ curl -G http://mohadana-khondalit.sqale.jp/api/v1/parse --data-urlencode sentence="医療機関" -d complex|jq
{
  "status": 200,
  "message": "Success",
  "results": [
    {
      "surface": "医療機関",
      "reading": "イリョウキカン",
      "pronunciation": "イリョーキカン",
      "pos": "名詞",
      "pos_detail": [
        "複合"
      ],
      "conjugated_form": "",
      "conjugated_type": null,
      "infinitive": null
    }
  ]
}

では「交通費」はどうでしょうか。
この場合は「費」が名詞ですが、接尾語のようです。逆に接頭語とかもありそですね。
この場合も複合名詞として良いでしょう。

$ echo 交通費 |mecab
交通    名詞,一般,*,*,*,*,交通,コウツウ,コーツー
費      名詞,接尾,一般,*,*,*,費,ヒ,ヒ
EOS

$ curl -G http://mohadana-khondalit.sqale.jp/api/v1/parse --data-urlencode sentence="交通費" -d complex|jq
{
  "status": 200,
  "message": "Success",
  "results": [
    {
      "surface": "交通費",
      "reading": "コウツウヒ",
      "pronunciation": "コーツーヒ",
      "pos": "名詞",
      "pos_detail": [
        "複合",
        "後接続不可"
      ],
      "conjugated_form": "",
      "conjugated_type": null,
      "infinitive": null
    }
  ]
}
||>

このように幾つかのパターンをWeb上で調べまして、複合名詞処理を行いました。
専門家ではない人間が行った処理ですので、推測が正確ではないかもしれませんが、テストをした範囲ではそれなりに動くようです。


** 今後の対応
複合名詞以外にも、複合動詞というのがあるそうですので対応を行うのも良いかもしれません。
名詞でもアニメのタイトルなど判定が難しい新語もありますので、このあたりは辞書を強化する必要があるでしょう。
また、分野によってはアスキーアートの対応が欲しい場面もあるようです。

まだまだ追加したい処理はありますので、これから対応したいと考えています。