トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

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で前処理してます。

実際のデータを読み→ローマ字で照合のがよいか、ローマ字→ひらがなで照合するのがよいか、試してみたらちょっと悩みますね。

最初は「漢字→ひらがな→ローマ字」に変換して、ローマ字表記のデータと照合したほうが良いかと思ったけど、案外「ローマ字→ひらがな」で照合したほうが良いかも。

サンプル

以下、サンプルです。

ソースコード

以下、ソースコードのハードコピーです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)→さざ-ちょやくば

添付ファイル: filecityname.txt 4579件 [詳細] fileTestICU.java 1451件 [詳細]