マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

JIS X 4061 が謎すぎる件について(1)

最近の日本の TeX 界隈では「索引」がホットトピックになってるようで、例えば、mendex が(部分的に)Unicode に対応*1したり、或いは、とある TeX な目的のために とある技術情報投稿サイトとある人日本語のソート処理の説明を英語で書いていたりする。

ところで、その英語の解説は、JIS X 4061(日本語文字列照合順番)という JIS 規格に定められた処理方法(のうちの一つ)を解説することを目的としているようである。この JIS 規格に、ちょっと解釈に迷う箇所がある、というのがこの記事のお話。

基底文字と照合属性

JIS X 4061 の照合処理*2の対象とする文字列は、通常の日本語表記に現れる文字種*3の全て(記号や欧文文字も含む)を許しているが、ここでの話は、最も重要な部分である「仮名文字列」に対象を絞る。*4そして、この小節では実際の JIS 規格を少し単純化したモデルを用いて規格に現れる概念について説明する。

仮名文字列の照合は、単一の仮名文字に普通の「五十音順」(あ<い<う<…<を<ん)を与えた上での「辞書順」*5に従う。しかし実際に扱う文字列には濁点・半濁点が付いた文字も含まれうる。その場合は、濁点・半濁点を無視して並べる。

かく < がけ < かこ

ただし、濁点・半濁点を取った文字列が全く同一になる場合は、濁点・半濁点の位置に応じて順序を決める。

かく < かぐ < がく

さて、このような処理を厳密に定義するため、JIS X 4061 では各文字について「基底文字」と「照合属性」という概念を定めている。

  • 基底文字: 濁点・半濁点を取った文字。「あいうえお……わゐゑをん」の 48 文字をこの順に並べる。
  • 照合属性: 「清音」「濁音」「半濁音」の 3 つをこの順に並べる。*6

例えば次のように定められる。

  • 〈か〉: 基底文字=[か]、照合属性=[清音]
  • 〈ぐ〉: 基底文字=[く]、照合属性=[濁音]

これらの概念を用いて、仮名文字列の照合を手順は以下のように定められる。

  • 照合対象の 2 つの仮名文字列の各々について「各文字をその基底文字に置き換えてできる文字列」(これを本記事では「基底文字列」と呼ぶ)を作り、それらを照合する。同じでない場合はここで終了。
  • 基底文字列が同じである場合は、各々の文字列を「照合属性列」を照合する。

幾つか照合の例を見てみよう。〈かく〉vs〈がけ〉の場合は次のようになる。

1. 基底文字列を比較:[かく] < [かけ]
照合結果: 〈かく〉 < 〈がけ〉

〈かく〉vs〈かぐ〉の場合。

1. 基底文字列を比較:[かく] = [かく]
2. 照合属性列を比較:[清清] < [清濁]
照合結果: 〈かく〉 < 〈かぐ〉
列の比較を一度で済ませる方法

先に述べたアルゴリズムでは、「基底文字列」と「照合属性列」の各々について比較を行っているが、次のような工夫を行うことで、「列の比較」を一度で済ませることができる。

  • 「基底文字列」と「照合属性列」をこの順で連接したものを「照合キー列」とする。
  • すると、仮名文字列の照合はこの「照合キー列」の単純な辞書順での比較と一致する。

多数の文字列のソート(整列)をする場合は照合を何度も繰り返す必要があるので、その場合、対象となる文字列を一度「照合キー列」に変換しておくと、単純な辞書順での整列に帰着されて処理が単純になることがある。*7

例えば、〈かぐ〉〈かこ〉〈がけ〉〈かく〉の 4 つの単語を昇順で整列したいとする。各文字列の照合キー列を求めると以下のようになる。

  • 〈かぐ〉 → [かく清濁]
  • 〈かこ〉 → [かこ清清]
  • 〈がけ〉 → [かけ濁清]
  • 〈かく〉 → [かく清清]

照合キー列を単純辞書順で整列すると、元の文字列の整列が得られる。

  1. 〈かく〉 → [かく清清]
  2. 〈かぐ〉 → [かく清濁]
  3. 〈がけ〉 → [かけ濁清]
  4. 〈かこ〉 → [かこ清清]

以上、「単純化した」モデルについて考えてきたが、実際の日本語の仮名文字列は「小書き文字」「平仮名と片仮名」等の要素があってもっと複雑である。以降では、それらの扱いも含めた「実際の JIS X 4061 の規定」について見てみる。

*1:表記文字列に JIS X 0208 に対応しない Unicode 文字が現れた場合でも出力が「そのままの文字列」になる。

*2:「照合」とは 2 つの文字列が与えられた時にどちらが先であるかを決定する処理のこと。「ソート(整列)」処理は「照合」を何度も繰り返すことによって実行される。

*3:概ね JIS X 0208文字集合に等しいが若干拡張されている。

*4:漢字を含む文字列については事前にその「読み」となる仮名文字列を与えてそちらを(まず)照合に使う、という規定なので、日本語の文献の索引に現れる単語の大部分は「仮名文字列」として照合されることになる。

*5:この記事では「辞書順」は情報科学でいう単純な「辞書順」のことを指す。一般には、この記事で述べているような濁点や小文字などの複雑な処理を入れたものが「辞書順」と呼ばれることもある。

*6:この記事では、照合属性の値を先頭の一文字(「清」「濁」「半」)で略称することがある。

*7:実際の計算機での処理では、各要素に適当な符号値を与えて整数列として扱うことになる。例えば照合属性は「清→0、濁→1、半→2」とする。