時間が空いたので、Lingua::JA::Summarizeも試してみました。0.07をCPAN経由でインストールしようとすると、途中でエラーが出ました。Class::Accessor::FastとClass::ErrorHandlerに依存するようなので、予めインストールしておきましょう。で、テストがどうしても通らないのですが、force installでとりあえず問題なしのようです。
以下、サンプルコード。CPANのサンプルに、utf8で使うために数行追加しているだけです。
#!/usr/bin/perl # Functional style use Lingua::JA::Summarize qw(:all); # OO style $s = Lingua::JA::Summarize->new({ charset => 'utf8', mecab_charset => 'utf8', }) ; $s->analyze_file('news.txt'); @keywords = $s->keywords({ minwords => 3, maxwords => 5 }); print join(' ', @keywords) . "\n";
連続している名詞の評価がポイントということで、どう処理しているのかを見てみました。
if ($H =~ /^名詞/) { if ($H =~ /(非自立|代名詞)/) { $add_longword->(); next; } elsif (! $longword->{text} && $H =~ /接尾/) { # ng next; } }
まぁ、これしかないですね。これだと「まつのはこんぶ」などの言葉だと検出出来ないですね。まぁ、どうしろと言われたら、ちょっと困りますが。。。
$ mecab まつのはこんぶ まつの 名詞,固有名詞,人名,名,*,*,まつの,マツノ,マツノ は 助詞,係助詞,*,*,*,*,は,ハ,ワ こんぶ 名詞,一般,*,*,*,*,こんぶ,コンブ,コンブ
ウェイトの計算は、ここで解説しているようにMecabのコストを使っているようです。なるほどなぁと思いました。
sub _calc_weight { my $self = shift; foreach my $word (keys(%{$self->{stats}})) { my $target = $self->{stats}->{$word}; my $cost = $target->{cost}; $cost = $self->default_cost * DEFAULT_COST_FACTOR unless $cost; $target->{weight} = ($target->{count} - 0.5) * $cost / $self->{wordcount} / 6; if (length($word) == 1) { $target->{weight} *= $self->singlechar_factor; } } }
シンプルなソースで、非常に勉強になります。