中国語簡体字のコレーション

dita-usersにEliot Kimberさんが辞書ベースで単語のピンインを求めてソーティングに使用できる中国語簡体字のコレーターを開発したとのポストがありました.

New DITA Community Project: org.dita-community.i18n

中国語簡体字の並び順は、「ピンイン(拼音)/画数/部首/GB0のコード」です.ところが日本語の漢字と同様に中国語の漢字でも読みが複数ある場合が多いのです.例えば「重」という字は「重さなる(chong2)」と「重い(zhong4)」の2つの読みがあります.でもJavaでコレータを作成する時、ある文字に対して割り当てられるピンインは1つだけです.ですので仕方なく、使用頻度が多い方のピンインを採用します.でもこうしてしまうと、例えば索引を作るとき「重」を先頭とする索引語が「C(chong2)」か「Z(zhopng4)」のいずれかに固定してしまいます.これは中国の方からすれば本来は許しがたいことです.しかし、これにはなかなか良い解決策がありません.

Kimberさんの辞書を使う方法は、辞書を引くことにより、複数の読みがある場合でも正確にピンインを求められるのです.ですので私は最初のコメントでは「スバラシイ!」でした.しかしよくよくプログラムを見ると、単語を辞書で引いてそのピンインを最初にそのままソートキーにしているだけなのです.これだと同じ漢字がひとかたまりにまとまってくれません.これでは使い物にならないので、「ピンイン(拼音)/画数/部首/GB0のコード」という仕様にマッチしていない旨指摘したのですが、どうもそのあたりは文化の違いもあってか理解していただけないようです.

結局議論はGitHubのissueリストに持ち越しとなりました.

Refine Sort Ordering for zh-CN 

Kimberさんは公の文書でそのようにソートキーを定めている例があったら教えてほしいとのリクエストでしたので、IBMICUの記述を送りました.

2. Han Collation

ここには明確に以下のように書いてくれています.(strokeは画数、radical-strokeは部首の画数順⇒つまり部首順です)

1. Pinyin: compare according to the pinyin for each character. If the pinyin is the same, compare by stroke order.
2. Stroke: compare according to the total strokes for each character. If the total strokes are the same, compare by radical-stroke order.
3. Radical-Stroke: compare according to the radical-stroke for each character. If these are the same, compare by code point order.

実際の例は次のようなものです.これは昔(2002年頃)買った中国語-英語-日本語-韓国語のコンピュータ辞典の「工(gong1)」の箇所です.「工」の次の2文字目を見ればわかりますが、文字単位にソートされるのがあたりまえなのです.

イメージ 1


中国語簡体字の文字列比較の理想の実装は以下の様なものです.

1. 文字列が与えられる.
2. これを単語に分けて辞書を引き、正確なピンインを求める.
3. 単語の各文字単位に「ピンイン(拼音)/画数/部首/GB0のコード」を求める.
4. このキーにより2つの文字列を比較する.

むつかしい点は、辞書を使いながら文字列を正確な単語(単語でなければ単独の文字でもよい)に分割することです.辞書の性能に依存します.

これが実装できれば中国の方にストレスなしのソーティング結果を提供することができます.Kimberさんのポストでフリーの辞典があることがわかったので頑張って挑戦してみたいと思います.