http://chasen.org/~taku/blog/archives/2006/05/textmecab.html
で指摘されたように、こんな感じのコードを書くとText::MeCabが困ってしまう。
use strict;
use Text::MeCab;
my $mecab = Text::MeCab->new;
my $node_A = $mecab->parse($TEXT_A);
my $node_B = $mecab->parse($TEXT_B);for(; $node_A; $node_A = $node_A->next) {
print $node_A->surface;
}
これだと$TEXT_Bの形態素解析が出てくる。ほげぇ。で、思うんだがこれって要は無理矢理OOしてるからじゃねぇの?と。
本当はsemantics的にはこんなんじゃないか?
use strict;
use Text::MeCab;my $mecab = Text::MeCab->new;
$mecab->parse($TEXT_A);
my $node_A = $mecab->node_instance();
なんかparse()がnodeを返してくると全てのnodeが独自に動かせるような印象を与えられるけど、実際はMeCab::Taggerに対してのインスタンスなんだからちょっと違うよね。OOにしたかったらMeCab側でnodeをclone()するとか、そういう仕組みがあるととても楽なんだけど・・・。ちなみにこんな感じで手動でclone()するのはやってみたけど、segfaultだらけでお話にならなかった:
node = mecab_sparse_tonode(mecab, input);
Newz(1234, tmp, 1, mecab_node_t);
Copy(node, tmp, 1, mecab_node_t);
というわけで悩み中。とりあえずコンパイル問題等を修正した0.02_01を先ほどCPANにアップしておきました!