mecabで名詞を数える

トレンドとなっている語を探したくて、mecabを使って名詞を数えるスクリプトを書いた。

単に名詞だけを数えると、「山田太郎」を「山田」と「太郎」を別々に数えてしまう。

mecabに「山田太郎」で辞書登録すれば一語にできるがそれもめんどくさい。

そこで、「姓と名が連続して登場したらひとつの名詞とみなす」という風にしたのだが、どうもスッキリ書けず、下記のようになってしまった。

一応これで用は足せているのだが、もっと簡単にかけないかなあ・・・



foreach (@array){
    for (my $n = $m->parseToNode ($_); $n ; $n = $n->{next}) {
        my $surf=decode('utf8',$n->{surface});
        my $feature=decode('utf8',$n->{feature});
        my @features = split(/,/, $feature);

        if($features[0]=~ /名詞/) {
            if($features[3] eq "名"){
                if($saveword){ $surf = $saveword.$surf };
                    &check_word_hash($surf,\%hash);
                    $saveword = undef;
                }elsif($features[3] eq "姓") {
                    if($saveword){
                        &check_word_hash($saveword,\%hash);
                    }
                    $saveword = $surf;
                }else{
                    &check_word_hash($surf,\%hash);
                }
         }elsif($saveword){
             &check_word_hash($saveword,\%hash);
             $saveword = undef;
         }else{
             if($saveword){
                 &check_word_hash($saveword,\%hash);
                 $saveword = undef;
             }
         }
     }
}