Java:ICUを使ってみた
Last-modified: 2013-08-24 (土) 02:14:21 (3891d)
Top / Java:ICUを使ってみた
Java:ICUを使ってみた †
ICUとは、「International Components for Unicode」で、ユニコード文字列を変換するライブラリみたいなものです。
ひらがな→ローマ字とかローマ字→ひらがな、大文字、小文字とか半角、全角とかが、日本語⇔英語以外でもできるすぐれもの、っぽいですw
以下のリンクよりダウンロードできます。
とりあえず、執筆時点での最新であるICU4J 50.1をダウンロードして試してみました。
ただ動かすだけであれば以下のファイルのみで動きます。
- icu4j-50_1.jar
使った感触 †
ヘボン式で変換したかったんだけど、出し方がわからず。
ここが気になる。なんとなくできる気がするけど、どうやって指定するのか?
実際には、geonames.orgで公開している時空間情報の市区町村名(ローマ字表記)を照合したいって話で試行錯誤中。
geonames.orgのデータはこちらから。海外のサービスってところが面白いかもしれないところ。実際に入っているデータも、日本人が整備したわけではないデータで、いろいろ面白いところ有りですw
ここから、JPってやつをDLすれば手に入ります。
ちなみに、こちらの記事でawkで前処理してます。
実際のデータを読み→ローマ字で照合のがよいか、ローマ字→ひらがなで照合するのがよいか、試してみたらちょっと悩みますね。
最初は「漢字→ひらがな→ローマ字」に変換して、ローマ字表記のデータと照合したほうが良いかと思ったけど、案外「ローマ字→ひらがな」で照合したほうが良いかも。
サンプル †
以下、サンプルです。
ソースコード
- icutest.TestICU.java
- resources/icu/cityname.txt
以下、ソースコードのハードコピーですw
package icutest; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Enumeration; import com.ibm.icu.text.Transliterator; public class TestICU { public static void main(String args[]) { // 使用可能なIDリストを標準出力。 // printAvailableIDs(); // 単体変換のサンプル。 // String src = "おううち"; // String src2 = "sendai-shi"; // transliteratorTest(src); // transliteratorTest(src2); // 外部ファイルを変換元として、一括して変換し標準出力する。 String id = "Latin-Hiragana"; transCityNames(id); } /** * goenamesのJPをDLしたものの3カラム目を抜いたテキストをインプットとして、 * 引数のIDで変換して標準出力に出力。 * */ private static final void transCityNames(String id) { try { File file = new File("./resources/icu/cityname.txt"); BufferedReader br = new BufferedReader(new FileReader(file)); String str; while ((str = br.readLine()) != null) { //System.out.println(str); testTransliterator(str, id); } br.close(); } catch (FileNotFoundException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } } /** * 変換元の文字列、IDを引数として、IDで変換した値を標準出力。 * */ private static final void testTransliterator(String src, String id) { Transliterator tr1 = Transliterator.getInstance(id); System.out.println(src + "→(" + id + ")→" + tr1.transliterate(src)); } /** * 気になるIDを適当に指定して入力値をIDをもとに変換し標準出力。w * */ private static final void test(String src) { Transliterator tr1 = Transliterator.getInstance("JapaneseKana-Latin/BGN"); System.out.println(src + "→(JapaneseKana-Latin/BGN)→" + tr1.transliterate(src)); Transliterator tr2 = Transliterator.getInstance("Hiragana-Latin"); System.out.println(src + "→(Hiragana-Latin)→" + tr2.transliterate(src)); Transliterator tr3 = Transliterator.getInstance("ja_Latn-ko"); System.out.println(src + "→(ja_Latn-ko)→" + tr3.transliterate(src)); Transliterator tr4 = Transliterator.getInstance("ja_Latn-ru"); System.out.println(src + "→(ja_Latn-ru)→" + tr4.transliterate(src)); Transliterator tr5 = Transliterator.getInstance("Any-katakana"); System.out.println(src + "→(Any-katakana)→" + tr5.transliterate(src)); } /** * 使用可能なa system transliterator IDを標準出力に出力。 * */ private static final void printAvailableIDs() { Enumeration e = Transliterator.getAvailableIDs(); String tmp = ""; while (e.hasMoreElements()) { System.out.println(e.nextElement().toString()); } } /** * 使用可能なIDを使用して、入力と出力が異なるIDの場合に変換値を出力。 * */ private static final void transliteratorTest(String src) { Enumeration e = Transliterator.getAvailableIDs(); String id = ""; String tmp = ""; while (e.hasMoreElements()) { id = e.nextElement().toString(); Transliterator tr = Transliterator.getInstance(id); tmp = tr.transliterate(src); if (!src.contentEquals(tmp)) { System.out.println(src + "→(" + id + ")→" + tmp); } } } }
続いて、出力サンプルです。
Bekkai-cho→(Latin-Hiragana)→べっかい-ちょ Atsuma-cho→(Latin-Hiragana)→あつま-ちょ Ashoro-mura→(Latin-Hiragana)→あしょろ-むら Ashoro-cho→(Latin-Hiragana)→あしょろ-ちょ Aseishi-mura→(Latin-Hiragana)→あせいし-むら Arasawa-mura→(Latin-Hiragana)→あらさわ-むら Akan-cho→(Latin-Hiragana)→あかん-ちょ Abashiri-shicho→(Latin-Hiragana)→あばしり-しちょ Kitauwa-gun→(Latin-Hiragana)→きたうわ-ぐん Kamiukena-gun→(Latin-Hiragana)→かみうけな-ぐん Shisui-machiyakuba→(Latin-Hiragana)→しすい-まちやくば Nonoichi-machiyakuba→(Latin-Hiragana)→ののいち-まちやくば Saza-choyakuba→(Latin-Hiragana)→さざ-ちょやくば