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

さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

表記のゆれを確認するスクリプト

前回の記事で考えた校正用のスクリプトをちょっと書いてみます。
辞書ファイルを用意するのが面倒だったので、ひとまずは表記ゆれのチェックのみです。

#!/usr/bin/env perl
use 5.12.3;
use warnings;
use utf8;
use open IO => qw/:utf8 :std/;
use URI;
use LWP::UserAgent;
use XML::XPath;

my $sentence = << 'EOF';
<おすすめグルメ>
パスタハウス「ジャスト」

美味しいイタリア料理のお店。オススメは、キノコのパスタ。和風のバター醤油が、麺になじんでおいしい。
EOF

my $uri = URI->new('http://jlp.yahooapis.jp/DAService/V1/parse');
$uri->query_form(
  appid     => 'Please set your app id',
  sentence  => $sentence,
  response  => 'surface,reading,pos,baseform,feature',
);
say $uri;

my $ua = LWP::UserAgent->new;
my $response = $ua->get($uri);
my $xp = XML::XPath->new(xml => $response->decoded_content);

for my $node ($xp->findnodes('//Morphem')) {
  my @nodelist = grep {$node->find('POS')->string_value eq $_->find('POS')->string_value} $xp->findnodes('//Morphem');
  my @selectnodes = grep {$node->find('Reading')->string_value eq $_->find('Reading')->string_value} @nodelist;
  my @kaburinashi = grep {$node->find('Baseform')->string_value ne $_->find('Baseform')->string_value} @selectnodes;

  if (@kaburinashi) {
    my @list;
    for my $child (@kaburinashi) {
      push @list, $child->find('Baseform')->string_value unless $child->find('Baseform')->string_value ~~ @list;
    }

    unshift @list, $node->find('Baseform')->string_value;

    my $child_element = XML::XPath::Node::Element->new('hyouki_yure');
    my $new_xml_text = XML::XPath::Node::Text->new('[表記ゆれ:' . join(', ', @list) . ']');
    $child_element->appendChild($new_xml_text);
    $node->appendChild($child_element);
  }
}

my $text;
for my $node ($xp->findnodes('//Morphem')) {
  $text .= $node->find('Surface');
  $text .= $node->find('hyouki_yure') if $node->find('hyouki_yure');
}
say $text;

結果はこんな感じで表示されます。

<おすすめ[表記ゆれ:おすすめ, オススメ]グルメ>
パスタハウス「ジャスト」

美味しい[表記ゆれ:美味し, おいし]イタリア料理のお店。オススメ[表記ゆれ:オススメ, おすすめ]は、キノコのパスタ。和風のバター醤油が、麺になじんでおいしい[表記ゆれ:おいし, 美味し]。

表記ゆれをピックアップして[表記ゆれ:□□□□◆, □□□□■]内で指摘してくれます。ただし、さすがに同じ品詞の同音異義語までは今のところチェックできません。

また、日本語係り受け解析APIは1リクエストの最大サイズが4KBと、かなり厳しい制限が設けられています。まあ、一日5万リクエストまでは受け付けてくれるみたいなので、改行単位でsplitして、段落単位でXMLを取得し、ひとつのXMLとして混ぜ込んでいけばいいのかもしれません。

文章が長いと重くなるとか、grepを3回も行う必要があるのかとか微妙なところは山ほどありますが、とりあえず動いてくれているのでOKとしましょう。

ここまでできれば、モジュール化も何とかなりそうです。そのうち、自分用の表記チェック用のWebツールでも作ってみようと思います。