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 }