正規表現による日本語の送り仮名の揺れの統一


先日の記事http://d.hatena.ne.jp/niming538/20080921が自分でたいへん気に入っています。
制作会社で働く人向け「はじめての正規表現」(http://d.hatena.ne.jp/jdg/20080921/1222002244)という記事に感化されて書いたものです。


まず通常の正規表現に関するアーティクルとの違いは日本語を対象としていること。日本語はたいへんめんどうくさい、めんどっちい言語で、おくりがな、送り仮名、送りがな、とか同じことをいろんな風に書けてしまう。表現を豊かにする意味ではいいのですが、逆に統一したいときにむずかしい。人がやれば簡単なのになかなか機械的にできない。さはさりながらそこをなんとかしたいのが人情で、そこに切り込んでいるのがえらい(自画自賛)。


次に、正規表現による置換プログラムは出来上がりだけ示されることが多くて、読んでなにがなんだかわからないのが普通ですが、そこが示されている。まずは、ふんだんな例文をどのように変換したいか示して、始めている。今回はテストユニットは作らなかったのですが、考え方としてはテストドリブン。テストドリブンにした結果、最短距離よりも、まず一旦対象を展開してから、目的に絞り込むプログラムとしている。こうすることによって、ワンパスで読んでわからないプログラムを作るより、なんと5パスも使って、わかりやすい置換プログラムになっている。その結果、応用(別の送りがなルールへの変換)もたやすく解決できている。

gsub(/見積/, "見積もり")
gsub(/見積もり(?=[っらるれろ])/, "見積も")
gsub(/見積もりも(?=[っらるれろ])/,"見積も")
gsub(/見積もり(もり|り)/, "見積もり")
gsub(/見積も/, "見積")

正しい表記も直したい対象もすべて一旦「見積」という文字を「見積もり」とする。その結果、正しかったものについては、変になっている(冗長になっている)ので、若干の試行錯誤で絞込み、もりもりとかもりりというところまで持っていって、最後に「見積り」もしくは「見積もり」にする。こんな考え方です。途中は書き方によっては簡略化可能と思います(「り」の処理とか)。