プログラマでありたい

おっさんになっても、プログラマでありつづけたい

キーワード抽出モジュール Lingua::JA::Summarize

 時間が空いたので、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;
        }
    }
}

シンプルなソースで、非常に勉強になります。