2006年11月13日

なんとなくPlaggerドリブンで日本語の文章の中から特徴的な文節を抽出するモジュールを書きました。
具体的にはGetSenというWebサービスをCPANモジュールで使いたかったという感じです。
CPANに上げてあります。
Lingua::JA::Summarize::Extract

簡単な使い方は

use strict;
use warnings;
use utf8;

use Lingua::JA::Summarize::Extract;

my $extracter = Lingua::JA::Summarize::Extract-&gr;new;
my $text = "日本語の文章を沢山書きます";
my $result = $extracter-&gr;extract($text);
my $summary = $result-&gr;as_string;
utf8::encode($summary);
print $summary;#サマリーが出てくる。

このような感じです。

実際の抽出例は

Shibuya.pm Tech Talks #7で話して来た

Shibuya.pm Tech Talks #7でお話しして来ました。
皆様おつかれさまです。

自分は自然文書から住所抽出してくれるGeography::AddressExtract::Japanというモジュールを作った時の話をして来ました。
他の方々は成果物の発表系だったのに対し、自分はモジュール作成の過程の話をしました。ここでもピントずらすの全開です。
住所抽出をするにあたり、とっかかりをどうしたか、実装方法をどうするか、具体的になにしたか、といった流れです。

開場で100名オーバ、インターネット中継で200接続程合ったらしくYAPC::Asia 2006 Tokyoと規模変わらんと思った。
なんかしらんけど画面が切れてるのを直してるので時間を潰したのが痛かった。
後半がほぼカットです。

話し終わって椅子に座ろうとした所で Dan the Encode.pm Maker さんから、自分の作ったRegexp::*つかってみなよ?と提案をうけました。Danさんのはメタ文字があると有利だという事です。

発表資料(ディレクターズカット版)
Geography::AddressExtract::Japanのtrac
svnは

svn co http://svn.yappo.jp/repos/public/Geography-AddressExtract-Japan/trunk/

クオリティを高めて実用的なのにしていきたいと思っているのでアイディアとかパッチとか大歓迎です。
ねこ大好き。

という文章が
Shibuya.pm Tech Talks #7で話して来た
Shibuya.pm Tech Talks #7でお話しして来ました。
自分は自然文書から住所抽出してくれるGeography::AddressExtract::Japanというモジュールを作った時の話をして来ました。
Geography::AddressExtract::Japanのtrac
svn co http://svn.yappo.jp/repos/public/Geography-AddressExtract-Japan/trunk
として抽出されます。
他の方々のエントリで試しましたが、なかなかいい感じに要約してくれてました。

デフォルトはN-gramっぽく文を切り分けていき、「。」や改行で文章を分割し、分割した文章にスコアを付けて特徴的な文章を計算します。
スコアの計算方法等はGetSenでも利用しているTerm::Extractを参考にしました。

単語の切り分けやスコアリングや文章の分割方法はいつも通りプラグイン形式で変更出来ます。

my $summary = Lingua::JA::Summarize::Extract->extract($text, { plugins => [ 'Parser::Trim' ] });
これは、N-gramをやめて、文字種別に単語を切り分ける方法に変更します。

文章の切り分けかたを独自に作ると、様々なフォーマットのテキストに対して特徴分の取得ができます。
例えば

package Lingua::JA::Summarize::Extract::Plugin::Sentence::2ch;

use strict;
use base qw( Lingua::JA::Summarize::Extract::Plugin );

sub sentence {
my $self = shift;
my $text = $self-&gr;text;

my $i = 1;
my @sentence = map {
my @dat = split /<&gr;/, $_;
{ line =&gr; $i++, text =&gr; $dat[3], name =&gr; $dat[0], mail =&gr; $dat[1], date =&gr; $dat[2] }
} split /\n/, $text;
\@sentence;
}

1;

というプラグインを書けば、2chのDATの1レスを単位として文章の分割を行い、そのスレッドの特徴的なレスの抽出が可能です。
それに併せてLingua::JA::Summarize::Extract::Parser::2chのようなパーサも書いてレスの本文のみを抽出してから、特徴語を出す必要はありますが。。。

ざっくりとした概要作成には使えるとおもいます。

Posted by Yappo at 2006年11月13日 15:19 | TrackBack | Perl
Comments

初めまして。試しに使ってみました。
長い文章だと要約(?)してくれるようです。
ただ、このライブラリでは文字数を指定して要約はできないのでしょうか?
例えば、50文字、100文字などの文章を20文字未満に要約する、って事です。

$result->length(20);

だと、cutするだけのようで、困ってます・・・

Posted by: KEY at 2007年03月10日 10:14

Lingua::JA::Summarize::Extract-&gr;new;
の「-&gr;new;」ってなにかしらん?
文字化け?

Posted by: (´・(ェ)・`) at 2007年07月14日 14:40
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。