パソコン・情報公開## Rubyのmecabで形態素解析というのをやってみた(Linux)

:CATEGORIES: #Ruby #Linux

sudo apt install mecab
sudo apt install libmecab-dev
sudo apt install mecab-ipadic-utf8

gem install mecab
gem install natto

 上記のページを参考に,そのままコピペで実行してみました。形態素解析という言葉自体,今日初めて目にしたのですが,これは国語の勉強にもなりそうです。かなり人工知能的な感じです。

irb(main):001:0> require 'mecab'
=> true
irb(main):002:0> tagger = MeCab::Tagger.new
irb(main):003:0> 
irb(main):004:0> 
irb(main):005:0> 
irb(main):006:0> puts tagger.parse('太郎はこの本を二郎を見た女性に渡した。')
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二      名詞,数,*,*,*,*,二,ニ,ニ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS
=> nil

%(py37_env) ➜  ~ sudo gem install natto
Fetching natto-1.2.0.gem
Successfully installed natto-1.2.0
Parsing documentation for natto-1.2.0
Installing ri documentation for natto-1.2.0
Done installing documentation for natto after 0 seconds
1 gem installed

(py37_env) ➜  ~ irb
irb(main):001:0> require 'natto'
=> true
irb(main):002:0> nm = Natto::MeCab.new
irb(main):003:0> puts nm.parse('太郎はこの本を二郎を見た女性に渡した。')
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二      名詞,数,*,*,*,*,二,ニ,ニ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS
=> nil
irb(main):004:1* nm.parse('太郎はこの本を二郎を見た女性に渡した。') do |n|
irb(main):005:1*   puts "#{n.surface}\tpart-of-speech id: #{n.posid}" if !n.is_eos?
irb(main):006:0> 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
irb(main):007:0> nm = Natto::MeCab.new('-F%m\t%f[0]\t%f[7]\n')
irb(main):008:0> enum = nm.enum_parse('太郎はこの本を二郎を見た女性に渡した。')
irb(main):010:0> enum.next
=> #<Natto::MeCabNode:0x0000560e4f4c8638 @pointer=#<FFI::Pointer address=0x0000560e4f745930>, stat=0, @surface="太郎", @feature="太郎   名詞    タロウ
">
irb(main):011:0> enum.peek
=> #<Natto::MeCabNode:0x0000560e4f528510 @pointer=#<FFI::Pointer address=0x0000560e4f745af0>, stat=0, @surface="", @feature="は       助詞    ハ
">
irb(main):013:0> enum.rewind
=> #<Enumerator: #<Enumerator::Generator:0x0000560e4f4cfe88>:each>
irb(main):014:0> enum.each {|n| puts n.feature unless n.is_eos? }
太郎    名詞    タロウ
は      助詞    ハ
この    連体詞  コノ
本      名詞    ホン
を      助詞    ヲ
二      名詞    ニ
郎      名詞    ロウ
を      助詞    ヲ
見      動詞    ミ
た      助動詞  タ
女性    名詞    ジョセイ
に      助詞    ニ
渡し    動詞    ワタシ
た      助動詞  タ
。      記号    。
=> nil