深町です。
MeCab を使った Splitter を作っているところなのですが(まだ、完成してない)、
興味のある方はどうぞ。
http://www.atransia.co.jp/download/JUTSplitter/index_html
http://www.atransia.co.jp/download/JUTSplitter/JUTSplitter-0.0.1a.tgz
Purloined http://www.atransia.co.jp/home/Purloined/
にいれたら、COREBlog でもちゃんと認識して動いてくれているようです。
記事がまだほとんどないので、なんですが。
(中神さんの ejSplitter を今日まで入れてたのですが、はずしちゃった裏切り者
(笑)
なにせ一晩かけてのできたてのほやほやのところなので、
かなりいいかげんなバグバグバグ。
(Zope 2.7 がどうこうと騒いでいた人がいるから、ひきづられて
ちゃんと作ってる時間がなくなってしまった〜。もっともちゃんと
つくってもたいしたものになるわけではないが)
Pyhon 2.2.3 と Python 2.3.3 でしか動作確認していないので
Pythn 2.1.3 だと動かないかもしれないです。
速度も MeCab を使っているのに遅いです。理由は明確なんですが
とりあえず、あれこれ入れるだけ入れたあとにすっきりさせようかなと。
あと、これにまつわる話をダラダラと。
Chasen を使った Splitter のように分かち書きの結果からだけでなく、
一応、品詞を見て、単語を拾っています(活用形のある単語は原型を登録)。
また、未知語に関しても、アルファベットの未知語は、茶筌を単純に使って
いるものよりも、拾ってくれると思います(これは、MeCab の未知語処理の
おかげ)。品詞はベタの文字でやっているので、効率が悪いですが、
まあ、仕様をちゃんと決めるまでは、この方が楽(笑)
ソースを見ると、妙な改行をつないだりと何してるんだというところが
あります。まあ、もう少しきれいにやれというところですが、
MeCab の場合は、「。」と改行を、文の末尾としてとらえるので
たとえば、こういうメールをそのまま食わせると、文が途中でぶった切られた
形になってしまうので、正確な形態素解析ができません。
当然、本来は取れるはずの漏れもでてしまいます。
これに加えて、MeCab はデフォルトでは 8192 バイトまでの文章しか
解析してくれません。これは仕様です(Chasen も前はそうだった)。
そういうのは周辺の処理がやるべきものというスタンスだからです。
だから、MeCab を使った Splitter を作る場合には、8192 バイト未満
の文字にあらかじめ切ってから渡すか、あるいは、バッファのサイズを
引数で指定して拡張してあげないとなりません。理想的には、
一文ずつ、句点で終わる文字列を与えてやるのがいいと思います。
(ちゃんとラッパーつくりゃいいんですね)
なんていうこともあるので、MeCab を使いたい人には、多少でも
参考になるかなと。まあ、ソースはぐちゃぐちゃでコメントもないので
気分が悪くなるだけかもしれない(^^;; 肝心なことは、今説明して
しまったし(笑)
ついでなのでしつこく(^^;;、 茶筌だったら(MeCab も本来は同じですが)、
半角の英数字を全角の英数字に変換してから渡さなければ正確な
形態素解析はしてくれません。
たとえば、「2004年1月18日」と「2004年1月18日」で解析結果が
微妙に違うとか、細かく見ていくと、けっこういろいろな問題が見えて
きます。
だから、全角半角なんかも、けっこう気をつけて扱ってやると、精度が
変わってきたりします。ipadic は、IBMは辞書に登録されているけれど、
Microsoft (全角)も Microsoft (半角) も登録されていないとかあるの
で、
MeCab の場合、英数字は全部半角にまとめてしまうとよかったりします
(まだやってない)。そうすると未知語に落ちて、まとめてひとくくりにして
くれるので、「xxxx」「年」「xx」「月」みたいな検索もちゃんとひっかかってくれ
るんです。
「2 | 0 | 0 | 4 | 年」とやられてしまった場合、それぞれ1文字になり
1文字はインデックスに登録しないとかやると、もう、検索の対象にならなくなって
しまいます。これが、MeCab を使えば、「2004 | 年」となるので、検索対象になり
ます。
これは ejSplitter でも OK なところですが。単純に同じ分類の文字列をまとめてし
まう
というのは、意外な強さもあるわけ。
また、たとえば、そういう意味のある数字ではなくて、単に数字が延々と
並んでいるようなものをどういう基準で削除するか、これはもう、マジックナンバー
で
主観的に、このあたりできっちゃえとかやってしまうのでありました。