最近の特徴語抽出の手法ってどんなんかなと思って、はてなの注目のエントリーを見てみました。
タグ「特徴語抽出」を含む注目エントリー
面白いものが目白押しです。
特にGigazinizeというのは、秀逸です。面白いなぁ〜。
http://blog.fulltext-search.biz/articles/2007/09/03/gigazinize
Gigazinize のなかみ
私も何か作ってみたくなりました。書籍データやらWikipediaやらのデータは色々あるので、そのあたりを組み合わせてみようかと思います。その前に特徴語を抽出する為のツールです。(だいぶ昔に作ったものですが。)ロジックは、たつをさんが紹介している下記の方法です。
形態素解析と検索APIとTF-IDFでキーワード抽出
形態素解析とYahoo APIを使って特徴語を抽出する方法です。さっくりと作れて、それなりに使えます。ただ、つどWeb検索に行っているのでそれなりに遅いです。要は文章の母集団があればよいので、Yahoo APIの部分をWikiPediaから作ったコーパス等に置き換えたらかなり早くなると思います。
下はYahoo APIを使った場合のサンプルです。
use LWP::Simple;
use MeCab;
my $file = shift @ARGV;
my $population = 19200000000;
my $hit;
my $content;
my @feature;
my %result;
$content = readFile($file);
@feature = &parseText($content);
%result = countFeature(@feature);
foreach $key (keys %result) {
$hit = &get_num($key);
$tfidf = calcTFIDF($result{$key},$hit,$population);
print "key=$key,hit=$hit,tfidf=$tfidf\n";
}
sub parseText {
my $content = shift @_;
my $m = new MeCab::Tagger ("-Ochasen");
my @feature = ();
for (my $n = $m->parseToNode ($content); $n; $n = $n->{next}) {
if ($n->{feature} =~ /名詞/) {
push @feature,$n->{surface};
}
}
return @feature;
}
sub countFeature {
my @feature = sort(@_);
my $str="";
my $prev="";
my $cnt=0;
my %feature;
foreach $str (@feature) {
if ( defined $feature{$str} ) {
$feature{$str}++;
} else {
$feature{$str}=1;
}
}
return %feature;
}
sub readFile {
my $file = shift @_;
open FH, "<$file";
my $content = join '', <FH>;
close FH;
return $content;
}
sub get_num {
my ($key) = @_;
$key =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
my $url = "http://api.search.yahoo.com/WebSearchService/V1/".
"webSearch?appid=YahooDemo&query=$key&results=1";
my $c;
($c = get($url)) or die "Can't get $url\n";
my ($num) = ($c =~ /totalResultsAvailable="(\d+)"/);
return $num;
}
sub calcTFIDF {
my $tf = shift @_;
my $df = shift @_;
my $n = shift @_;
my $tfidf;
eval {
$tfidf = $tf*log($n/$df);
};
return $tfidf;
}
次は、コーパス部分を変更したいと思います。
Yahoo APIからWikipedia