Rubyで形態素解析してみた

昨日の晩あたりから、形態素解析したい気分だったのでやってみました。
形態素解析というのは以下のようなもの。

対象言語の文法の知識(文法のルールの集まり)や辞書(品詞等の情報付きの単語リスト)を情報源として用い、自然言語で書かれた文を形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの品詞を判別する作業を指す。

形態素解析 - Wikipedia

圧縮新聞にも使われているそうです。

今回は、MeCab(和布蕪)という形態素解析エンジン利用させて頂きました。
Ubuntu環境で実験しましたが、大抵同じような作業で動くと思います。文字コードの指定のみ適時読み替えてください。

ファイルの取得

MeCab本体(mecab-0.97.tar.gz)、辞書ファイル(mecab-ipadic-2.7.0-20070801.tar.gz)、Rubyバインディング(mecab-ruby-0.97.tar.gz)をダウンロードします。

MeCabのインストール

MeCab本体と辞書ファイルを導入します。
本体。

% tar xvfz mecab-0.97.tar.gz  
% ./configure
% make
% make check 
% sudo make install

辞書。

% tar xvfz mecab-ipadic-2.7.0-20070801.tar.gz
% cd mecab-ipadic-2.7.0-20070801/
% ./configure --with-charset=utf8
% sudo ldconfig /usr/local/lib/
% make
% sudo make install

これで導入は完了です。動作チェックをしてみます。

% mecab
すもももももももものうち
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

Rubyで使う

Rubyバインディングを導入します。

% tar xvfz mecab-ruby-0.97.tar.gz
% cd mecab-ruby-0.97/
% ruby extconf.rb 
% make
% sudo make install

これで完了。
サンプルを動かします。

#!/usr/bin/ruby -Ku

# mecab_test.rb

require 'MeCab'

m = MeCab::Tagger.new("-Ochasen")
print m.parse("今日もしないとね")

結果。

% ruby mecab_test.rb
今日    キョウ  今日    名詞-副詞可能
も      モ      も      助詞-係助詞
し      シ      する    動詞-自立       サ変・スル      未然形
ない    ナイ    ない    助動詞  特殊・ナイ      基本形
と      ト      と      助詞-接続助詞
ね      ネ      ね      助詞-終助詞
EOS

以下のサンプルは文章をバラバラにして、1文字以上のカタマリを取り出します。

#!/usr/bin/ruby -Ku

# mecab_test2.rb

require 'MeCab'

class String
  def each_char
    scan(/./m) do |c|
      yield(c)
    end
  end

  def char_count
    n = 0
    each_char do
      n += 1
    end
    n
  end

end

m = MeCab::Tagger.new("-Owakati")
str = '後半はアニメのプロット。パラパラ見た感じは、脚本テイストの文章が珍しくてよさそう。攻殻機動隊のイメージが掴めている人なら楽しめそうな内容です。'
p m.parse( str ).split.map { |item| item if item.char_count > 1 }.compact

結果。

% ruby mecab_test2.rb
["後半", "アニメ", "プロット", "パラパラ", "感じ", "脚本", "テイスト", "文章", "珍しく", "そう", "機動", "イメージ", "掴め", "いる", "なら", "楽しめ", "そう", " 内容", "です"]

辞書に単語を追加する

攻殻スキーとしては「攻殻機動隊」を認識させたいところです。辞書に追加してみます。
辞書ファイルを展開したディレクトリで作業します。

% cd mecab-ipadic-2.7.0-20070801

foo.csvというファイルを作り、単語情報を登録します。

% vi foo.csv
攻殻機動隊,-1,-1,3000,名詞,固有名詞,組織,*,*,*,攻殻機動隊,コウカクキドウタイ,コウカクキドウタイ

コンパイル&インストールします。

% /usr/local/libexec/mecab/mecab-dict-index -f utf8 -t utf8
% sudo make install

サンプルを実行すると「攻殻機動隊」を認識していることを確認できます。

% ruby mecab_test2.rb
["後半", "アニメ", "プロット", "パラパラ", "じは", "脚本", "テイスト", "文章", "しくてよさそう", "攻殻機動隊", "イメージ", "めている", "なら", "楽しめ", "そう", " 内容", "です"]

まとめ

辞書ファイルを作りこめば面白そう。

恋するプログラム―Rubyでつくる人工無脳

恋するプログラム―Rubyでつくる人工無脳

読んでみたいけどプレミア価格だぞ。