vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです。月間11万PV〜。

『MeCab+natto』で形態素解析をカスタム辞書付きでおこなう方法

      2017/01/31

LINEで送る
Pocket

mecab-natto
こんにちは、okutani(@okutani_t)です。「MeCab」を使うと形態素解析ができるようになります。

形態素解析(けいたいそかいせき、Morphological Analysis)とは、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。

引用元形態素解析 – Wikipedia

形態素解析ができると、文章内から名詞や動詞を抜き出したり、人工知能やBotなどを作ることができますね。

ビッグデータの収集時などにも使われるので、今後のIT業界ではますます需要が高まってくるのではないでしょうか。私も大学院時代、人工無脳を作成する際にMeCabを利用していました。

また、Rubyのgemライブラリである「natto」を使うことでMeCabをRubyから扱うことができます。名前が両方共かわいい(?)のが特徴ですね。

本記事ではMeCabと、MeCabで利用できる辞書、nattoの導入までを解説しています。

2016年9月現在のMeCab最新版は0.996です。

LINKMeCab: Yet Another Part-of-Speech and Morphological Analyzer」を参考にして最新版を確認してください。ダウンロードリンクもサイトから確認できます。

動作確認した環境は、Windows上で立ち上げたVagrant+CentOS7です。

ではさっそく、MeCabの導入方法とnattoの使い方を見ていきましょう。

参考形態素解析のために Wikipedia とはてなキーワードからユーザー辞書を生成し利用する – Qiita

参考rubyのmecabバインディングnattoを使う – Qiita

スポンサーリンク

MeCabをCentOS7にインストール

まずはMeCabを導入していきましょう。次のコマンドでtar.gzファイルをダウンロードします。

$ wget -O mecab-0.996.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE'

解凍してビルドしましょう。

$ tar zxfv mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure
$ make
$ make check
$ su
# make install

これでMeCabがCentOS7に導入できました。

導入確認してみましょう。MeCabのバージョンが表示されればOKです。

$ mecab --version
mecab of 0.996

圧縮ファイルはもういらないので削除してしまってOKです。

$ cd ..
$ rm mecab-0.996.tar.gz

辞書の登録

辞書の登録もおこないましょう。次の3つを導入しておけばGoodです。

  • MeCab用辞書(IPA辞書) ※必須
  • Wikipedia辞書
  • はてな辞書

この中の「MeCab用辞書」はMeCabを使う上で必須なので注意してください。IPA辞書以外でもOKですが、公式で推奨されているのはIPA辞書です。

それ以外の「Wikipedia辞書」「はてな辞書」は導入しておくと、「進撃の巨人」「きゃりーぱみゅぱみゅ」などが名詞として扱えるので、入れておくと良いです。

では、それぞれ導入のしかたを見ていきましょう。

MeCab用辞書(IPA辞書)の導入

MeCab用辞書であるIPA辞書を導入します。以下コマンドを実行。

$ wget -O mecab-ipadic-2.7.0-20070801.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM'

MeCabと同じく解凍してビルドします。

$ tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
$ su
# make install

※./configureはデフォルトでeucが使用されます。本記事ではutf8を指定してビルドしています

これでMeCab用辞書のIPA辞書が導入されました。

圧縮ファイル削除はお好みでどうぞ。

$ cd ..
$ rm mecab-ipadic-2.7.0-20070801.tar.gz

IPA辞書の動作確認

MeCabを立ち上げて動作確認してみましょう。ミスなく導入されていれば次のように形態素解析がおこなわれます。

$ mecab
隣の客はよく牡蠣食う客だ
隣      名詞,一般,*,*,*,*,隣,トナリ,トナリ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
客      名詞,一般,*,*,*,*,客,キャク,キャク
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
よく    副詞,一般,*,*,*,*,よく,ヨク,ヨク
牡蠣    名詞,一般,*,*,*,*,牡蠣,カキ,カキ
食う    動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
客      名詞,一般,*,*,*,*,客,キャク,キャク
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS

きちんと品詞に分割されて出力されました。Ctrl + cで終了できます。

わかち書きなどもできるので、詳しいことは冒頭で紹介した公式サイトを参考に。時間があったら追記します。

Wikipedia・はてな辞書の導入

では、次にWikipediaとはてなの辞書をMeCabに登録しましょう。

これらを登録すると、「きゃりーぱみゅぱみゅ」「進撃の巨人」「綾波レイ」などがひとつの単語として扱えます。

次のコマンドでWikipediaの全タイトルが入ったデータを取得しましょう。

$ wget http://download.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz

解凍。

$ gzip -d jawiki-latest-all-titles-in-ns0.gz

同じく、はてなのデータも取得します。

$ wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv

UTF-8に変換&リネーム。

$ iconv -f euc-jp -t utf-8 -c keywordlist_furigana.csv -o hatena.csv

「-c」オプションをつけないと「iconv: illegal input sequence at position 225895」とエラーが出てしまったので、しかたなく-cつけて実行しました(ここらへん詳しく分かる方いたら教えて下さい)。

これらのデータをMeCab用に整形されたCSVファイルとして変換します。作成用のプログラムを「make_dict.rb」などのファイルで作成。次のコードをコピペして使ってください。

require 'csv'

