Macにmecabをインストール
Ruby: 2.3.3
os: OSX 10.12.3 (Sierra)
SentOSの場合はこの記事を参考にしてください。
mecabと辞書ファイルをmacにインストール
$ brew update
$ brew install mecab mecab-ipadic
gemをインストール
$ gem install mecab
使ってみる
>> require 'mecab'
=> true
>> tagger = MeCab::Tagger.new
=> #<MeCab::Tagger:0x007fb5ff0a2b40 @__swigtype__="_p_MeCab__Tagger">
>> puts tagger.parse('太郎はこの本を二郎を見た女性に渡した。')
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
この 連体詞,*,*,*,*,*,この,コノ,コノ
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二 名詞,数,*,*,*,*,二,ニ,ニ
郎 名詞,一般,*,*,*,*,郎,ロウ,ロー
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性 名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
=> nil
natto(Gem)を使うと簡単に書ける
nattoはmecabを扱いやすくしてくれるGemです。
nattoをインストール
$ gem install natto
使ってみる
>> require 'natto'
=> true
>> nm = Natto::MeCab.new
=> #<Natto::MeCab:0x007fa61891a9e0 @model.........
>> puts nm.parse('太郎はこの本を二郎を見た女性に渡した。')
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
この 連体詞,*,*,*,*,*,この,コノ,コノ
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二 名詞,数,*,*,*,*,二,ニ,ニ
郎 名詞,一般,*,*,*,*,郎,ロウ,ロー
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性 名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
=> nil
surface
: 形態素の対象要素
posid
: 辞書のid
is_eos?
: EOS(End Of String)かどうかの判定
>> nm.parse('太郎はこの本を二郎を見た女性に渡した。') do |n|
?> puts "#{n.surface}\tpart-of-speech id: #{n.posid}" if !n.is_eos?
>> end
太郎 part-of-speech id: 44
は part-of-speech id: 16
この part-of-speech id: 68
本 part-of-speech id: 38
を part-of-speech id: 13
二 part-of-speech id: 48
郎 part-of-speech id: 38
を part-of-speech id: 13
見 part-of-speech id: 31
た part-of-speech id: 25
女性 part-of-speech id: 38
に part-of-speech id: 13
渡し part-of-speech id: 31
た part-of-speech id: 25
。 part-of-speech id: 7
=> nil
要素をループで回して処理する場合は、enum_parseメソッドを使うことで効率的に処理ができます。
下記のノードフォーマットオプションでループの際に使う属性をカスタマイズできます。
%m
: 形態素の対象要素
%f[0]
: 要素名
%f[7]
: カナ
>> nm = Natto::MeCab.new('-F%m\t%f[0]\t%f[7]\n')
=> #<Natto::MeCab:0x007ff11a1bc318 @model=...........
>> enum = nm.enum_parse('太郎はこの本を二郎を見た女性に渡した。')
=> #<Enumerator: #<Enumerator::Generator:0x007ff11986f4e0>:each>
>> enum.next
=> #<Natto::MeCabNode:0x007ff11986d438 @pointer=#<FFI::Pointer address=0x007ff11a1e2c30>, stat=0, @surface="太郎", @feature="太郎 名詞 タロウ">
>> enum.peek
=> #<Natto::MeCabNode:0x007ff11909b610 @pointer=#<FFI::Pointer address=0x007ff11a1e2d80>, stat=0, @surface="は", @feature="は 助詞 ハ">
>> enum.rewind
=> #<Enumerator: #<Enumerator::Generator:0x007ff11986f4e0>:each>
>> enum.each {|n| puts n.feature unless n.is_eos? }
太郎 名詞 タロウ
は 助詞 ハ
この 連体詞 コノ
本 名詞 ホン
を 助詞 ヲ
二 名詞 ニ
郎 名詞 ロウ
を 助詞 ヲ
見 動詞 ミ
た 助動詞 タ
女性 名詞 ジョセイ
に 助詞 ニ
渡し 動詞 ワタシ
た 助動詞 タ
。 記号 。
=> nil
>>
参考リンク
https://github.com/markburns/mecab
https://github.com/buruzaemon/natto
http://watarisein.hatenablog.com/entry/2016/01/31/163327