YahooAPI:ルビ振り
概要
Yahoo デベロッパーネットワークで、ルビ振りの API が公開されています。
詳細は下記をどうぞ。
http://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html
これを使用することにより、漢字にルビを振ることが簡単にできます。
なお、この API を使用するためにはアプリケーション ID が必要となります。
アプリケーション ID については、下記をどうぞ。
http://help.yahoo.co.jp/help/jp/developer/developer-06.html
使用例
以下、簡単な使用例です。
use strict;
use LWP::Simple;
use XML::Simple;
use Encode;
my $appid = '********'; # アプリケーション ID を入手する必要があります
my $y_url = 'http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=%s&grade=%d&sentence=%s';
while (<>) {
chomp;
unless ($_) {
print "\n";
next;
}
# 1行ずつ Yahoo API でルビを取得
my $line = '';
my $word = ruby($_);
# 取得結果を使ってルビ表示を作成
for my $w (@$word) {
# 空白:この仕様は微妙
if ( ref $w->{Surface} eq 'HASH' ) {
$line .= ' ';
next;
}
# かな混じり
if ($w->{SubWordList}) {
for my $s (@{$w->{SubWordList}->{SubWord}}) {
$line .= $s->{Surface} eq $s->{Furigana} ? $s->{Surface} : $s->{Surface} . '(' . $s->{Furigana} . ')';
}
next;
}
# 無変換
unless ($w->{Furigana}) {
$line .= $w->{Surface};
}
# 通常変換
else {
$line .= $w->{Surface} . '(' . $w->{Furigana} . ')';
}
}
print Encode::encode('utf8', $line), "\n";
}
sub ruby {
my $line = shift;
# ルビ振り対象文字列はエンコードする
$line =~ s/([^ 0-9A-Za-z])/sprintf("%%%.2X", ord($1))/eg;
$line =~ tr/ /+/;
# グレード指定 1 ~ 8
my $grade = 1;
# Yahoo API 呼び出し
my $url = sprintf($y_url, $appid, $grade, $line);
my $response = get($url);
return undef unless $response;
# 結果は XML で返ってくる
my $xmlsimple = XML::Simple->new(ForceArray => [ 'Word' ]);
my $xml = $xmlsimple->XMLin($response);
return $xml->{Result} ? $xml->{Result}->{WordList}->{Word} : undef;
}
ルビ振りツール
簡単なものを作ってみました(/_\;)
ルビ振りツール