『MeCab+natto』で形態素解析をカスタム辞書付きでおこなう方法
2017/01/31
こんにちは、okutani(@okutani_t)です。「MeCab」を使うと形態素解析ができるようになります。
形態素解析(けいたいそかいせき、Morphological Analysis)とは、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。
形態素解析ができると、文章内から名詞や動詞を抜き出したり、人工知能や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
形態素解析を使ってプログラムを組みたい方の参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク