Subscribed unsubscribe Subscribe Subscribe

MacにてText::MeCabを使う

インストールは色々方法がありそうだけどMacPortsでできるみたいなのでそれを使う。

$ port search mecab
mecab @0.96 (textproc, japanese)
    MeCab is a yet another part-of-speech and morphological analyzer.

mecab-ipadic-eucjp @2.7.0-20070610 (textproc, japanese)
    Alternate dictionary for MeCab (ipadic/euc-jp)

mecab-ipadic-sjis @2.7.0-20070610 (textproc, japanese)
    Alternate dictionary for MeCab (ipadic/shift_jis)

mecab-ipadic-utf8 @2.7.0-20070610 (textproc, japanese)
    Alternate dictionary for MeCab (ipadic/utf8)

mecab-jumandic-eucjp @5.1-20070304 (textproc, japanese)
    Alternate dictionary for MeCab (jumandic/euc-jp)

mecab-jumandic-sjis @5.1-20070304 (textproc, japanese)
    Alternate dictionary for MeCab (jumandic/shift_jis)

mecab-jumandic-utf8 @5.1-20070304 (textproc, japanese)
    Alternate dictionary for MeCab (jumandic/utf8)

p5-mecab @0.96 (perl, textproc, japanese)
    a Perl module for MeCab

py-mecab @0.96 (python, textproc, japanese)
    a Python module for MeCab

py25-mecab @0.96 (python, textproc, japanese)
    a Python module for MeCab

rb-mecab @0.96 (ruby, textproc, japanese)
    a Ruby module for MeCab

Found 11 ports.
$ sudo port install p5-mecab

perl用のがあるようなのでp5-mecabとやらを入れてみた。


コマンド実行してみると文字化けする。どうやら標準の文字コードeuc-jpか何かになっているようだ。

$ sudo port install mecab-ipadic-utf8
$ sudo vi /opt/local/etc/mecabrc        # 編集してdicdirを変更
$ cat /opt/local/etc/mecabrc
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
# dicdir =  /opt/local/lib/mecab/dic/ipadic
dicdir =  /opt/local/lib/mecab/dic/ipadic-utf8

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

これで普通に使えるようになったっぽい。

$ mecab
盗んだバイクで走り出す行く先も解らぬまま
盗ん    動詞,自立,*,*,五段・マ行,連用タ接続,盗む,ヌスン,ヌスン
だ      助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ
バイク  名詞,一般,*,*,*,*,バイク,バイク,バイク
で      助詞,格助詞,一般,*,*,*,で,デ,デ
走り出す        動詞,自立,*,*,五段・サ行,基本形,走り出す,ハシリダス,ハシリダス
行く先  名詞,副詞可能,*,*,*,*,行く先,ユクサキ,ユクサキ
も      助詞,係助詞,*,*,*,*,も,モ,モ
解ら    動詞,自立,*,*,五段・ラ行,未然形,解る,ワカラ,ワカラ
ぬ      助動詞,*,*,*,特殊・ヌ,基本形,ぬ,ヌ,ヌ
まま    名詞,非自立,副詞可能,*,*,*,まま,ママ,ママ


Perlで使うためにText::MeCabというモジュールがあるらしい。

$ which mecab-config
/opt/local/bin/mecab-config                                              # これをインストール時に使用する
$ sudo cpan -i Text::MeCab
...
Path to mecab config? [/usr/bin/mecab-config]                            # which mecab-configの結果をコピペ
Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [utf-8]    # utf-8 で
...

でも何かテストで失敗してうまくインストールできない ><


強制インストールする。あんまりよくないかな…。

$ sudo cpan -fi Text::MeCab


で、書いてみる。

$ perl -MText::MeCab -le'$n=Text::MeCab->new->parse(pop);do{print$n->surface}while($n=$n->next)' "盗んだバイクで走り出す行く先も解らぬまま"      
zsh: segmentation fault  perl -MText::MeCab  

んん??

$ perl -MText::MeCab -le'$n=($m=Text::MeCab->new)->parse(pop);do{print$n->surface}while($n=$n->next)' " 盗んだバイクで走り出す行く先も解らぬまま"
盗ん
だ
バイク
で
走り出す
行く先
も
解ら
ぬ
まま

newからそのまま繋いでparseするとsegmentation faultになっちゃうの??なんでだ…?


普通に書くとこうか?

#!/opt/local/bin/perl
use strict;
use warnings;

use Text::MeCab;

my $mecab = Text::MeCab->new();
my $n = $mecab->parse($ARGV[0]);

do {
    print $n->surface, "\n";
} while ($n = $n->next);


実行。

./mecab.pl '盗んだバイクで走り出す行く先も解らぬまま'
盗ん
だ
バイク
で
走り出す
行く先
も
解ら
ぬ
まま

おkっぽい。