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

ゆーすけべー日記

はてなBlogってどーなの!?

Perlで文章の中にAV女優の名前が含まれているかを判定する

先日紹介した、日本のAV女優一覧を取得するPerlモジュール「 Acme::JapaneseAvActress 」。Danさんに添削されたことはひとまず置いておいて、 これを応用したスクリプトを書いてみました。 文章の中にAV女優の名前が含まれていたら、そのAV女優オブジェクトを返すというものです。 テキストを解析するに当たって woremacx さんが作った「WebService::YahooJP::TextParse」を使わせていただきました。woremacx ++;

例えば「白石ひよりと柚木ティナとおいかわなおはやっぱカワイなぁ」という文章を解析する コードはこんな具合です。

#!/usr/bin/perl

use strict;
use warnings;
use WebService::YahooJP::TextParse;
use Acme::JapaneseAvActress;
use Encode;
use Data::Dumper;

my $text =
"白石ひよりと柚木ティナとおいかわなおはやっぱカワイなぁ";

my $config  = { appid => "" };
my $ma      = WebService::YahooJP::TextParse->new(%$config);
my $actress = Acme::JapaneseAvActress->new(
    {
        'cache_root'      => '/tmp/avactress',
        'default_expires' => '7days',
    }
);
$actress->get;

my $iter  = $ma->analysis($text);
my @temp = ("","");
my @actress;
while ( $iter->hasNext ) {
    my $word = $iter->getNext();
    my $name = $temp[0] . $word->{surface};
    my $yomi = $temp[1] . $word->{reading};
    utf8::encode($name);
    utf8::encode($yomi);
    if ( $actress->name($name) ) {
        push( @actress, $actress->name($name) );
    }
    elsif ( $actress->yomi($yomi) ) {
        push( @actress, $actress->yomi($yomi) );
    }
    $temp[0]  = $word->{surface};
    $temp[1]  = $word->{reading};
}

print Dumper( \@actress );

結果は

yusuke@com:~/work/ero$ perl textparse.pl
$VAR1 = [
          bless( {
                   'name' => '白石ひより',
                   'yomi' => 'しらいし ひより',
                   'initial' => 'し',
                   'year' => '2002'
                 }, 'Acme::JapaneseAvActress::Actress' ),
          bless( {
                   'name' => '柚木ティナ',
                   'yomi' => 'ゆずき てぃな',
                   'initial' => 'ゆ',
                   'year' => '2005'
                 }, 'Acme::JapaneseAvActress::Actress' ),
          bless( {
                   'name' => '及川奈央',
                   'yomi' => 'おいかわ なお',
                   'initial' => 'お',
                   'year' => '2000'
                 }, 'Acme::JapaneseAvActress::Actress' )
        ];

とちゃんと返ってきます。 ちょっと、ひらがなの場合だとテキスト解析の方が細かく区切りすぎちゃって、 正しく抽出できないところがあるのは勘弁。 ついでにこのコードを流量して、 Webで試せるサイトも作りました。子供の名前をつけるときにAV女優の名前とかぶらないようにしたい場合とかに使ってください。

ところで、このコードは俺が本当に作りたいサービスの布石でしかない。