概要
Ruby で形態素解析してみました
MeCab を使った natto というライブラリを使うとプログラマブルに簡単に書けます
環境
- macOS 10.14.3
- ruby 2.5.1p57
- mecab 0.996
mecab インストール
brew install mecab mecab-ipadic
natto インストール
bundle init
vim Gemfile
gem "natto"
bundle install --path vendor
サンプルコード
個人的におすすめの方法です
ポイントはインスタンス生成時にオプションで -F%f[0]
を指定するところです
こうすることで n.feature
で品詞だけ取得することができます
# coding: utf-8
require 'natto'
mecab = Natto::MeCab.new('-F%f[0]')
mecab.parse("チャンネル登録よろしくおねがいします") do |n|
puts "#{n.surface} #{n.feature}" unless n.is_eos?
end
結果
チャンネル 名詞
登録 名詞
よろしく 副詞
おねがい 名詞
し 動詞
ます 助動詞
-F%f[0]
は MeCab の解析結果のカンマで区切られた部分になります
例えば
きょう 名詞,副詞可能,*,*,*,*,きょう,キョウ,キョー
で言うところの「名詞,副詞可能,*,*,*,*,きょう,キョウ,キョー
」の部分です
ここの必要な情報だけを feature
で取得することができるわけです
f[0]
であれば「名詞」の部分で f[1]
であれば「副詞可能」の部分が取得できます
テクニック: 特定の連続ワードは名詞として扱う
例えば「チャンネル登録」は一つの名詞として扱いたい場合は feature_constraints
を使います
# coding: utf-8
require 'natto'
mecab = Natto::MeCab.new('-F%f[0]')
mapping = {"チャンネル登録" => "名詞"}
mecab.parse("チャンネル登録よろしくおねがいします", feature_constraints: mapping) do |n|
puts "#{n.surface} #{n.feature}" unless n.is_eos?
end
結果
チャンネル登録 名詞
よろしく 形容詞
おねがい 名詞
し 動詞
ます 助動詞
テクニック: Enumerator として扱う
先程は parse
してからブロックで回しました
その場合はそれぞれ Natto::MeCabNode
として扱います
enum_parse
を使うと結果を一度 Enumerator
として扱うことができます
# coding: utf-8
require 'natto'
mecab = Natto::MeCab.new('-F%f[0]')
enum = mecab.enum_parse("チャンネル登録よろしくおねがいします")
puts enum.first.surface
puts enum.first.feature
結果をソーティングしたり必要な結果だけフィルタしてから使ったりすることができます
最後に
Ruby の natto を使って形態素解析をしてみました
かなり簡単に使えて便利だなと思いました
0 件のコメント:
コメントを投稿