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
精度があがればいいな。。。。