- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

Ruby

はじめに Edit

ベイズ推定を利用したフィルタを利用したいという話。

ここではUbuntuとWindowsを想定しています。

RubyGemsのclassifierを使ってみる Edit

githubを見るに最新版はたぶんこれ↓
luisparravicini's classifier at master - GitHub

なんだけど、まずは素のclassifierを使ってみる。

$ sudo gem install classifier
Successfully installed stemmer-1.0.1
Successfully installed classifier-1.3.1
2 gems installed

stemmerというのも依存で入れさせられた。

あとは、こちらを参考にサンプルを実行してみると→ベイジアンフィルターで日本語を分類する。 - ザリガニが見ていた...。

classifier_test.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!ruby -Ku
$KCODE = 'u'
require 'rubygems'
require 'classifier'
require 'stemmer'

# 分類の設定
bayes = Classifier::Bayes.new('mac', 'windows')

# 分類の学習
#  mac
bayes.train('mac', 'How do I customize my iPod settings?')
bayes.train('mac', 'How do I set up an AirPort wireless network?')
bayes.train('mac', 'How do I set up Mac OS X Mail?')
#  windows
bayes.train('windows', 'You must be running Microsoft Internet Explorer 5 or later.')
bayes.train('windows', 'You can obtain updates from the Microsoft Download Center.')
bayes.train('windows', 'Get Office Live Basics for your business today.')

# 判定する文章
comment = 'How do I sync audio and video to my iPod?'

# 分類データの数値化
puts bayes.classifications(comment).inspect

# 分類の結果
puts bayes.classify(comment)

# 中身
p bayes

実行例:

$ ruby classifier_test.rb 
Notice: for 10x faster LSI support, please install http://rb-gsl.rubyforge.org/
{"Mac"=>-18.6338897776217, "Windows"=>-26.9681377317618}
Mac
#<Classifier::Bayes:0xb79e8c68 @categories={:Mac=>{:mac=>1, :mail=>1, :custom=>1, :airport=>1, :"?"=>3, :wireless=>1, :ipod=>1, :network=>1, :set=>3}, :Windows=>{:your=>1, :download=>1, :run=>1, :internet=>1, :busi=>1, :offic=>1, :explor=>1, :todai=>1, :obtain=>1, :live=>1, :updat=>1, :center=>1, :must=>1, :basic=>1, :"."=>3, :get=>1, :for=>1, :later=>1, :microsoft=>2}}, @total_words=35>

うまく行ってますね。ここまではWindowsとUbuntuで両方で確認。

gsl要るの? Edit

上記コマンド(ruby classifier_test.rb) 実行するときに

Notice: for 10x faster LSI support, please install http://rb-gsl.rubyforge.org/

とか言われてる。
LSIサポートで10倍速くなるからrb-gsl入れれ、と。

言われるのが嫌なので、ruby-gslを入れてみる。
Windowsだとgsl入れるにはコンパイルしないといけないので一旦保留。

Ubuntuだと簡単に入るかな?

Ubuntuだとaptitudeのlibgsl-rubyで一発で入りそうな気もするのですが、
なるべくRubyGemsで管理しときたいので、

$ sudo aptitude install libgsl0-dev
 :
$ sudo gem install gsl
Building native extensions.  This could take a while...
Successfully installed gsl-1.12.109
1 gem installed

入った!!

上記コマンド(ruby classifier_test.rb) 実行するときにも確かに文句を言われ亡くなりました。

Windowsだとどうすっかねえ。mingw32でコンパイルできればいいのかもしれないです。

Mecabで日本語対応してみる Edit

こちらを参考にできるだけ楽をしつつmecabを入れてみます→ベイジアンフィルターで日本語を分類する。 - ザリガニが見ていた...。

まずは、Ubuntuで試してみます。

$ sudo aptitude install mecab mecab-ipadic-utf8 libmecab-dev
 :

OK!!

mecabテスト

$ mecab -O wakati
日本語分かち書きできますか?
日本語 分かち書き でき ます か ? 

行けてますね!

続いてmecab-rubyのインストール(RubyGemsであればいいのに…)

$ cd
$ mkdir -p work/mecab-ruby
$ cd work/mecab-ruby/
$ wget http://sourceforge.net/projects/mecab/files/mecab-ruby/0.98/mecab-ruby-0.98.tar.gz/download
$ tar zxfv mecab-ruby-0.98.tar.gz 
$ cd mecab-ruby-0.98
$ ruby extconf.rb
$ make
$ sudo make install

うまく行きました。(上にもありますが、libmecab-devが入ってないとコンパイルが通らないので注意)

テストしてみます。

$ cat > mecab_test.rb <<EOT
\$KCODE = 'u'

