要旨
CaboCha やなんかの出力形式であるところの京大テキストコーパス形式のパーサモジュールを Perl で書いたので紹介します。
これを使うと例えば CaboCha の出力した係り受け関係を Perl のオブジェクトグラフとして取得できます。
使用例
単なる文節区切りの例。
#!/usr/bin/env perl
use v5.18;
use utf8;
use IPC::Open3;
use Parse::KyotoUniversityTextCorpus;
use Parse::KyotoUniversityTextCorpus::MorphemeParser::MeCab;
use Symbol qw//;
my ($in, $out, $err);
my $pid;
BEGIN {
($in, $out, $err) = (Symbol::gensym, Symbol::gensym, Symbol::gensym);
$pid = open3($in, $out, $err, cabocha => '-f1');
}
END {
close $out;
close $err;
waitpid $pid => 0 if defined $pid;
}
binmode STDOUT, ':encoding(utf8)';
binmode $in, ':encoding(utf8)';
binmode $out, ':encoding(utf8)';
my $parser = Parse::KyotoUniversityTextCorpus->new(
morpheme_parser =>
Parse::KyotoUniversityTextCorpus::MorphemeParser::MeCab->new,
);
say $in '星から出るのに、その子は渡り鳥を使ったんだと思う。';
say $in '出る日の朝、自分の星の片付けをした。';
close $in;
my $sentence_trees = $parser->parse(fh => $out);
for my $sentence_tree (@$sentence_trees) {
for my $chunk (@{ $sentence_tree->as_arrayref }) {
printf(
"\%d: \%s -> \%d\n",
$chunk->id,
$chunk->surface,
$chunk->is_root ? '-1' : $chunk->dependency->id,
);
}
print "\n";
}
実行すると:
0: 星から -> 1
1: 出るのに、 -> 5
2: その -> 3
3: 子は -> 5
4: 渡り鳥を -> 5
5: 使ったんだと -> 6
6: 思う。 -> -1
0: 出る -> 1
1: 日の -> 2
2: 朝、 -> 6
3: 自分の -> 4
4: 星の -> 5
5: 片付けを -> 6
6: した。 -> -1
立志
日本語係り受け解析器 CaboCha1 は大変便利ですごく便利ですが (便利なので2回言いました) 公式の Perl バインディングは SWIG 製で API 的にあんまり良い感じじゃないし CPAN にも上がっていないのが悲しい点です。MeCab に対する Text::MeCab のような素敵なバインディングも今のところありません。
簡単に使って幸せになるには cabocha コマンドをパイプで繋いで出力をパースするのが手っ取り早いです。CaboCha の出力形式には人間用のツリー形式の他に京都大学テキストコーパス (以下 KC)2/XML/CoNLL の各形式があります。 この中でパースし易いのは XML 形式ですが、これは CaboCha の独自形式 (だと思う) なので対応してもあまり面白くありません。KC 形式と CoNLL 形式は他のツールでも使われています。例えば日本語の構文解析器として CaboCha の他に KNP3 や J.DepP4 が知られていて、これらも KC 形式で出力ができるので必要になったら CaboCha から切り替えて使えます。多分これを処理する車輪は知の高速道路の路肩に一杯転がっているはずなんですが、見つからなくて辛いので自分で書くことにしました。
導入
Tarball を cpanm で突っこむのが早いです:
cpanm http://sekia.github.io/Parse-KyotoUniversityTextCorpus-0.01.tar.gz
リポジトリから最新版を入れる場合は Dist::Zilla (dzil) でビルドする必要があります:
git clone git@github.com/sekia/Parse-KyotoUniversityTextCorpus.git
cd Parse-KyotoUniversityTextCorpus
dzil install
そのうち CPAN に上げるので気の長い人はそれまで待っててください。
使い方
だいたい perldoc 参照ですが Parse::KyotoUniversityTextCorpus
を new
して parse
したら係り受け関係の木構造の根 (即ち最後の文節) に相当する Parse::KyotoUniversityTextCorpus::Chunk
を含んだ配列リファレンスが返ってくるので、ここからトラバースするのが基本的な使い方です。
上のコード例のように as_arrayref
を呼ぶと文節が順番に並んだ配列リファレンスが返ってくるので単に文節を分割したいだけの時なんかは便利です。
MorphemeParser について
KC の文節中の形態素の出力形式は形態素解析器 JUMAN のものですが、CaboCha は内部で MeCab を使っているので当然 MeCab の形式になります。また MeCab は出力形式や辞書が設定で変更できるので、KC 形式でも形態素の出力形式は様々あることになります。
なので Parse::KyotoUniversityTextCorpus
では形態素のパースはせず、一行一形態素とみなして MorphemeParser というオブジェクトに丸投げするようになっています。
ディストリビューションに含まれている MorphemeParser は Parse::KyotoUniversityTextCorpus::MorphemeParser::MeCab
で、これは IPA 辞書を使った MeCab が出力するデフォルトの出力をパースできます。JUMAN とか ChaSen とか Unidic を使った MeCab とかの形式がパースしたい人は頑張って自分で書いてください。
TODO
- Chunk にもっとメソッドを生やす
- JUMAN の MorphemeParser も追加する
- CPAN にアップロード
コメント
コメントを投稿