2019年2月14日木曜日

Ruby で形態素解析

概要

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 件のコメント:

コメントを投稿