RubyでMeCabを使った形態素解析をやってみた

【結論】

形態素解析とは、自然言語処理の一種で、文章を意味を持つ最小単位の単語に区切る技術

MeCabとは、オープンソース形態素解析エンジン

・「natto」というgemを利用する事で、RubyでもMeCabを扱う事ができる

【目次】

【本題】

自動タグ付け機能実装の第一歩

業務で開発中のサービスに、自動タグ付け機能を実装してみたいと考えて、その一環で形態素解析を試してみる事にした。

形態素解析について

形態素解析とは、対象の文章を辞書(単語の品詞などの情報)に基づいて、最小単位に分割する技術。

オープンソース形態素解析エンジンは、複数存在しますが(Sudachi、Kuromojiなど)、今回は「MeCab」を利用します。

MeCabについて

MeCabとは、オープンソース形態素解析エンジンの一種で、日本語の形態素解析エンジンの中では比較的よく使用されているそうです。

Rubyでは、nattoというgemを利用する事で、手軽にMeCabを扱う事ができます。

GitHub - buruzaemon/natto: A Tasty Ruby Binding with MeCab

作業の流れ

1:MeCabとnattoを導入

2:'nokogiri'などを利用して、WEBサイトから適当な文章を抽して来る (とりあえず自分の勤め先のコーポレートサイトからスクレイピングしてくる)

3:Nattoを利用して、1の文章を形態素解析する

事前準備

まずはMeCabをHomebrew経由で導入します。

$ brew install mecab
$ brew install mecab-ipadic

次にnattoも導入します。

$ gem install natto

実装したコード

そして色々調べて(後述する参考サイトを参照)実装したコードがこちらです。

require 'natto'
require 'open-uri'
require 'nokogiri'
require 'sanitize'

urls = ['https://relic.co.jp/', 'https://relic.co.jp/service/', 'https://relic.co.jp/company/','https://relic.co.jp/recruit/special/','https://relic.co.jp/services/throttle/','https://relic.co.jp/services/enjine/','https://relic.co.jp/services/booster/','https://relic.co.jp/services/innovator-dna/']

texts = []
urls.each do |url|
  charset = nil
  html = open(url) do |f|
    charset = f.charset
    f.read
  end

  doc = Nokogiri::HTML.parse(html, nil, charset)
  doc1 = Sanitize.clean(doc)
  texts << doc1.delete("\n").delete(" ")
end

text = texts.join(", ")

natto = Natto::MeCab.new
natto.parse(text) do |n|
  puts "#{n.surface}: #{n.feature}"
end

スクレイピングの部分とか、かなりグチャグチャですが、とりあえずお試しで動かすだけなので、気にしない事にしました!

実行結果

全部書ききれないので、一部抜粋

