Simpleエンジニア

システム開発の備忘録

(ちょっとRubyとは外れるんだけど)MeCabってすごいなぁ

2010年07月23日 17時28分39秒 | Ruby
[~]# mecab
こどもの国
こどもの国      名詞,固有名詞,一般,*,*,*,こどもの国,コドモノクニ,コドモノクニ
EOS
こどもの国線
こどもの国線    名詞,固有名詞,一般,*,*,*,こどもの国線,コドモノクニセン,コドモノクニセン
EOS
夢の島
夢の島  名詞,一般,*,*,*,*,夢の島,ユメノシマ,ユメノシマ
EOS
夢の国
夢      名詞,一般,*,*,*,*,夢,ユメ,ユメ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
国      名詞,一般,*,*,*,*,国,クニ,クニ
EOS

MeCab のインストールとユーザ辞書追加方法

2010年07月15日 13時13分33秒 | Ruby
日本語解析のため、MeCab-めかぶ-をインストールし、
ユーザ辞書を使えるようにする方法。

1.MeCabのインストール

最新版パッケージはここから確認する。
http://sourceforge.net/projects/mecab/files/
2010年7月15日時点で最新バージョンは 0.98

○インストールまで
wget http://sourceforge.net/projects/mecab/files/mecab/0.98/mecab-0.98.tar.gz/download
tar zxvf mecab-0.98.tar.gz
cd mecab-0.98
./configure --prefix=/usr/local/mecab-0.98 --with-charset=utf8
make
sudo make install
ln -s /usr/local/mecab-0.98 /usr/local/mecab

2.MeCabのユーザ辞書のインストール

よく使われているのは、ipadic と、naist-jdic 。
ipadicは2007年で更新が止まっているので、naist-jdic がよいと思うが、
動作確認ができていないのでとりあえずipadic で話をすすめる。

○ipadicの場合
http://sourceforge.net/projects/mecab/files/mecab-ipadic/
○naist-jdic の場合
http://sourceforge.jp/projects/naist-jdic/

ここらへんで最新版を取得。

○インストールまで

tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8 --with-mecab-config=/usr/local/mecab-0.98/bin/mecab-config
make
sudo make install

3.ruby で使えるようにする

wget "http://jaist.dl.sourceforge.net/sourceforge/mecab/mecab-ruby-0.98.tar.gz"
tar zxvf mecab-ruby-0.98.tar.gz

※追記 1でカスタムインストールを行っているため、extconf.rb を実行してもエラーが発生する。
そこで、extconf.rb を編集し、
`mecab-config --libs-only-l` の部分を、
`/usr/local/mecab/bin/mecab-config --libs-only-l` に変更すること。

cd mecab-ruby-0.98
/usr/local/ruby/bin/ruby ./extconf.rb --with-mecab-config=/usr/local/mecab/bin/mecab-config
make
sudo make install

ruby のほか、
perl, python, java 用のAPIが
http://sourceforge.net/projects/mecab/files/
からダウンロード可能。インストール方法はrubyと同じ。

4.ユーザ辞書を作る

まず、追加したい単語をCSVファイルに書き出す。(以下、文字コードUTF8で作業)
新語を追加することが多いので、例として「婚活」「歴女」を追加する場合。
※活用のある単語や人名といった詳しい分類や、謎の数字の意味については後述

婚活,-1,-1,500,名詞,一般,*,*,*,*,婚活,コンカツ,コンカツ
歴女,-1,-1,500,名詞,一般,*,*,*,*,歴女,レキジョ,レキジョ

この2行をテキストエディタに貼りつけ、「userdic.csv」として保存する。
辞書をコンパイルするコマンドは、

/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/mecab/lib/mecab/dic/ipadic/ -u userdic.dic -f utf8 -t utf8 ./userdic.csv

5.ユーザ辞書を有効にする


MeCabのコンフィグファイルを変更しないと、
ユーザ辞書は利用されない。
上記のインストールの場合は、
/usr/local/mecab/etc/mecabrc
が設定ファイルとなるが、他のインストールでもたいていは/etc のどこかになると思う。

; userdic = /home/foo/bar/user.dic
このコメントをコピペして、
userdic = /home/hoge/userdic.dic
といった形で上書き保存する。

6.動作確認
コマンドラインから /usr/local/mecab/bin/mecab
を実行すると、対話式でMeCab の動作確認を行える。

