SpamAssassinで学習した文字列をMySQLに記録する

SpamAssassinでは、通常どのような単語がBayesに格納されているかを見ることができません。
内部の処理は検出した文字列をSHA1して下位5バイトをDBに格納しているだけですので、ここから逆に単語へ行き着くことができないです。
よって、DBにInsert、Updateするタイミングで単語も書き出すようにパッチを当てました。
ただし、すべてのInsertと一部のUpdateだけにパッチを入れている(残りは単語を切り出すロジックがなくて、大きく改造しないといけない)ので、途中からこのパッチを適用した場合は完全にDBへ格納されるまでにかなり期間がかかります。
なお、本パッチはSpamAssassin 4.0.1専用です。また、MySQL専用で他のDB出力はサポートしていません。
MySQLへ出力するための設定は他の文献を参照してください。

【パッチを適用するファイル】
/usr/share/perl5/Mail/SpamAssassin/BayesStore/MySQL.pm

【パッチ情報】リンクを右クリックして「名前を付けて保存」してください。
MySQL.pm.patch

【bayes_tokenテーブル】

CREATE TABLE bayes_token (
id int(11) NOT NULL default '0',
token binary(5) NOT NULL default '',
spam_count int(11) NOT NULL default '0',
ham_count int(11) NOT NULL default '0',
atime int(11) NOT NULL default '0',
tokenstring VARCHAR(512) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (id, token),
INDEX bayes_token_idx1 (id, atime)
) ENGINE=InnoDB;

SpamAssassinで学習する文字列をMeCabで賢くする

SpamAssassinの単語切り出し部分にMeCabを入れて、「分かち」の処理を賢くします。
連続する名詞・動詞、接頭語・接尾語などを適切に連結します。
なお、本パッチはSpamAssassin 4.0.1専用です。

【必要なパッケージ】
aptコマンドで下記のパッケージをインストールしてください。

libmecab2
libtext-mecab-perl
libunicode-japanese-perl
mecab
mecab-ipadic
mecab-ipadic-utf8
mecab-utils

私は辞書はunidocのフルセットを入れています。

【パッチを適用するファイル】
/usr/share/perl5/Mail/SpamAssassin/Plugin/Bayes.pm

【パッチ情報】リンクを右クリックして「名前を付けて保存」してください。
Bayes.pm.patch

【設定方法】
/etc/spamassassin/local.cf に下記を追加します。
bayes_max_token_length 300
300は検出した文字列の最大文字(バイト数)で、デフォルトは15(日本語文字では5文字分)ですので、適時見直しをしてください。

2024.12.01
メールアドレスとURLを別で検出するようにしました。
文字列の区切りを半角スペースだけでチェックしていたのをもう少し賢くしました。

2024.12.06
郵便番号を別で検出するようにしました。

2024.12.14
電話番号を別で検出するようにしました。
通貨を別で検出するようにしました。
年月日を別で検出するようにしました。
パーセンテージを別で検出するようにしました。
文中の全角記号、全角英文字、全角数字を半角で扱うようにしました。