original_data = {
  wikipedia: 'jawiki-latest-all-titles-in-ns0',
  hatena: 'hatena.csv'
}

CSV.open("custom.csv", 'w') do |csv|
  original_data.each do |type, filename|
    next unless File.file? filename
    open(filename).each do |title|
      title.strip!

      next if title =~ %r(^[+-.$()?*/&%!"'_,]+)
      next if title =~ /^[-.0-9]+$/
      next if title =~ /曖昧さ回避/
      next if title =~ /_\(/
      next if title =~ /^PJ:/
      next if title =~ /の登場人物/
      next if title =~ /一覧/

      title_length = title.length

      if title_length > 3
        score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i
        csv << [title, nil, nil, score, '名詞', '一般', '*', '*', '*', '*', title, '*', '*', type]
      end
    end
  end
end

作成したmake_dict.rbを実行します。

$ ruby make_dict.rb

Wikipediaとはてなのデータが入った「custom.csv」ファイルが作成されました。

このCSVファイルをMeCabで読み込める.dic形式に変換します。変換はMeCabの「mecab-dict-index」コマンドを利用します。

$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u custom.dic -f utf-8 -t utf-8 custom.csv

Wikipediaとはてなのデータが入った「custom.dic」が作成されました。

Wikipedia・はてな辞書の動作確認

では、作成したcustom.dicをMeCabで使ってみましょう。「-u」で.dicファイルを指定すればOKです。

$ mecab -u custom.dic
進撃の巨人
進撃の巨人      名詞,一般,*,*,*,*,進撃の巨人,*,*,wikipedia
EOS
きゃりーぱみゅぱみゅ
きゃりーぱみゅぱみゅ    名詞,一般,*,*,*,*,きゃりーぱみゅぱみゅ,*,*,wikipedia
EOS
だって、女の子なんだもん
だって、女の子なんだもん 名詞,一般,*,*,*,*,だって、女の子なんだもん,*,*,hatena
EOS

上記のように、はやりの言葉であってもひとつの単語として形態素解析することができました。Wikipedia, はてな両方の辞書が使えていることも確認できました。

Wikipedia・はてな辞書をデフォルトで扱う

custom.dicをデフォルトでMeCabで扱えるようにしてみます。

これらの辞書を-uで指定せず使う場合は、「/usr/local/etc/mecabrc」に作成した辞書を登録すればOKです。

$ ls /usr/local/etc/
mecabrc
$ sudo vi /usr/local/etc/mecabrc
userdic = /home/vagrant/custom.dic

確認してみます。

$ mecab
綾波レイ
綾波レイ        名詞,一般,*,*,*,*,綾波レイ,*,*,wikipedia
EOS
碇シンジ
碇シンジ        名詞,一般,*,*,*,*,碇シンジ,*,*,wikipedia
EOS

きちんと「綾波レイ」「碇シンジ」が単語として取得することができました。

他にもニコニコ大百科データから辞書を作成することもできるそうです。余裕がある人はさらに試してみてください。

参考ニコニコ大百科データからMeCab辞書を生成する - Qiita

nattoの導入

次にRubyでMeCabを利用するため『natto』を導入してみましょう。nattoはgemでかんたんに導入できます。

$ gem install natto

もしくは、Gemfileに「gem 'natto'」を追加してbundle installしてもOKです。

では、「natto.rb」を作成してMeCabを利用してみましょう。

require 'natto'

str = '隣の客はよく牡蠣食う客だ'

natto = Natto::MeCab.new
natto.parse(str) do |n|
  puts "#{n.surface}\t#{n.feature}" if !n.is_eos?
end

実行してみます。

$ ruby natto.rb
隣      名詞,一般,*,*,*,*,隣,トナリ,トナリ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
客      名詞,一般,*,*,*,*,客,キャク,キャク
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
よく    副詞,一般,*,*,*,*,よく,ヨク,ヨク
牡蠣    名詞,一般,*,*,*,*,牡蠣,カキ,カキ
食う    動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
客      名詞,一般,*,*,*,*,客,キャク,キャク
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ

RubyからMeCabを使って形態素解析をおこなうことができました。

今回はかんたんな使い方しか紹介しませんでしたが、nattoのより詳しい使い方は以下リンクを参考にしてください。

参考buruzaemon/natto: A Tasty Ruby Binding with MeCab

形態素解析を使ってプログラムを組みたい方の参考になれば幸いです。

この記事が気に入ったら
いいね ! しよう

Twitter で
LINEで送る
Pocket

okutani (@okutani_t) のヒトコト
MeCabを使った形態素解析は便利ですね。言語解析の基礎的な部分なので、ぜひMeCabを使って形態素解析をおこなってみてください。

 - Ruby

スポンサーリンク

PC用AdSense

PC用AdSense

Share
  • このエントリーをはてなブックマークに追加

  こちらの関連記事もどうぞ

cronでシェルスクリプトとrubyプログラムを定期実行させる

こんにちは、okutani(@okutani_t)です。Linuxにある「cro …

Ruby+nokogiriを使ってブログの過去記事をTwitterに投稿してみる

こんにちは、okutani(@okutani_t)です。本ブログ『vdeep.n …

rbenvを使って複数バージョンのrubyを導入する

こんにちは、okutani(@okutani_t)です。rubyの導入方法のひと …

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。