IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

Ruby & Rails

CTC 教育サービス

 [IT研修]注目キーワード   OpenStack  OpenFlow/SDN  情報セキュリティ  Python  システムトラブルシュート 

第28回 Rubyで始めよう! 形態素解析 (藺藤卓実) 2016年8月

こんにちは。 藺藤です。

最近「私たちが作っているWebサービスでも何か応用できないか」と気になっているものがあります。 それは「形態素解析」と呼ばれるものです。(*1)

形態素解析を行う実装は様々なものがあるようですが、今回はGem「natto」(*2)を使ってRubyプログラム上から形態素解析エンジン「MeCab」(*3)を利用する方法を説明します。

動作確認した環境は以下のとおりです。

  • CentOS 7.0
  • MeCab 0.996
  • Ruby 2.3.1
  • natto 1.1.0

初めに断っておきますと、申し訳ありませんがRubyコラムにも関わらず前半はRubyコードが全く出てきません。 ですが、後半の準備となる部分ですので読み飛ばさないで頂ければと思います。 それではさっそく始めましょう。

目次

  • 形態素解析とは
  • MeCabのインストール
  • MeCabを使って形態素解析
  • nattoのインストール
  • nattoを使って形態素解析
形態素解析とは

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

この説明だけではなんだか難しそうに思えますが、実際に例を見ると分かりやすいのではないでしょうか。 例えば、『最近「私たちが作っているWebサービスでも何か応用できないか」と気になっているものがあります。』という文は形態素解析によって次のように分割されます。

(元の文)
  最近「私たちが作っているWebサービスでも何か応用できないか」と気になっているものがあります。

(解析結果) 最近 / 「 / 私 / たち / が / 作っ / て / いる / Web / サービス / で / も / 何 / か/ 応用 / でき / ない / か / 」 / と / 気 / に / なっ / て / いる / もの / が / あり / ます / 。

与えられた文を、意味のある単位(品詞や記号、数値など)に分解する技術と呼ぶことができそうです。 形態素解析を行うことで、元の文の中からキーワードとなりそうな単語(Web / サービス / 応用)を取り出すことができています。 また、実はこの時点で「気 / に / なっ」の部分は「気 / に / なる」の変形であることも特定されています。

何だか、様々な応用ができそうな気がしてきませんか? すぐに思いつくだけでも、一番単純な応用例ですが「頻出する語彙を調べる」ことや、発展的な例としては「前後に出現する単語に基づき、文の意味解釈を行う」等ができそうです。 単語のペアの出現頻度を調べるのも良いかもしれません。(例えば、文章中にRubyとRailsは一緒に出現することが多いのか、等) また、文章の書き手の癖(例えば、「思います。」や「思いました。」、「思われます。」が多いか、等)を調べるのも面白そうですね。

MeCabのインストール

実際に形態素解析を行うための準備をします。 初めに形態素解析エンジンの「MeCab」をインストールします。

WebブラウザでMeCabの公式ページへと移動しましょう。(*3)

今回はCentOSに環境を構築するので、ダウンロードから「MeCab本体」のソースコードをダウンロードします。 また、MeCab本体には"辞書"が含まれていないため、こちらも必要です。 同じページに何種類かの辞書がありますが、ここでは推奨されている「IPA辞書」をダウンロードしましょう。 この時点で手元に以下のファイルがあるはずです。

ls | grep mecab
> mecab-0.996.tar.gz
> mecab-ipadic-2.7.0-20070801.tar.gz

ダウンロードに成功したら、あとはいつもの手順でコンパイル及びインストールしてゆきます。(*4)

まずMeCabの本体をコンパイルします。

  # MeCabのコンパイル
  tar zxvf mecab-0.996.tar.gz
  cd mecab-0.996
./configure --enable-utf8-only make

「make check」コマンドで問題が発生していないどうか確かめられます。(*5) 結果の一部を抜粋します。

  # 正しくビルドできたのかを確認
  make check
  > ...
  > ==================
  > All 3 tests passed
  > ==================
  > ...

無事にテストをパスしたようです。

問題がないようでしたら、次のコマンドでインストールします。

  # MeCabのインストール
  make install

これでMeCab本体のインストールは完了です。

続いてIPA辞書についても同様にコンパイル、インストールを行います。

  # IPA辞書のコンパイル
  tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
  cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf-8 make

コンパイルが成功したら、辞書もインストールします。

  # IPA辞書のインストール
  make install

お疲れ様でした。 これでMeCab本体及び辞書のインストール作業が完了です。

MeCabを使って形態素解析

さっそくMeCabを使ってみましょう。 起動コマンドは「mecab」です。

  mecab
  > 

コマンドを実行しても何も表示されませんが、これは入力待ち状態です。 どんなものでもよいので何か適当に文章を入力してみてください。 入力後、エンター・キーを押下することで解析が実行されます。