確認例

流行語にもなった「婚活」「歴女」などが代表的な「トレンドキーワード」です
流行    名詞,サ変接続,*,*,*,*,流行,リュウコウ,リューコー
語      名詞,接尾,一般,*,*,*,語,ゴ,ゴ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
も      助詞,係助詞,*,*,*,*,も,モ,モ
なっ    動詞,自立,*,*,五段・ラ行,連用タ接続,なる,ナッ,ナッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
「      記号,括弧開,*,*,*,*,「,「,「
婚活    名詞,一般,*,*,*,*,婚活,コンカツ,コンカツ
」      記号,括弧閉,*,*,*,*,」,」,」
「      記号,括弧開,*,*,*,*,「,「,「
歴女    名詞,一般,*,*,*,*,歴女,レキジョ,レキジョ
」      記号,括弧閉,*,*,*,*,」,」,」
など    助詞,副助詞,*,*,*,*,など,ナド,ナド
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
代表    名詞,サ変接続,*,*,*,*,代表,ダイヒョウ,ダイヒョー
的      名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
「      記号,括弧開,*,*,*,*,「,「,「
トレンド        名詞,一般,*,*,*,*,トレンド,トレンド,トレンド
キーワード      名詞,一般,*,*,*,*,キーワード,キーワード,キーワード
」      記号,括弧閉,*,*,*,*,」,」,」
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS

「婚活」と「歴女」がうまく取得できた!
(辞書が古いと、婚 活、 歴 女と分割されてしまう)

※活用語については、
http://mecab.sourceforge.net/dic.html
を参考にするとよいでしょう。

※数値については、-1はmecabの内部で扱うIDなので、(-1は自動振り分け)
解析する以外であまりこだわる必要はなし
500の部分は優先度で、数値が小さいと優先して使われます。
気になる人はmecabのディレクトリにあるCSVファイルを調べて、
似たような単語のコストを調べてその前後の数値を指定するのがよいです。

[Ruby] [Nokogiri] Hash から XML へコンバートする

2010年03月30日 18時18分17秒 | Ruby
Perl だと割と簡単に Hash => XML ができるようだが、
あえて Ruby/Nokogiri を利用して、
ハッシュ=>XMLへのコンバートを行う手順。

require 'nokogiri'
require 'time'

hash = Hash.new
hash["date"] = Time.now
hash["title"] = "Hash から XML へコンバートする"

xmlObj = Nokogiri::XML::Builder.new do |xml|
  xml.rootTag {
    hash.each{ |k, v|
      eval("xml.#{k} { xml.text v }")
    }
  }
end

puts xmlObj.to_xml

<rootTag>
  <title>Hash から XML へコンバートする</title>
  <date>Tue Mar 30 18:22:48 +0900 2010</hash>
</rootTag>



[Ruby] Tokyo Cabinet を使った簡単なライブラリ

2010年03月17日 16時56分13秒 | Ruby
とりあえずメモなのです。
詳しい説明は後日。

require 'tokyocabinet'

# 条件(keyword),結果(data) を保存する
def save_history(keyword, data, filepath)
  hdb = TokyoCabinet::HDB::new()
  hdb.open(filepath, TokyoCabinet::HDB::OWRITER|TokyoCabinet::HDB::OCREAT)
  hdb.put(keyword, data)
  hdb.close()
  return nil
end

# 条件(keyword)に対する結果を取り出す
def get_history(keyword, filepath)
  hdb = TokyoCabinet::HDB::new()
  hdb.open(filepath, TokyoCabinet::HDB::OREADER)
  result = hdb.get(keyword)
  hdb.close()
  return result

end

# 固定長簡易DBへログを入力する
# 1ログに255byte以上を使用する場合は、チューニング行を1行入れる
# 例 1行で1024Byte, 1ファイルサイズ1TB制限 fdb.tune(512, 1099511627776)
# 2GB以上のファイルサイズは、64ビットマシンでないと使用できない可能性があります
def save_log(log, filepath)
  if log.size < 255 then
    fdb = TokyoCabinet::FDB::new()
    fdb.open(filepath, TokyoCabinet::FDB::OWRITER|TokyoCabinet::FDB::OCREAT )
    fdb.put("next", keyword)
    fdb.close()
  end
end