読者です 読者をやめる 読者になる 読者になる

のんびり読書日記

日々の記録をつらつらと

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つの文章が似ていることをキーワードのベクトルでは判断できない。形容詞は付けないか、オプションで付ける/付けないを切り替えられるようになればいいのに。