諸君、彼は禿頭である。然り、彼は禿頭である。
> 諸君    名詞,一般,*,*,*,*,諸君,ショクン,ショクン
> 、      記号,読点,*,*,*,*,、,、,、
> 彼      名詞,代名詞,一般,*,*,*,彼,カレ,カレ
> は      助詞,係助詞,*,*,*,*,は,ハ,ワ
> 禿頭    名詞,一般,*,*,*,*,禿頭,ハゲアタマ,ハゲアタマ
> で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
> ある    助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
> 。      記号,句点,*,*,*,*,。,。,。
> 然      副詞,一般,*,*,*,*,然,シカ,シカ
> り      助動詞,*,*,*,文語・リ,基本形,り,リ,リ
> 、      記号,読点,*,*,*,*,、,、,、
> 彼      名詞,代名詞,一般,*,*,*,彼,カレ,カレ
> は      助詞,係助詞,*,*,*,*,は,ハ,ワ
> 禿頭    名詞,一般,*,*,*,*,禿頭,ハゲアタマ,ハゲアタマ
> で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
> ある    助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
> 。      記号,句点,*,*,*,*,。,。,。
>         BOS/EOS,*,*,*,*,*,*,*,*

  (※例文は坂口安吾 著作品より)

ご覧の通り、与えられた文を品詞や記号に分解することができました。(*6)

nattoのインストール

ここまでで、MeCabをコマンドライン上で実行することができるようになりました。 MeCabをRubyプログラムから利用するためには、Gem「natto」を使うと便利です。 導入はいつもの通り「gem install」で行います。

  gem install natto
  #=> Fetching: natto-1.1.0.gem
  #=> Successfully installed natto-1.1.0
  #=> ...
  #=> 1 gem installed

これでRubyプログラムからMeCabを使う準備ができました。

nattoを使って形態素解析

「natto」を利用してみましょう。 irbを起動してください。

irb

irbが起動したら、先ほどインストールした「natto」をrequireしてRubyで利用できるようにします。

require 'natto'

最も基本的な使い方は次のようにします。 次のコードは、先ほどコマンドライン上で実行した解析とまったく同じことをRuby上で行う例です。

  # 初めにMeCabオブジェクトを生成
  mecab = Natto::MeCab.new
# 解析したい文(文章)を#parseメソッドに渡す text = '諸君、彼は禿頭である。然り、彼は禿頭である。' result_str = mecab.parse(text) puts result_str # 先ほど、MeCabを端末上で実行して得た結果と同じものが出力される

MeCabによる形態素解析の結果を得るには、インスタンス・メソッド(Natto::MeCab#parse)を利用します。 #parseの引数として文字列を渡すと、解析結果が文字列で返ります。 結果の文字列(result_str)には改行コードが含まれるので、putsを利用してそのまま出力できます。

とりあえずRubyプログラムからMeCabを利用することはできましたが、このままではnattoを導入したメリットがあまり感じられません。 Rubyプログラム上で扱う際に、もう少し便利なメソッドとしてNatto::MeCab#enum_parseがあります。 #enum_parseは、#parseと同じ解析をしますが、文字列の代わりにEnumeratorオブジェクトを返します。 例を示します。

  # MeCab#parseの代わりに、MeCab#enum_parseを使う
  result_enum = mecab.enum_parse(text)
  result_enum.each do |result| 
    puts "#{result.surface} -- #{result.feature}"
  end

ブロック変数(ここではresult)に渡されるのは、Natto::MeCabNodeクラスのインスタンスです。 Natto::MeCabNodeのインスタンス・メソッドの中で、ここでは#surfaceメソッドと#featureメソッドを利用しました。 それぞれのメソッドの戻り値は次の通りです。

メソッド 戻り値
Natto::MeCabNode#surface 形態素そのもの(例えば、禿頭)
Natto::MeCabNode#feature 形態素情報(例えば、固有名詞といった情報)

実行結果の一部を抜粋します。

  #=> 諸君 -- 名詞,一般,*,*,*,*,諸君,ショクン,ショクン
  #=> 、 -- 記号,読点,*,*,*,*,、,、,、
  #=> ...(以下省略)

出力を加工したい場合や、別のオブジェクトに値を格納したい場合には#enum_parseを使うと便利です。

まとめ

今回は「Rubyで始めよう! 形態素解析」というテーマで、オープンソースの形態素解析エンジンMeCabの紹介と、MeCabをRubyプログラムから扱えるGem「natto」を紹介しました。 これらを使って、読者の皆さんにぜひ色々と遊んでみてほしいと思います。

それでは、Enjoy Ruby!

(注釈)

*1 : Wikipedia「形態素解析」
https://ja.wikipedia.org/wiki/形態素解析

*2 : Gem「natto」のGitHubページ。
https://github.com/buruzaemon/natto

*3 : 「MeCab」のプロジェクトページ。
http://taku910.github.io/mecab/
ちなみにMeCabという名前の由来は、作者さんの好物メカブ(和布蕪)に因んでいるとのことです。

*4 : 今回は文字エンコーディングをUTF-8とするために、configureに「--with-charset=utf-8」や「--enable-utf8-only」のオプションを指定します。

*5 : ビルドに失敗する場合、Cプログラムのコンパイルに必要なファイルが存在しないことが失敗の原因である可能性が考えられます。 確認してみてください。

*6 : もしも文字化けが発生するようでしたら、MeCab本体または辞書をconfigureする際の文字エンコーディングを確認してください。 MeCabではデフォルトの文字エンコーディングはEUCですが、Webや各プログラミング言語ではUTF-8が使われています。

 


 

 [IT研修]注目キーワード   OpenStack  OpenFlow/SDN  情報セキュリティ  Python  システムトラブルシュート