to top page
2013-02-24
正規表現による手抜き形態素解析
Ruby によるルーチン。

# -*- coding: utf-8 -*-
text = "吾輩は猫である。名前はまだ無い。"
text.scan(/[ぁ-んー]+ | [ァ-ンー]+ | [一-龍]+ | [。、]/) do | token |
  if token =~ /^[ぁ-んー]/
    if token =~ /^([はがのにへともでを])(.+)/ # これらが平仮名列の先頭にあったら助詞と見なす。
      prefix = $1
      token = $2
    end
    if token =~ /(.+)((ので) | (から) | (まで) | [もはがでを])$/ # これらが末尾にあったら助詞と見なす。
      token = $1
      suffix = $2
    end
    print prefix, " | " if prefix
    print token, " | "
    print suffix, " | " if suffix
  else
    print token, " | "
  end
end

出力はこう。
吾輩 | は | 猫 | で | ある | 。 | 名前 | は | まだ | 無 | い | 。 |

「無」と「い」が分割されてしまっているが、人工無能的な乱れ文をつくるにはこの程度の解析で足りるし、かえっておもしろい文ができたりもする。精緻な解析が必要ならともかく、遊びでやるならこのルーチンはかなり使えます。以下は、MeCab との比較。

MeCab でやると、
吾輩 | は | 猫 | で | ある | 。 | 名前 | は | まだ | 無い | 。 |

もう少し長いのを上のスクリプトにかけると、
どこ | で | 生 | れたかとんと | 見当 | が | つかぬ | 。 | 何 | で | も | 薄暗 | いじめじめした | 所 | で | ニャーニャー | 泣 | いていた | 事 | だけ | は | 記憶 | している | 。 |

同じ文を MeCab で分解すると、
どこ | で | 生れ | た | か | とんと | 見当 | が | つか | ぬ | 。 | 何 | でも | 薄暗い | じめじめ | し | た | 所 | で | ニャーニャー | 泣い | て | いた事 | だけ | は | 記憶 | し | て | いる | 。 |