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

ライブラリとして使うならChaSenよりMeCabのほうがよさそう

ChaSenグローバル変数でごちゃごちゃやってるからマルチスレッド環境で使いにくそう。インターフェイスもスクリプト言語向けっぽい。
ライブラリとしてはMeCabのほうが使いやすそう。

ということでMeCabを試した。

use MeCab;
use strict;

my $text = <<__EOT
昼飯のスパゲティナポリタンを眺めながら、積年の疑問を考えていた。
それは「なぜナポリタンは赤いのだろうか」という問いである。
簡単に見えて、奥の深い問題だ。
「赤いから赤いのだ」などとトートロジーを並べて悦に入る浅薄な人間もいるが、
それは思考停止に他ならず、知性の敗北以外なにものでもない。
「赤方偏移」という現象がある。
宇宙空間において、地球から高速に遠ざかる天体ほどドップラー効果により、
そのスペクトル線が赤色の方に遷移するという現象である。
つまり、本来のナポリタンが何色であろうとも、ナポリタンが我々から
高速で遠ざかっているとすれば、毒々しく赤く見えるはずなのだ。
目の前のナポリタンは高速で動いているか否か?
それはナポリタンの反対側に回ってみることでわかる。
運動の逆方向から観察することで、スペクトルは青方遷移し、
青く見えるはずなのだ。
逆に回ってみたところ、ナポリタンは赤かった。
よってこのナポリタンは高速移動をしていないと言える。 
__EOT
	;

my %word = ();
my $mecab = new MeCab::Tagger ("");
my $node = $mecab->parseToNode($text);

for (my $n = $node; $n; $n = $n->{next}) {
	my @feature = split(',', $n->{feature});
	next if ($feature[0] eq '*');
	
	if (($feature[0] eq '名詞' 
			and ($feature[1] ne '数' 
				and $feature[1] ne '代名詞' 
				and $feature[1] ne '非自立'))
		or $feature[0] eq '動詞' and $feature[1] eq '自立'
		or $feature[0] eq '形容詞' and $feature[1] eq '自立') 
	{
		if ($feature[6] ne '*') {
			$word{$feature[6]}++;
		} else {
			$word{$n->{surface}}++;
		}
	}
}
foreach my $key (sort {$word{$b} <=> $word{$a}} keys(%word)) {
	my $n = $mecab->parseToNode($key)->{next};
	my @feature = split(',', $n->{feature});
	my $kana = $feature[7] ne '' ? $feature[7]: $key;
	print "$word{$key} $key ($kana)\n";
}


$ perl mecabtest.pl
7 タン (タン)
7 ナポリ (ナポリ)
5 する (スル)
5 赤い (アカイ)
4 高速 (コウソク)
3 見える (マミエル)
2 スペクトル (スペクトル)
2 現象 (ゲンショウ)
2 青い (アオイ)
2 遷移 (センイ)
2 遠ざかる (トオザカル)
2 回る (マワル)
1 毒々しい (ドクドクシイ)
1 深い (フカイ)
1 悦に入る (エツニイル)
1 運動 (ウンドウ)
1 方 (ホウ)
1 効果 (コウカ)
1 ない (ナイ)
1 疑問 (ギモン)
1 側 (ソバ)
1 色 (イロ)
1 移動 (イドウ)
1 敗北 (ハイボク)
1 浅薄 (センバク)
1 積年 (セキネン)
1 地球 (チキュウ)
1 停止 (テイシ)
1 反対 (ハンタイ)
1 昼飯 (ヒルメシ)
1 前 (ゼン)
1 ドップラー (ドップラー)
1 赤 (アカ)
1 線 (セン)
1 空間 (アキマ)
1 他 (タ)
1 知性 (チセイ)
1 人間 (ニンゲン)
1 考える (カンガエル)
1 目 (メ)
1 逆 (ギャク)
1 動く (ウゴク)
1 否 (イヤ)
1 トートロジー (トートロジー)
1 わかる (ワカル)
1 思考 (シコウ)
1 宇宙 (ウチュウ)
1 奥 (オク)
1 ある (アル)
1 簡単 (カンタン)
1 方偏 (カタヘン)
1 移 (ウツリ)
1 問い (トイ)
1 本来 (ホンライ)
1 赤色 (セキショク)
1 天体 (テンタイ)
1 観察 (カンサツ)
1 方向 (ホウコウ)
1 言える (イエル)
1 いる (イル)
1 スパゲティナポリタン (スパゲティナポリタン)
1 問題 (モンダイ)
1 眺める (ナガメル)
1 なる (ナル)


品詞の判定は、posidを使うのが定石っぽいけど、Windows用のバイナリ版を入れたら定義リスト(pos-id.def ?)がなかったので、文字列でやりました。気持ち悪いけど、どうせPerlだしいいやみたいな。
実行結果は、専門用語やナポリタンが分割されていること意外は、なかなかいい感じじゃないかと思います。固有名詞の判定は辞書次第だろうし。
あと気になるのは辞書の文字コードですが、これは辞書を作り直したらいいようなので今度やってみます。
今後、形態素解析が必要なことがあったら、MeCabを使ってみようと思います。