Relic: 名詞,固有名詞,組織,*,*,*,*
採用: 名詞,サ変接続,*,*,*,*,採用,サイヨウ,サイヨー
サイト: 名詞,一般,*,*,*,*,サイト,サイト,サイト
へ: 助詞,格助詞,一般,*,*,*,へ,ヘ,エ
お: 接頭詞,名詞接続,*,*,*,*,お,オ,オ
問い合わせ: 名詞,サ変接続,*,*,*,*,問い合わせ,トイアワセ,トイアワセ
CONTACT: 名詞,一般,*,*,*,*,*
新規: 名詞,一般,*,*,*,*,新規,シンキ,シンキ
事業: 名詞,一般,*,*,*,*,事業,ジギョウ,ジギョー
の: 助詞,連体化,*,*,*,*,の,ノ,ノ
立ち: 名詞,一般,*,*,*,*,立ち,タチ,タチ
上げ: 名詞,一般,*,*,*,*,上げ,アゲ,アゲ
や: 助詞,並立助詞,*,*,*,*,や,ヤ,ヤ
プロダクト: 名詞,一般,*,*,*,*,プロダクト,プロダクト,プロダクト
開発: 名詞,サ変接続,*,*,*,*,開発,カイハツ,カイハツ
に関する: 助詞,格助詞,連語,*,*,*,に関する,ニカンスル,ニカンスル
ご: 接頭詞,名詞接続,*,*,*,*,ご,ゴ,ゴ
相談: 名詞,サ変接続,*,*,*,*,相談,ソウダン,ソーダン
など: 助詞,副助詞,*,*,*,*,など,ナド,ナド
効率: 名詞,一般,*,*,*,*,効率,コウリツ,コーリツ
的: 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
な: 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
事務: 名詞,一般,*,*,*,*,事務,ジム,ジム
局: 名詞,接尾,一般,*,*,*,局,キョク,キョク
運営: 名詞,サ変接続,*,*,*,*,運営,ウンエイ,ウンエイ
を通じて: 助詞,格助詞,連語,*,*,*,を通じて,ヲツウジテ,ヲツージテ
事業: 名詞,一般,*,*,*,*,事業,ジギョウ,ジギョー
化: 名詞,接尾,サ変接続,*,*,*,化,カ,カ
と: 助詞,並立助詞,*,*,*,*,と,ト,ト
成長: 名詞,サ変接続,*,*,*,*,成長,セイチョウ,セイチョー
まで: 助詞,副助詞,*,*,*,*,まで,マデ,マデ
を: 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
ワン: 名詞,一般,*,*,*,*,ワン,ワン,ワン
ストップ: 名詞,サ変接続,*,*,*,*,ストップ,ストップ,ストップ
クレイ: 名詞,固有名詞,人名,姓,*,*,クレイ,クレイ,クレイ
トン: 名詞,固有名詞,人名,名,*,*,トン,トン,トン
M: 名詞,固有名詞,組織,*,*,*,*
.: 名詞,サ変接続,*,*,*,*,*
クリステンセン: 名詞,一般,*,*,*,*,*
1952: 名詞,数,*,*,*,*,*
年: 名詞,接尾,助数詞,*,*,*,年,ネン,ネン
、: 記号,読点,*,*,*,*,、,、,、
ユタ: 名詞,固有名詞,地域,一般,*,*,ユタ,ユタ,ユタ
州: 名詞,接尾,地域,*,*,*,州,シュウ,シュー
ソルトレイクシティ: 名詞,固有名詞,一般,*,*,*,*
生まれ: 名詞,一般,*,*,*,*,生まれ,ウマレ,ウマレ
。: 記号,句点,*,*,*,*,。,。,。
ブリガムヤング: 名詞,一般,*,*,*,*,*
大学: 名詞,一般,*,*,*,*,大学,ダイガク,ダイガク
経済学部: 名詞,一般,*,*,*,*,経済学部,ケイザイガクブ,ケイザイガクブ
、: 記号,読点,*,*,*,*,、,、,、
オックスフォード大学: 名詞,固有名詞,組織,*,*,*,オックスフォード大学,オックスフォードダイガク,オックスフォードダイガク
経済学部: 名詞,一般,*,*,*,*,経済学部,ケイザイガクブ,ケイザイガクブ
を: 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
卒業: 名詞,サ変接続,*,*,*,*,卒業,ソツギョウ,ソツギョー

なんの手も加えていないコードにしては、しっかり分割されたのでは無いでしょうか!

うちの会社名(Relic)を、ちゃんと固有名詞で組織名だと識別していたのは驚きました。

こんなコピペコードでも、これくらいならサクッと作れてしまうのが恐ろしい・・・

次回以降の展望

とはいえ、やっぱり一部のワードは、きちんと単語が区切れていなかったりと、このままだと何の役にも立たないので、下記のような事も実践して見ようと考えています。

・辞書を登録して単語識別の精度を高める

・TF-IDFを利用して特徴語を抽出する

参考情報

GitHub - buruzaemon/natto: A Tasty Ruby Binding with MeCab

Mac OSにmecabをインストールしてnattoを利用してrubyからmecabを叩いてみる - woshidan's blog

RubyでMeCabを使う - Qiita

MacでRubyを使ってMeCabを利用する準備 - 別館 子子子子子子(ねこのここねこ)はてブロ部

mecabをRubyから使おうとしたらエラーが・・・・ - /var/www/yatta47.log