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

Java:ICUを使ってみた の変更点

Top / Java:ICUを使ってみた

*Java:ICUを使ってみた [#v5945071]

ICUとは、「International Components for Unicode」で、ユニコード文字列を変換するライブラリみたいなものです。

ひらがな→ローマ字とかローマ字→ひらがな、大文字、小文字とか半角、全角とかが、日本語⇔英語以外でもできるすぐれもの、っぽいですw

以下のリンクよりダウンロードできます。
-http://site.icu-project.org/download

とりあえず、執筆時点での最新であるICU4J 50.1をダウンロードして試してみました。

ただ動かすだけであれば以下のファイルのみで動きます。

-icu4j-50_1.jar

***使った感触 [#odc2bf2e]
ヘボン式で変換したかったんだけど、出し方がわからず。

ここが気になる。なんとなくできる気がするけど、どうやって指定するのか?
-http://fossies.org/unix/misc/icu4c-50_1-src.tgz:a/icu/source/data/lang/ja.txt

実際には、geonames.orgで公開している時空間情報の市区町村名(ローマ字表記)を照合したいって話で試行錯誤中。

geonames.orgのデータはこちらから。海外のサービスってところが面白いかもしれないところ。実際に入っているデータも、日本人が整備したわけではないデータで、いろいろ面白いところ有りですw

-http://www.geonames.org/
-http://download.geonames.org/export/dump/

ここから、JPってやつをDLすれば手に入ります。

ちなみに、こちらの記事でawkで前処理してます。

-http://www.hiihah.info/index.php?awk%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6#z6b041a0

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

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

***サンプル [#v5131c27]

以下、サンプルです。

ソースコード
-icutest.&ref(TestICU.java);
-resources/icu/&ref(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)→さざ-ちょやくば