require 'rubygems'
require 'MeCab'
wakati = MeCab::Tagger.new('-O wakati')
puts wakati.parse("日本語分かち書きできますか?")
EOT
$ ruby mecab_test.rb 
日本語 分かち書き でき ます か ? 

すげー。Rubyでもちゃんと分かち書きができてますね!
※ $KCODEのところが\$KCODEになっているのは<<EOTで入力するときに$KCODEが消えちゃうから。

あとは、参考元のページ のmecabを利用したサンプルを実行してみる。
(出力がわかりやすいように、ちょっと書き換えてます)

mecab_classifier_test.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!ruby -Ku
$KCODE = 'u'

require 'rubygems'
require 'classifier'
require 'stemmer'
require 'MeCab'

# 分類の設定
bayes = Classifier::Bayes.new('mac', 'windows')
wakati = MeCab::Tagger.new('-O wakati')

# 分類する便利メソッド
def train(bayes, wakati, category, text)
  parsed = wakati.parse(text)
  bayes.train(category, parsed)
  puts "original: #{text}"
  puts "MeCabed: #{parsed}"
  puts 
end

# 分類の学習
train(bayes, wakati, 'mac', 'iPodの設定はどのように変更したら良いですか。')
train(bayes, wakati, 'mac', 'AirPortの無線ネットワークはどうやって設定しますか。')
train(bayes, wakati, 'mac', 'MacOSXのMailはどうやって設定しますか。')
train(bayes, wakati, 'windows', 'Internet Explorer 5以降を実行しておく必要があります。')
train(bayes, wakati, 'windows', 'マイクロソフトダウンロードセンターからアップデートを取できます。')
train(bayes, wakati, 'windows', '今の仕事のためにオフィスライブベーシックを手に入れよう。')

comment = 'この書類を開くにはマイクロソフトオフィスが必要です。'
parsed = wakati.parse(comment)
puts "result original source: #{comment}"
puts "result MeCabed source: #{parsed}"

# 分類データの数値化
puts bayes.classifications(parsed).inspect

# 分類の結果
puts bayes.classify(wakati.parse(comment))

# Bayesオブジェクトの中身
p bayes

実行結果:

$ ruby mecab_classifier_test.rb 
original: iPodの設定はどのように変更したら良いですか。
MeCabed: iPod の 設定 は どの よう に 変更 し たら 良い です か 。 

original: AirPortの無線ネットワークはどうやって設定しますか。
MeCabed: AirPort の 無線 ネットワーク は どう やっ て 設定 し ます か 。 

original: MacOSXのMailはどうやって設定しますか。
MeCabed: MacOSX の Mail は どう やっ て 設定 し ます か 。 

original: Internet Explorer 5以降を実行しておく必要があります。
MeCabed: Internet Explorer 5 以降 を 実行 し て おく 必要 が あり ます 。 

original: マイクロソフトダウンロードセンターからアップデートを取できます。
MeCabed: マイクロソフト ダウンロード センター から アップデート を 取 でき ます 。 

original: 今の仕事のためにオフィスライブベーシックを手に入れよう。
MeCabed: 今 の 仕事 の ため に オフィスライブベーシック を 手 に 入れよ う 。 

result original source: この書類を開くにはマイクロソフトオフィスが必要です。
result MeCabed source: この 書類 を 開く に は マイクロソフト オフィス が 必要 です 。 
{"Mac"=>-60.1861959201719, "Windows"=>-53.9273660615414}
Windows
#<Classifier::Bayes:0xb7c7ad00 @total_words=75, @categories={:Mac=>{:mail=>1, :ipod=>1, :です=>1, :どう=>2, :に=>1, :の=>3, :か=>3, :やっ=>2, :変更=>1, :設定=>3, :。=>3, :て=>2, :し=>3, :airport=>1, :は=>3, :ます=>2, :たら=>1, :無線=>1, :どの=>1, :macosx=>1, :良い=>1, :ネットワーク=>1, :よう=>1}, :Windows=>{:手=>1, :マイクロソフト=>1, :に=>2, :でき=>1, :実行=>1, :の=>2, :入れよ=>1, :ダウンロード=>1, :internet=>1, :今=>1, :おく=>1, :う=>1, :センター=>1, :explor=>1, :。=>3, :仕事=>1, :し=>1, :て=>1, :必要=>1, :から=>1, :ため=>1, :が=>1, :ます=>2, :アップデート=>1, :以降=>1, :オフィスライブベーシック=>1, :あり=>1, :取=>1, :を=>3}}>

行けてますねー、すげー。mecabすごい!!あと元記事の方に感謝したい!
※”オフィスライブ”の分かち書きに失敗してますが、”マイクロソフト”という単語で"Windows"に分類されている気がします…

参考リンク Edit


No comment. Comments/Ruby/ベイジアンフィルタ?

Name:

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2010-01-13 Wed 03:10:53 JST (3259d)