Twitterのつぶやき内容からコンテンツマッチする 正規表現ver.
現在Twitterのつぶやき内容から判断して、
本とマッチングさせるYomiowatterを開発中ですが、
その中で使っているコンテンツマッチ部分のコードをさらします。
コメントにあるように、複数の条件を優先順位をつけて
判定しています。
本当は、形態素解析でちゃんとコンテンツマッチ
したいところですが、これでもかなりの割合で
本とマッチングすることができています。
本とマッチングさせる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;
}
本当は、形態素解析でちゃんとコンテンツマッチ
したいところですが、これでもかなりの割合で
本とマッチングすることができています。