Twitterのつぶやき内容からコンテンツマッチする 正規表現ver.

現在Twitterのつぶやき内容から判断して、
本とマッチングさせるYomiowatterを開発中ですが、
その中で使っているコンテンツマッチ部分のコードをさらします。

コメントにあるように、複数の条件を優先順位をつけて
判定しています。

sub match {
    my ($self, $text) = @_;
    my $result  = {};
    my $matched = 0;

    # exact match
    # URLが存在する and ASINを含む
    if($text =~ m|(http://[\d\w\/\.]*)| ){
        my $url = $1;

        # short urlを元に戻す
        if($url =~ m|(http://bit\.ly/([\d\w]*))| ){
            $url = $self->bitly()->expand($1, $2);
        }

        # ASINが含まれたURLである
        if($url =~ /asin=([\d\w]*)/i ||
           $url =~ m|http://www.amazon.co.jp/gp/product/images/([\d\w]*)| ||
           $url =~ m|http://www.amazon.co.jp/gp/product/([\d\w]*)| ||
           $url =~ m|http://www.amazon.co.jp/dp/([\d\w]*)|){

            my $item = $self->amazon()->lookupItem($1);
            if($item){
                $result->{score} = "exact";
                $result->{item}  = $item;
            }
        }
    }
    # maybe match
    # 「」『』【】[]で囲まれた文字列がある
    if(!defined $result->{score}){
        if(($text =~ /「(.*?)」/ ||
            $text =~ /『(.*?)』/ ||
            $text =~ /【(.*?)】/ ||
            $text =~ /\[(.*?)\]/
           )){
            #warn "probably word is ".$1;
            my $found = $self->amazon()->searchItemByTitle($1);
            if($found){
                $result->{score} = "probably";
                $result->{item}  = $found;
            }
        }
        # 読了の前にある文字列を本のタイトルと大胆予想
        elsif($text =~ /^(.*?)読了/){
            #warn "maybe word is ".$1;
            my $found = $self->amazon()->searchItemByTitle($1);
            if($found){
                $result->{score} = "maybe";
                $result->{item}  = $found;
            }
        }
        else{
            #warn "no pattern:". $text;
        }
    }
    # nomatch
    if(!defined $result->{score}){
        #warn "nomatch";
        $result->{score} = "nomatch";
    }
    return $result;
} 

本当は、形態素解析でちゃんとコンテンツマッチ
したいところですが、これでもかなりの割合で
本とマッチングすることができています。

人気の投稿