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

f:id:ryoutaku_jo:20190620230256p:plain

【結論】

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

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

《今日の学習進捗(3年以内に10000時間に向けて)》

業務にて、サービスの機能を拡張する毎に、非常にスマートだったデザインが、徐々にゴテゴテ感を増してきているのを感じる。

デザインを起こした時点では想定していない仕様だった為、全体の整合性が取れなくなりつつあるのが、原因だと考えている。サイト導線も大幅に変わっている箇所もある為、今一度、サービス全体のUI/UXの方向性をはっきり定めて、修正を行いたい気持ちが高まっている。

とはいえ、まだまだ追加すべき機能は残っているのと、本格的に利用するユーザーが増え始めれば、更に機能拡張の要望が上がってくると思うので、いま方向性を決めたとしても、手戻りが発生してしまうと考えている。

ある程度、機能拡張が落ち着いたら、サービス全体としてのUI/UXの方向性を話し合って、使い勝手の良いサービスに仕上げていきたい。

学習開始からの期間 :196日
今日までの合計時間:1911h
一日あたりの平均学習時間:9.8h
今日までに到達すべき目標時間:1790h
目標との解離:121h
「10,000時間」まで、

残り・・・「8089時間!」