日本語の読みがな取得機能を実現するには

Pocket

日中版北辞郎のコードを書いていて、入力した日本語に対応する読みがなを取得する機能が必要になりました。中日版のピンイン入力補助機能のようなものです。

さすがにデータを1から集めてガリガリと実装していくのはハードルが高いので、使い勝手の良いAPIはないか探します。

Yahooが提供しているテキスト解析:ルビ振り がそのものずばりなのですが、処理結果がXMLで帰ってくるのでAjaxで使おうとするとクロスドメインの制限にひっかかります。jQueryのjquery.xdomainajax.jsというライブラリを使うとこの制限はクリアできますが、このライブラリはYQL(Yahoo! Query Language)を利用していて、なんだかいろいろ間に挟まりすぎている感が……。外部のサービスを使っていると何かあった時に不便ですし、この案は見送ることにしました。

それで使うことにしたのがIgo-php。少し前に形態素解析で利用したライブラリですが、日本語の形態素解析を行うと読みも取得することができるのです。

function get_hiragana() {
  require_once 'Igo.php';
  $igo = new Igo("./lib/ipadic", "UTF-8");
  $str = $_REQUEST['str'];
  $kana = "";
  $result = $igo->parse($str);
  #結果にはsurface、feature、startが含まれる
  foreach($result as $value) {
    $feature = explode(",", $value->feature);
    if (array_key_exists(7, $feature)) {
      $kana .= $feature[7];
    } else {
      $kana .= $value->surface;
    }
  }
  #読みがカタカナで返ってきているのでひらがなに変換
  $kana = mb_convert_kana($kana, "c");
  return $kana;
}

6行目でIgoによる形態素解析を実行し、8行目からのループで読みを取り出しています。Igoの形態素解析では形態素ごとにsurface、feature、startという結果が返ってきます。surfaceは形態素、featureはその形態素の品詞や読みなどの情報を含むカンマ区切りの文字列、startは当該形態素の文字列におけるスタート位置になるようです。読みの情報は、featureに含まれていてカンマで区切られた要素の8番目にあります。9行目でfeatureを配列に変換し、10行目以降で読みが含まれていればそれを取得しています(英数字や句読点など読みを含まない形態素の場合はsurfaceをそのまま取得)。

とても手軽に導入でき、精度も使い勝手も良く大満足です。作者の方に感謝。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください