cygwinにmecab-rubyの導入

mecabの導入は,
http://d.hatena.ne.jp/arupaka-_-arupaka/20140701/1404175285
を参考に.

http://antimon2.hatenablog.jp/entry/2012/07/08/092702を参考に
インストール

wget https://mecab.googlecode.com/files/mecab-ruby-0.996.tar.gz
 tar xvfz mecab-ruby-*tar.gz
cd mecab*ruby*
ruby extconf.rb
make

バージョンにも注意。
で怒られるので(libmecabがリンクしてない)、
ので、以下にしたがって修正する.

http://halpha656.hatenablog.com/entry/2014/05/22/013025を参考に
Makefileを以下のように修正

ldflags = -L. → 末尾に 「-L/usr/local/lib」を追加
LIBS = $(LIBRUBYARG_SHARED) -lstdc++ -ldl -lcrypt →末尾に「-lmecab」を追加

しかしこれでもiconvがないと怒られるので,iconvをcygwinのsetup.exe develop->libiconvをインストール.
これで、

ls /lib | grep iconv
libiconv.a
libiconv.dll.a

を確認して.

さらに,

make

これでも怒られるので,さらに以下のように修正した

ldflags = -L. → 末尾に 「-L/usr/local/lib -L /lib」を追加
LIBS = $(LIBRUBYARG_SHARED) -lstdc++ -ldl -lcrypt →末尾に「-lmecab -liconv」を追加

これでインストールできた
実際

ruby -Kn test.rb

とやれば、

0.98
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
この 連体詞,*,*,*,*,*,この,コノ,コノ
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二 名詞,数,*,*,*,*,二,ニ,ニ
郎 名詞,一般,*,*,*,*,郎,ロウ,ロー
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 動詞,自立,*,*,一段,連用形,見る,ミ,ミ

のようになる.

例)簡単な利用例

mecab.parse コマンドプロンプトどおりにだす
mecab.parseToNode 上記の1行ごとだす(各形態素ごとに表示)

  • >node.feature「,」区切りでてくる

node.next 次の行を取得
node.future.split(",")[6]で カンマで7列目「見る」をだす.
一行目は始点ノードが入っているので注意が必要

# -*- coding: Utf-8 -*-
require 'MeCab'

mecab=MeCab::Tagger.new();
node=mecab.parseToNode("私は犬だ")

puts mecab.parse("私は犬だ")

node=node.next
puts node.feature;

puts node.feature.split(",")[6];

exit();

出力

私      名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
犬      名詞,一般,*,*,*,*,犬,イヌ,イヌ
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS
名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
私

複雑な例

require 'MeCab'


def word_counts(text,mecab)


        parsed=mecab.parseToNode(text)
        word_list=Hash::new()
        word_list.default=0;
        while parsed

                str=parsed.feature.split(",")[6]
        #       puts str
                word_list[str]=word_list[str]+1
        #       puts word_list[str]
                parsed=parsed.next
        end

        word_list.delete("*")

        #word_list.keys.each{|i|

        #       puts i+","+word_list[i].to_s
        #}

        return word_list

end

#input_file=open("siokouji2_kanrenbun3_str.csv")

#input_file=open("nemui_kanrenbun3_str.csv")

#input_file=open("nemui_kanrenbun3_str.csv")

#input_file=open("buumu_kanrenbun3_str.csv")

input_file=open("turai_kanrenbun3_str.csv")
old_date=""
word_date=""

word_date_sum=Hash::new();
c=MeCab::Tagger.new();

parsed=c.parse("私は犬だ")

puts parsed;
k=0

parsed=c.parseToNode("私と私は犬だ")
while parsed

        puts parsed.feature
        parsed=parsed.next
        k=k+1;
end

parsed=c.parseToNode("私と私と私は犬だ")
word_list=Hash::new()
word_list.default=0;
while parsed

        str=parsed.feature.split(",")[6]
        word_list[str]=word_list[str]+1
        parsed=parsed.next
        k=k+1;
end

word_list.delete("*")

word_list.keys().each{|i|
        puts i+","+word_list[i].to_s;
}
#puts "sikiri"
#str32=word_counts("私と私は犬です. あなたと私も犬です",c)
#
#str32.keys().each{|i|
#       puts i+","+str32[i].to_s

#}



#exit;
input_file.each{|i|
        i.chomp!
        i=i.split("\t")
        date=i[0].split(" ")[0];
#       puts i[6]
        #puts date
        if i[6] != nil then
                word=(i[6]).gsub("NNEEWWLLIINNEE","");
        #       puts word
        else
                word=""

        end

        if old_date==date then
                word_date=word_date+word

        else
                #word_date_sum[old_date]=word_date
                #puts word_datea

                #v=`echo "#{word_date}" | nkf -s | mecab | nkf -w | cut -f1 | sort | uniq -c | sort -r -n`a

        str2=word_counts(word_date,c)

        str2.keys().each{|i|
                puts date+","+i+","+str2[i].to_s

        }



        word_date=word
                #puts v[0]

        #       exit

        end
        old_date=date

}