Yahooのキーフレーズ抽出APIを試す
Yahoo!デベロッパーネットワークでキーフレーズ抽出APIが公開されていたので、ちょろっと試してみました。
ただコマンドラインから文章受け取って、APIにリクエスト送るだけのスクリプト。
#!/usr/bin/perl # # Yahooのキーフレーズ抽出APIを試す # use strict; use warnings; use Encode qw(encode); use URI; use URI::QueryParam; use LWP::Simple; use XML::Simple; use constant { API_URL => 'http://jlp.yahooapis.jp/KeyphraseService/V1/extract', }; my $sentence = shift @ARGV; if (!$sentence) { print "Usage: $0 sentence\n"; exit(1); } my $url = URI->new(API_URL); my %param = ( appid => '...', sentence => $sentence, output => 'xml', ); $url->query_form_hash(%param); my $xml = LWP::Simple::get($url) or die 'cannot get output'; my $parser = XML::Simple->new; my $dom = $parser->XMLin($xml); die 'no Keyphrase' if !$dom->{Result}; my @results = ref $dom->{Result} eq 'ARRAY' ? @{ $dom->{Result} } : ( $dom->{Result} ); foreach my $result (@results) { printf "%s\t%s\n", encode('utf-8', $result->{Keyphrase}), $result->{Score}; }
実際にリクエストを投げてみる。
% ./keyphrase.pl 今日はいい天気です いい天気 100 今日 48 % ./keyphrase.pl 昨日は東京ミッドタウンに行ってきました 東京ミッドタウン 100 昨日 31 % ./keyphrase.pl 来週の日曜日は楽しい運動会です 楽しい運動会 100 日曜日 74 来週 59
チョロッと試して限りだと、
- 名詞列を連結して一つのキーワードにしている
- 名詞の前に形容詞がある場合はくっつける
- 1番ポイントの高いキーワードを100ポイントにして、それ以外のキーワードは1番のワードのポイントとの比率で補正
といった感じ?ポイントはTFIDFのようなもので付けてるのかな。
前にTFIDFでwikipediaの特徴量を抽出なんてことをやったけど、このAPIを使えばIDF用にあらかじめワードをカウントしておく必要もないので、かなり便利になりそう。
でも形容詞をくっつけてしまうのはちょっと微妙な気がする。上の例だと「楽しい運動会」で一つのキーワードとして抽出されているけど、「明日は運動会です」のように形容詞が前にない文では「運動会」のみで抽出されるため、2つの文章が似ていることをキーワードのベクトルでは判断できない。形容詞は付けないか、オプションで付ける/付けないを切り替えられるようになればいいのに。