Javaによる漢字/ひらがな変換ライブラリKanhiraの紹介

2019年5月22日

※弊社製オープンソースソフトはオープンソースソフトウェアとしてまとめているので参照されたい。

※Kanhiraについては/tag/kanhiraを参照されたい。

機能概要

単純にJavaプログラム用のライブラリであり、漢字仮名まじり文を入力すると、その「ふりがな」「よみ」「読み仮名」を取得できるというものである。この機能をテストするユニットテストとしては以下の通り。

※JUnitの記述方法としては、結果を第一引数に書き、元を第二引数に書くことに注意。ひらがなから漢字に変換するわけではない。逆である。

public class MainTest {

  @Test
  public void test() throws IOException  {
    KanwaDict dict = KakasiDictReader.load("dict/kakasidict");
    Kanhira kakasi = new Kanhira(dict);

    assertEquals(
        "かいがいでのかいにゅうをしゅうりょうし、あめりかぐんをくににきかんさせるというかのせんきょこうやくを、ありがちなごかいがそんざいしているようにみえる。",
        kakasi.convert("海外での介入を終了し、アメリカ軍を国に帰還させるという彼の選挙公約を、ありがちな誤解が存在しているように見える。"));
    assertEquals(
        "よーろっぱぜんど、また、よーろっぱとのかんけいをつうじてほかのたいりくにも、われわれはそうらんとこんらんとてきがいしんをおこさなければならない",
        kakasi.convert("ヨーロッパ全土、また、ヨーロッパとの関係を通じて他の大陸にも、われわれは騒乱と混乱と敵愾心を起こさなければならない"));
    assertEquals("あんしんあんぜんなやふおく!じつげんにむけたYahoo!かんたんけっさいのしようへんこうについて(さいけい)",
        kakasi.convert( "安心安全なヤフオク!実現に向けたYahoo!かんたん決済の仕様変更について(再掲)"));
    assertEquals("あくめいたかいあくだいかんのわるだくみによって、きしゃのきしゃがきしゃできしゃした",
        kakasi.convert("悪名高い悪代官の悪巧みによって、貴社の記者が汽車で帰社した"));
  }
}

“dict/kakasidict”というテキストファイルの辞書をロードし、その辞書にしたがって漢字からひらがなに変換する。辞書としてはテキストファイルで以下のようなものだ。

きi 効
きk 効
こう 効
こうj 効
ききめ 効き目
こうか 効果
こうかおん 効果音
こうかき 効果器
こうかしょう 効果小
こうかぜつだい 効果絶大
こうかだい 効果大
こうかてき 効果的
こうかばつぐん 効果抜群
こうかはんてい 効果判定
こうかぶん 効果分
こうのう 効能

辞書名からわかるとおり、これはかなり昔からある「かかし(kakasi)」というシステムの一部である。Javaプログラムとしては、KAWAO, Tomoyuki氏のKAKASI/JAVAをベースとしている。

リポジトリ

以下にソースリポジトリとMavenリポジトリがある。

KAKASI/JAVAからの機能変更

元のKAKASI/JAVAから大きく機能変更していることとしては、この辞書をテキストファイルとしてメンテするのではなく、これを元にしてデータベースに格納したり、あるいはメモリ上での必要に応じた追加登録をサポートしていることである。ユーザがこのようなテキストファイルをいじってくれることを前提にはできない。

この仕組みとしては、後述することになる。

Java上で漢字/ひらがな変換を行う他のシステム

探した限りではJavaのライブラリとしては見つからなかった。Windowsの.exeをJavaから呼び出す形式でもよければ、以下がある。

  • フリガナ@ふりふり
  • KanjiConv.exe

しかし、どちらも辞書に追加登録する機能は無いようだ。そして前者はWindows-XPまでにしか対応していないとある。当然のことなのだが、自由によみを登録できないと正確なふりがなは得られないため、登録機能は必須であると考える。