Handling Unicode #3

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

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

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

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *