SpamAssassinのインストール(yumは使わない)

yumでインストールしたSpamAssassinの精度がとても悪い
私宛に来るスパムが特殊なのかSpamAssassinのインストールに問題があるのかを切り分けるため日本語対応パッチを適用したSpamAssassinをインストールする事にしました。
追記:2010/11/26 精度が悪いのは、local.cfのrequired_scoreが13だったからだ5に変更すると精度が一気にあがった。はずかしい。。。
追記:2010/11/30 推奨は/home/hoge/.spamassasin/user_prefsを修正する方が良いみたいです
SpamAssassin本家を確認すると現時点での最新版は、3.3.1の様ですが日本SpamAssassinユーザ会を確認すると、日本語化パッチが対応しているのは、3.2.5が最新の様なので今回はこれをインストールする事にします。

1.現在yumでインストールされているSpamAssassinを削除します。

# yum remove spamassassin

2. 必須ライブラリのインストール

2.1 libiconv

インストール済みか確認する。

# /usr/local/bin/iconv -l | grep -i EUCJP-MS
EUC-JP-MS EUCJP-MS EUCJP-OPEN EUCJP-WIN EUCJPMS

EUC-JP-MSなどが表示されなければ未インストールとの事
あと、念のため以下を実行し認識しているか確認します。

# ldconfig -v | grep libiconv
ldconfig: Path `/usr/lib/mysql' given more than once
        libiconv.so.2 -> libiconv.so.2.5.0

もし、結果にlibiconvなどが出力されない場合は、以下を実行し、再度認識されるか確認してください。
認識していないと次のmecabのインストールに失敗します。

# vi /etc/ld.so.conf
# /usr/local/lib <span style="color:#FF0000;"><-この行を追加</span>
# ldconfig

今回は、すでにインストール済みでしたのでインストール方法は割愛します。

2.2 mecab

インストール済みか確認する。

# mecab
-bash: mecab: command not found

入っていないのでインストールします。

# mkdir /tmp/mecab
# cd /tmp/mecab
# wget http://downloads.sourceforge.net/project/mecab/mecab/0.98/mecab-0.98.tar.gz
# tar zxvf mecab-0.98.tar.gz
# cd mecab-0.98
# cd src
src/mecab.hの以下の箇所の括弧をはずす[http://rally.jp/comp/archives/2010/04/_spamassassin_325.php:title=参考]
# vi mecab.h
------------------
#define MECAB_NOR_NODE  0
#define MECAB_UNK_NODE  1
#define MECAB_BOS_NODE  2
#define MECAB_EOS_NODE  3
#define MECAB_EON_NODE  4

#define MECAB_USR_DIC   1
#define MECAB_SYS_DIC   0
#define MECAB_UNK_DIC   2
------------------
# cd ..
# ./configure --with-charset=utf-8 --with-libiconv-prefix=/usr/local LDFLAGS='-L/usr/local/lib -liconv'
# make
# make install

次にmecabが使う辞書をインストールします

# mkdir /tmp/mecab_dic
# cd /tmp/mecab_dic
# wget http://downloads.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz
# tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
# cd mecab-ipadic-2.7.0-20070801
char.defを開き、ASCIIの箇所を以下のように修正します。
------------------
# ASCII
#0x0021..0x002F SYMBOL
#0x0030..0x0039 NUMERIC
#0x003A..0x0040 SYMBOL
#0x0041..0x005A ALPHA
#0x005B..0x0060 SYMBOL
#0x0061..0x007A ALPHA
#0x007B..0x007E SYMBOL
0x0021..0x002F ALPHA
0x0030..0x0039 ALPHA
0x003A..0x0040 ALPHA
0x0041..0x005A ALPHA
0x005B..0x0060 ALPHA
0x0061..0x007A ALPHA
0x007B..0x007E ALPHA
------------------
# ./configure --with-charset=utf-8
# make
# make install
テストをしてみます
# mecab
私は、みかんが好きです
私      名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
、      記号,読点,*,*,*,*,、,、,、
みかん  名詞,一般,*,*,*,*,みかん,ミカン,ミカン
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
好き    名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS
2.3 Text::Mecab

インストール済みか確認する。

# find `perl -e 'print "@INC"'` -name '*Mecab.pm' -print

インストールされていないのでインストールします

# which mecab-config
/usr/local/bin/mecab-config
依存関係でいろいろ怒られたので以下の順序でインストールしました。
# cpan -i File::Spec
# cpan -i IO::CaptureOutput
# cpan -i Devel::CheckLib
# cpan -i Test::Requires
# cpan -i XSLoader
# cpan -i ExtUtils::CBuilder
# cpan -i ExtUtils::ParseXS
# cpan -i Devel::PPPort
# cpan -i Class::Accessor::Fast
# cpan -i Text::MeCab
  Path to mecab config? [/usr/local/bin/mecab-config] <Enter>
  Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp] utf-8
2.4 Encode::Detect

これもcpanでインストールしようとするといろいろ怒られるので依存関係を意識しながら慎重にインストール

# cpan -i Test::Harness
# cpan -i Module::Build
# cpan -i PAR::Dist
# cpan -i Encode::Detect

これで必須ライブラリのインストールは終わりです。。。

3. 必須ライブラリのインストール

3.1 SpamAssassin本体のダウンロード

Mail-SpamAssassin-3.2.5をダウンロードします

# mkdir /tmp/spamassassin
# cd /tmp/spamassassin
# wget http://archive.apache.org/dist/spamassassin/Mail-SpamAssassin-3.2.5.tar.gz
# tar zxvf Mail-SpamAssassin-3.2.5.tar.gz
3.2 日本語化パッチのダウンロード
# cd Mail-SpamAssassin-3.2.5
# wget http://spamassassin.jp/download/sa3.2/spamassassin-3.2.5-ja-test1.patch
# patch -p1 < spamassassin-3.2.5-ja-test1.patch
3.3 インストール
# perl Makefile.PL
  default text: [the administrator of that system]postmaster@example.com
# make
# make install
3.4 設定

/etc/mail/spamassassin/local.cfに以下を追記します

required_score 5.0 <=コメントを外す
bayes_auto_learn 1 <=コメントを外す
以下追記
bayes_path /var/spool/spamassassin/bayes
bayes_file_mode 0644

auto_whitelist_path /var/spool/spamassassin/auto-whitelist
auto_whitelist_file_mode 0644

normalize_charset 1
report_safe 0

/etc/mail/spamassassin/tokennizer.preを作成し以下を追加します

# Tokennizer::MeCab
#
loadplugin Mail::SpamAssassin::Plugin::Tokenizer::MeCab

/etc/mail/spamassassin/site_score.cfを作成し以下を追加します

score SUBJECT_EXCESS_BASE64 0
score WEIRD_QUOTING 0
score FROM_EXCESS_BASE64 0
score GAPPY_SUBJECT 0
score SUBJECT_ENCODED_TWICE 0
score SUBJ_ILLEGAL_CHARS 0
score HTML_COMMENT_8BITS 0
score OBFUSCATING_COMMENT 0
score UPPERCASE_25_50 0
score UPPERCASE_50_75 0
score OBSCURED_EMAIL 0

spamassassin --lintを実行しエラーが出なければOKです

MTAとの連携はすでに設定済みなので割愛します

4. 微調整

4.1 学習をさせたらエラーになる件
/usr/bin/sa-learn --spam /home/*/Maildir/.Spam/cur

を実行すると以下のエラーがたくさん出るのでここを参考に該当のMeCab.pmを修正

Use of uninitialized value in join or string at /usr/lib/perl5/site_perl/5.8.8/Mail/SpamAssassin/Plugin/Tokenizer/MeCab.pm line 75.

バックアップを取る

cp /usr/lib/perl5/site_perl/5.8.8/Mail/SpamAssassin/Plugin/Tokenizer/MeCab.pm /usr/lib/perl5/site_perl/5.8.8/Mail/SpamAssassin/Plugin/Tokenizer/MeCab.pm.bk

読み取り属性なので書き込めるように属性を変更

chmod 777 /usr/lib/perl5/site_perl/5.8.8/Mail/SpamAssassin/Plugin/Tokenizer/MeCab.pm

ソースを変更

vi /usr/lib/perl5/site_perl/5.8.8/Mail/SpamAssassin/Plugin/Tokenizer/MeCab.pm

変更前

  my @buf;
  for (my $node = $mecab->parse($text); $node; $node = $node->next) {
    push(@buf, $node->surface);
  }

変更後

  my @buf;
  for (my $node = $mecab->parse($text); $node; $node = $node->next) {
#      push(@buf, $node->surface);
    if ( defined $node->surface) {
      push(@buf, $node->surface);
    }
  }

読み取り属性に戻す

chmod 444 /usr/lib/perl5/site_perl/5.8.8/Mail/SpamAssassin/Plugin/Tokenizer/MeCab.pm

精度があがればいいな。。。。