Handling Unicode #4

やはり、漢字やタイ語云々についてはルールの中に組み入れるのはやめ、

  • 分割ルールで分割可能と判断され
  • 分割位置の左右の Scripts.txt 内のプロパティが Common でなく
  • 分割位置の左右の Scripts.txt 内のプロパティが同一である

場合には分割しないようにした。この拡張ルールは [cci]Unistring.getWords(str, useScripts)[/cci] の第 2 引数で有効にするかを指定できる。

それから、UAX#29 のルールだと、空白類を1文字ずつ分割してしまう。これはそういうようにデザインされているのかわからないが、wasavi に組み込むにあたってはとても不便そうだ。そういうわけで連続する空白類はひとまとまりの擬似的な単語として扱うようにした。

ちなみに Scripts.txt 併用ルールだと、連続する絵文字はひとまとめに扱われない。絵文字は Common スクリプトに含まれるからだ。でも、たとえば Chrome や Firefox で Ctrl+← や Ctrl+→ 使うとひとまとめにしてるんだよね。どうしようかな。

Handling Unicode #3

unistring に、UAX#29 における word boundary の定義に従って文字列を単語で分割するメソッドを追加したい。

そういうわけでやってみたところ、UAX#29 自身に書いてあることであるが、ドキュメントに例示されているアルゴリズムそのままだと、あまり実用にはならない。とてもありがちなことに、ラテン文字が処理のメインになっているのだ。なぜかカタカナだけは組み入れられているが……。ただこれは無理もないことで、日本語と中国語の場合は分かち書きをしないので単純なルールで分割することはできない。Mecab みたいな形態素解析プログラムの助けを借りなければならない。

しかしまあだとしても、例えばひらがなが1文字ずつ分割されたりするのは実際実用にならないわけで、ちょっとだけ拡張したい。

できれば実装自体は UAX#29 通りにして、分割のルールを独自に追加変更できるようなインターフェースを組み込もうかと思ったが、面倒そうなのでやめた。とりあえず UAX#29 で例示されているタイ語、ラオス語、クメール語、ミャンマー語、それから漢字とひらがなについて分割を禁止するようなルールを組み込んだ。ただこの辺はこれらのスクリプトに限定せず、WB14(なんでも分割可のルール)の直前に、同一スクリプト間は分割禁止、みたいなルールを追加するなど、ある程度一般化したほうがよいかもしれない。

そんなわけで WordBreakTest.txt の1489種のテストに全てパスするようになった。ちなみに書記素クラスタの方も GraphemeClusterTest.txt の402種のテストに全てパスする。