Forums: users (Thread #32772)

Ruby 1.9のサポートについて (2012-09-09 17:14 by 上総 #65446)

はじめまして、bsfilterを愛用させていただいています。

現在bsfilter 1.0.17をRuby 1.8.7で利用していますが、試しにRuby 1.9.3-p194で動かしてみたところ、エラーメッセージが出て正常に動きませんでした。
そこで質問なのですが、Ruby 1.9に対応したbsfilterをリリースする予定はありますでしょうか。

以上の件、よろしくご回答願います。

Reply to #65446×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2012-09-10 00:24 by nabeken #65452)

Ruby 1.9で動かないという報告を頂いたことがあり、以下のreivision 1.86.2.4あたりで対応を進めています。
http://sourceforge.jp/cvs/view/bsfilter/bsfilter/bsfilter?revision=1.86.2.4&view=co

Ruby 1.8, 1.9両方で動くコードになっていないので、どのようにリリースしようか迷っているところです。
Reply to #65446

Reply to #65452×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-09-28 13:19 by kazusaoda #70307)

Ruby 1.8が6月末でEoLになってからもうすく3ヶ月となります。
また最新のrc版である1.0.18.ruby1.9.rc5に対するバグ修正も既にいくつか存在します。
以上の点を鑑みて、Ruby 1.9以降をサポートしたbsfilter 1.0.18正式版のリリースを考慮して頂けないでしょうか。

よろしくお願いいたします。
Reply to #65452

Reply to #70307×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-11-03 18:04 by nabeken #70668)

OS X Mavericks の Rubyも 2.0.0 になりましたので
1.0.18 をリリースしました
Reply to #70307

Reply to #70668×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-11-03 19:01 by kazusaoda #70670)

早速bsfilter-1.0.18.tgzをダウンロードして試してみたのですが、このアーカイブに納められたbsfilterはRuby 1.9以降に対応していないバージョン(CVSリポジトリの1.86)になってしまっているようです。

kazusa@freebsd[68]% grep Id: bsfilter-1.0.18/bsfilter/bsfilter
## -*-Ruby-*- $Id: bsfilter,v 1.86 2010/11/20 10:07:45 nabeken Exp $
kazusa@freebsd[69]%

お手数をお掛けしますがよろしくご対応願います。
Reply to #70668

Reply to #70670×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-11-03 19:36 by nabeken #70671)

申し訳ありません。
1.0.19を出し直しました。
中身は reivision 1.87 です。
Reply to #70670

Reply to #70671×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-11-04 07:36 by kazusaoda #70678)

1.0.19とRuby 1.9.3p448の組み合わせで無事動作することを確認しました。
素早いご対応ありがとうございました。
Reply to #70671

Reply to #70678×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2012-09-10 16:52 by 上総 #65459)

了解です。
ご回答ありがとうございました。
Reply to #65446

Reply to #65459×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2012-09-16 10:16 by nabeken #65521)

中身のコードは revisin 1.86.2.4 のままですが、
1.0.18.ruby1.9.rc1
としてアーカイブしました。

http://sourceforge.jp/projects/bsfilter/releases/
Reply to #65459

Reply to #65521×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-01-11 18:59 by kazusaoda #66937)

遅ればせながら1.0.18.ruby1.9.rc1を試してみたのですが、日本語のメールを食わせると以下のようなエラーが発生します。

kazusa@host01[39]% cat ~/.bsfilter/bsfilter.conf
jtokenizer MeCab
db gdbm
kazusa@host01[40]% bsfilter tmp/test-message.jpn.txt
/usr/local/bin/bsfilter:1105:in `=~': incompatible encoding regexp match (EUC-JP regexp with ASCII-8BIT string) (Encoding::CompatibilityError)
from /usr/local/bin/bsfilter:1105:in `mecab'
from /usr/local/bin/bsfilter:1043:in `block in initialize'
from /usr/local/bin/bsfilter:1060:in `call'
from /usr/local/bin/bsfilter:1060:in `split'
from /usr/local/bin/bsfilter:1384:in `block in tokenize_str'
from /usr/local/bin/bsfilter:1383:in `each'
from /usr/local/bin/bsfilter:1383:in `tokenize_str'
from /usr/local/bin/bsfilter:1547:in `tokenize_body'
from /usr/local/bin/bsfilter:1260:in `tokenize_buf'
from /usr/local/bin/bsfilter:3404:in `block (2 levels) in run'
from /usr/local/bin/bsfilter:330:in `open_ro'
from /usr/local/bin/bsfilter:3400:in `block in run'
from /usr/local/bin/bsfilter:3399:in `each'
from /usr/local/bin/bsfilter:3399:in `run'
from /usr/local/bin/bsfilter:3445:in `<main>'
kazusa@host01[41]%

入力メールの内容を変えたり~/.bsfilter/の下にある学習結果のファイルを削除したりしてみましたが、結果は変わりませんでした。
bsfilter.confのjtokenizerの設定をコメントアウトすると正常終了します。

環境は以下の通りです。

FreeBSD 9.1-RELEASE (amd64)
Ruby 1.9.3-p327
GDBM 1.9.1
mecab 0.994
mecab-ruby 0.994
mecab-ipadic 2.7.0-20070801
Reply to #65521

Reply to #66937×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-01-14 14:07 by nabeken #66965)

mecabを使ったケースに対応していなかったので、1.0.18.ruby1.9.rc2で修正しました。
chasenはまだダメだと思います。
Reply to #65446

Reply to #66965×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-01-14 16:59 by kazusaoda #66968)

素早い対応をありがとうございます。1.0.18.ruby1.9.rc2で#66937の問題が発生しなくなったことを確認しました。

で、修正して頂いたばかりで申し訳ないのですが、次の問題が見つかってしまいました。
--pipeオプションを指定してstdoutに出力させると、Kernel.pに要素がStringであるようなArrayを引数として渡したときのような結果が出力されます。
rc1でも英語のメールを食わせると同じ結果となります。

bsfilter以外の環境は#66937でかいたのと同じです。度々で申し訳ありませんが、よろしくご対応願います。
Reply to #66965

Reply to #66968×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-01-14 23:33 by nabeken #66974)

--pipe について 1.0.18.ruby1.9.rc3で修正しました。
ruby1.9でArrayをto_sしたときの挙動が変わったようでした。

Reply to #66968

Reply to #66974×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-01-15 00:28 by kazusaoda #66975)

素早い対応をありがとうございます。1.0.18.ruby1.9.rc3で#66968の問題が解決したことを確認しました。
Reply to #66974

Reply to #66975×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-02-01 15:56 by kazusaoda #67216)

MeCabを0.995にしたところ、日本語のメールを食わせた際に以下のようなエラー
が発生するようになってしまいました。

kazusa@host01[14]% cat ~/.bsfilter/bsfilter.conf
jtokenizer MeCab
db gdbm
kazusa@host01[15]% bsfilter spam.jpn.01.txt
/usr/local/bin/bsfilter:1102:in `split': invalid byte sequence in UTF-8 (ArgumentError)
from /usr/local/bin/bsfilter:1102:in `mecab'
from /usr/local/bin/bsfilter:1043:in `block in initialize'
from /usr/local/bin/bsfilter:1060:in `call'
from /usr/local/bin/bsfilter:1060:in `split'
from /usr/local/bin/bsfilter:1223:in `block in tokenize_headers'
from /usr/local/bin/bsfilter:1197:in `each'
from /usr/local/bin/bsfilter:1197:in `tokenize_headers'
from /usr/local/bin/bsfilter:1251:in `tokenize_buf'
from /usr/local/bin/bsfilter:3408:in `block (2 levels) in run'
from /usr/local/bin/bsfilter:330:in `open_ro'
from /usr/local/bin/bsfilter:3404:in `block in run'
from /usr/local/bin/bsfilter:3403:in `each'
from /usr/local/bin/bsfilter:3403:in `run'
from /usr/local/bin/bsfilter:3449:in `<main>'
kazusa@host01[16]%

環境は以下の通りです。

FreeBSD 9.1-RELEASE (amd64)
Ruby 1.9.3-p327
GDBM 1.9.1
mecab 0.995
mecab-ruby 0.995
mecab-ipadic 2.7.0-20070801

度々で申し訳ありませんが、よろしくご対応願います。
Reply to #66975

Reply to #67216×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-02-03 03:13 by nabeken #67232)

mac ports でも 同様のエラーが発生するようになりましたので、
1.0.18.ruby1.9.rc4
で対策したつもりです。
Reply to #67216

Reply to #67232×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-02-03 08:55 by kazusaoda #67233)

ご対応ありがとうございます。1.0.18.ruby1.9.rc4で#67216の問題が発生しなくなったことを確認しました。
Reply to #67232

Reply to #67233×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-03-01 15:00 by ykasahara #67535)

横からすみません、1.0.18.ruby1.9.rc4 を試しているのですが、mecab で名詞以外の品詞処理の部分で文字化けが発生します。

Reg_not_kanji_katakana なのですが、ASCII-8BIT だと1バイトずつ見るのでこの正規表現では意図した文字にマッチしないのではないでしょうか?

こちらではたまたま「☆」という文字が化けることに気づきました。0xa1f9 なので 0xf9 だけが gsub! で取り除かれていました。
Reply to #67232

Reply to #67535×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-03-01 16:57 by ykasahara #67536)

続けてすみません。1.8 用で作った DB を流用すると確率がおかしいので調べたのですが、
日本語の単語を DB からほとんど引けていませんでした。
token を ASCII-8BIT にしないとマッチしないようです。

また 1.9 用で出力された DB は日本語部分がほぼ UTF-8 になっていました。
EUC に変換後 force_encoding('ASCII-8BIT') を通った token は EUC コード、
通らなかった token は UTF-8 で出力されているものと推測します。

Jtokenizer で token を常に ASCII-8BIT で戻すようにすれば
互換性は保たれそうな気がします。
Reply to #67535

Reply to #67536×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-03-10 03:12 by nabeken #67610)

アドバイスありがとうございます。
1.0.18.ruby1.9.rc5
で対策したつもりです。
Reply to #67536

Reply to #67610×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-03-13 11:20 by ykasahara #67665)

対応ありがとうございます。試した感じでは判定ミスや文字化けは解消したみたいです。

前の記事を投稿してから思ったのですが、ruby スクリプトでファイル入出力時の文字コードが
明示的に指定されていないので、入出力がこちらの環境での LANG=ja_JP.UTF-8 に引っ張られた
気がします。詳しく検討していませんが、force_encoding で自力でがんばるのではなくて、
外部エンコーディングと内部エンコーディングを明示的に EUC-JP に指定するなどすれば
force_encoding を減らせそうな気がします。

ご検討よろしくお願いします。
Reply to #67610

Reply to #67665×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-04 10:07 by kazusaoda #69383)

いつ頃からか判らないのですが、1.0.18.ruby1.9.rc5に

(1) 文字コードがASCII以外である
(2) 内容がSpam判定されるものである

という条件を満たすメールを食わせると、以下のようなエラーが発生するよう
になりました。

kazusa@host01[14]% cat ~/.bsfilter/bsfilter.conf
jtokenizer MeCab
db gdbm
kazusa@host01[15]% bsfilter spam.jpn.01.txt
/usr/local/bin/bsfilter:937:in `=~': invalid byte sequence in UTF-8 (ArgumentError)
from /usr/local/bin/bsfilter:937:in `block in get_lang'
from /usr/local/bin/bsfilter:929:in `each'
from /usr/local/bin/bsfilter:929:in `get_lang'
from /usr/local/bin/bsfilter:908:in `get_lang_from_buf'
from /usr/local/bin/bsfilter:1464:in `tokenize_body'
from /usr/local/bin/bsfilter:1265:in `tokenize_buf'
from /usr/local/bin/bsfilter:3410:in `block (2 levels) in run'
from /usr/local/bin/bsfilter:330:in `open_ro'
from /usr/local/bin/bsfilter:3406:in `block in run'
from /usr/local/bin/bsfilter:3405:in `each'
from /usr/local/bin/bsfilter:3405:in `run'
from /usr/local/bin/bsfilter:3451:in `<main>'
kazusau@host01[16]%

環境は以下の通りです。

FreeBSD 9.1-RELEASE (amd64)
Ruby 1.9.3-p429
GDBM 1.10
mecab 0.996
mecab-ruby 0.996
mecab-ipadic 2.7.0-20070801

度々で申し訳ありませんが、よろしくご対応願います。
Reply to #65446

Reply to #69383×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-06 02:39 by 森田昭夫 #69410)

> いつ頃からか判らないのですが、1.0.18.ruby1.9.rc5に
>
> (1) 文字コードがASCII以外である
> (2) 内容がSpam判定されるものである
>
> という条件を満たすメールを食わせると、以下のようなエラーが発生するよう
> になりました。
>
> kazusa@host01[14]% cat ~/.bsfilter/bsfilter.conf
> jtokenizer MeCab
> db gdbm
> kazusa@host01[15]% bsfilter spam.jpn.01.txt
> /usr/local/bin/bsfilter:937:in `=~': invalid byte sequence in UTF-8 (ArgumentError)
> from /usr/local/bin/bsfilter:937:in `block in get_lang'
> from /usr/local/bin/bsfilter:929:in `each'
> from /usr/local/bin/bsfilter:929:in `get_lang'
> from /usr/local/bin/bsfilter:908:in `get_lang_from_buf'
> from /usr/local/bin/bsfilter:1464:in `tokenize_body'
> from /usr/local/bin/bsfilter:1265:in `tokenize_buf'
> from /usr/local/bin/bsfilter:3410:in `block (2 levels) in run'
> from /usr/local/bin/bsfilter:330:in `open_ro'
> from /usr/local/bin/bsfilter:3406:in `block in run'
> from /usr/local/bin/bsfilter:3405:in `each'
> from /usr/local/bin/bsfilter:3405:in `run'
> from /usr/local/bin/bsfilter:3451:in `<main>'
> kazusau@host01[16]%
>
> 環境は以下の通りです。
>
> FreeBSD 9.1-RELEASE (amd64)
> Ruby 1.9.3-p429
> GDBM 1.10
> mecab 0.996
> mecab-ruby 0.996
> mecab-ipadic 2.7.0-20070801
>
> 度々で申し訳ありませんが、よろしくご対応願います。
>
最近、bsfilter-1.0.18.ruby1.9.rc5 + ruby-1.9.3/FreeBSD 9-STABLEを運用し始めて、同様の問題に遭遇しローカルパッチを当てている者でが、
get_langで使っているString.encode('UTF-8', 'UTF-8')でStringの持つinvelid byte sequenceの内部フラグをクリアする
rubyのバグに依存したハックが rubyのアップデートで無効に成ったのではないかと推察します
# encode(x, x)で invalid byte sequenceの内部フラグが「誤ってクリア」されるのは、古いrubyの既知のバグの模様です

なので、手元の環境では次の2つの対策をとっています
1. strを dupで複製し、複製した strに force_encodingを適用後、正規表現と照合前に valid_encoding?で確認する
2. get_langを呼び出している get_lang_from_bufにて Encoding::InvalidByteSequenceErrorと Encoding::UndefinedConversionErrorを rescueする

また、mecabの動作を調べた範囲では、mecabが返す nodeの surfaceと featureに入っている Stringの encodingは
Encoding::default_externalなのですが、バイト列自体は mecabの辞書のコーディングに依存しているようで、
FreeBSDのports/japanese/mecab-ipdicなどでは、標準のEUC-JP以外に SHIFT-JISや UTF-8な場合があり
mecab()内部で token/hinshi処理中にエラーになるケースがあります
(例えば、FreeBSDの場合、japanese/p5-Mail-SpamAssassinなどは、UTF-8な MeCab辞書を要求する)
これについては、手元の環境では
1. MeCab初期化時に、US-ASCIIなStringを字句解析し、node.next.surfaceのバイト列から辞書のエンコーディングを検知する
2. MeCabに渡す前に bsfilterの内部エンコーディング(EUC-JP)から MeCab辞書のエンコーディングへ変換する
(EUC-JP的に不正なバイト列が渡ってくることもあるので、:invalid -> :replace, :undef => :replace, :replace => ' 'をつけてます)
3. MeCabから戻ってきた文字列は、MeCab辞書のエンコーディングから EUC-JPへ変換する

後は、bsfilter-1.0.17との挙動の違いに関する雑多な修正として、mecab()内で token.length > 2という条件を token.bytesize > 2へ置換してます
(ruby 1.8だとlengthは byte数を返しますが、ruby 1.9以降はエンコーディング依存(ここでは、EUC-JP)な文字数を返します)

上記、3種の修正を行う泥臭いパッチは以下の通り
--- bsfilter/bsfilter.orig 2013-03-10 03:02:38.000000000 +0900
+++ bsfilter/bsfilter 2013-07-05 23:44:28.833162221 +0900
@@ -905,7 +905,11 @@
end

def get_lang_from_buf(buf, html_flag)
- return get_lang(buf, html_flag)
+ begin
+ return get_lang(buf, html_flag)
+ rescue Encoding::InvalidByteSequenceError, Encoding::UndefinedConversionError
+ return [nil, nil]
+ end
end

def get_lang(buf, html_flag=false)
@@ -930,20 +934,22 @@
if (html_flag)
str = decode_character_reference2u(str)
end
+ # Duplicate str for force_encoding
+ str = str.dup
if (str.force_encoding('ASCII-8BIT') =~ reg_gb18030_possible)
gb18030_possible = true
end

- if (str.encode('UTF-8', 'UTF-8') =~ reg_utf8)
+ if (str.force_encoding('UTF-8').valid_encoding? && str =~ reg_utf8)
@options["message-fh"].printf("lang ja utf8\n") if (@options["debug"])
return ["ja", "utf8"]
elsif (str.force_encoding('ASCII-8BIT') =~ reg_jis)
@options["message-fh"].printf("lang ja jis\n") if (@options["debug"])
return ["ja", "jis"]
- elsif (str.encode('SHIFT_JIS', 'SHIFT_JIS') =~ reg_sjis)
+ elsif (str.force_encoding('SHIFT_JIS').valid_encoding? && str =~ reg_sjis)
@options["message-fh"].printf("lang ja sjis\n") if (@options["debug"])
return ["ja", "sjis"]
- elsif (str.encode('EUC-JP', 'EUC-JP') =~ reg_euc)
+ elsif (str.force_encoding('EUC-JP').valid_encoding? && str =~ reg_euc)
if (gb18030_possible)
@options["message-fh"].printf("lang ja gb18030\n") if (@options["debug"])
return ["ja", "gb18030"]
@@ -1041,10 +1047,28 @@
@method = Proc::new {|s| block(s)}
when "mecab"
@method = Proc::new {|s| mecab(s)}
+ meishi_euc = "\xcc\xbe\xbb\xec".force_encoding('ASCII-8BIT')
+ meishi_sjis = meishi_euc.encode('SHIFT_JIS', 'EUC-JP').force_encoding('ASCII-8BIT')
+ meishi_utf8 = meishi_euc.encode('UTF-8', 'EUC-JP').force_encoding('ASCII-8BIT')
+
if (defined?(MeCab::VERSION)) # defined after 0.90
@m = MeCab::Tagger.new("-Ochasen")
+ node = @m.parseToNode('this is a pen')
+ hinshi = node.next.feature.force_encoding('ASCII-8BIT').split(/,/)[0]
else
@m = MeCab::Tagger.new([$0, "-Ochasen"])
+ node = @m.parseToNode('this is a pen')
+ hinshi = node.next.getFeature.force_encoding('ASCII-8BIT').split(/,/)[0]
+ end
+ case hinshi
+ when meishi_euc
+ @m_dic_enc = Encoding::EUC_JP
+ when meishi_sjis
+ @m_dic_enc = Encoding::SHIFT_JIS
+ when meishi_utf8
+ @m_dic_enc = Encoding::UTF_8
+ else
+ @m_dic_enc = Encoding::default_external
end
when "chasen"
Chasen.getopt("-F", '%H %m\n', "-j")
@@ -1089,8 +1113,9 @@
end

def mecab(str)
+ str = str.encode(@m_dic_enc, :invalid => :replace, :undef => :replace, :replace => ' ')
str = str.gsub(/[\x00-\x7f]/, ' ')
- if (str =~ /\A +\z/)
+ if (str.length == 0 || str =~ /\A +\z/)
return []
end
array = Array::new
@@ -1098,21 +1123,34 @@
while (node &&
(defined?(MeCab::VERSION) || (node.hasNode == 1)))
if defined?(MeCab::VERSION)
- token = node.surface.force_encoding('EUC-JP')
- hinshi = node.feature.force_encoding('EUC-JP').split(/,/)[0]
+ token = node.surface.encode('EUC-JP', @m_dic_enc)
+ hinshi = node.feature.encode('EUC-JP', @m_dic_enc).split(/,/)[0]
else
- token = node.getSurface
- hinshi = node.getFeature.split(/,/)[0]
+ token = node.getSurface.encode('EUC-JP', @m_dic_enc)
+ hinshi = node.getFeature.encode('EUC-JP', @m_dic_enc).split(/,/)[0]
end
- if (hinshi == "\xcc\xbe\xbb\xec".force_encoding('EUC-JP'))
- if ((token.force_encoding('EUC-JP') =~ Reg_kanji_katakana) || (token.length > 2))
+ unless (token.valid_encoding?)
+ # Scrub token
+ token = token.each_char.map { |c| (c.valid_encoding?) ? c : "" }.join
+ end
+ case hinshi
+
+ when "BOS/EOS"
+ # Skip BOS/EOS
+
+ when "\xb5\xad\xb9\xe6".force_encoding('EUC-JP')
+ # Skip KIGOU
+
+ when "\xcc\xbe\xbb\xec".force_encoding('EUC-JP')
+ # MEISHI
+ if ((token =~ Reg_kanji_katakana) || (token.bytesize > 2))
array.push(token)
end
+
else
- token.force_encoding('EUC-JP').gsub!(Reg_not_kanji_katakana, '')
- if ((token.force_encoding('EUC-JP') =~ Reg_kanji) || (token.length > 2))
+ token.gsub!(Reg_not_kanji_katakana, '')
+ if ((token =~ Reg_kanji) || (token.bytesize > 2))
array.push(token)
- else
end
end
node = node.next
Reply to #69383

Reply to #69410×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-06 16:44 by kazusaoda #69412)

フォローありがとうございます。早速パッチを適用してみたところ、これまでエラーになっていたメールが正常に処理されるようになりました。
Reply to #69410

Reply to #69412×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-10 15:48 by ykasahara #69458)

パッチを使わせていただこうと思い、別件で自分でもいろいろ試していて壊れたデータベースを
作りなおすために古い spam を食わせていたところ、以下のエラーに遭遇しました。
(別のローカルパッチが入っているので行番号はずれていると思います、すみません)

/usr/local/bin/bsfilter:1403:in `scan': invalid byte sequence in EUC-JP (ArgumentError)
from /usr/local/bin/bsfilter:1403:in `tokenize_str'
from /usr/local/bin/bsfilter:1591:in `tokenize_body'
from /usr/local/bin/bsfilter:1303:in `tokenize_buf'
from /usr/local/bin/bsfilter:3464:in `block (2 levels) in run'
from /usr/local/bin/bsfilter:330:in `open_ro'
from /usr/local/bin/bsfilter:3460:in `block in run'
from /usr/local/bin/bsfilter:3459:in `each'
from /usr/local/bin/bsfilter:3459:in `run'
from /usr/local/bin/bsfilter:3505:in `<main>'

元メールを見ると sjis なのですが少し壊れていて変なコードが混ざっており、
get_lang では正しく sjis と判定するものの tokenize_body の NKF での
EUC 変換時に invalid な文字列を吐いていました(str.valid_encoding? してみると false)。

NKF だけでサニタイズする方法が不明だったので周りくどいですが

str = NKF::nkf('-w -X -Z0', str).encode('EUC-JP', 'UTF-8', :undef => :replace, :invalid => :replace)

みたいにしてみたのですが、もっとうまい方法あるでしょうか…。
Reply to #69410

Reply to #69458×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-10 16:47 by 森田昭夫 #69463)

手元の改造版では、Stringを each_charで分解して、valid_encoding?が真となる部分列だけを joinしてます
# Ruby 2.0には、scrub methodが用意されるらしいですが、1.9には有りませんので

例えば、tokenize_str向けだと
@@ -1362,6 +1423,10 @@
reg_token2 = Regexp::compile('\b\d[\d\.]+\d\b|[\w%]+')
reg_noret = Regexp::compile('[\r\n]*\z')

+ unless (str.valid_encoding?)
+ # Scrub str
+ str = str.each_char.map { |c| (c.valid_encoding?) ? c : "" }.join
+ end
str.scan(reg_token).each do |token|
if (token =~ reg_url)
token.scan(reg_token2).each do |token2|

同様の問題が出る箇所としては、tokenize_headersのcontent.scan(reg_token).eachが有ります

tokenize_headerに関しては、MIMEデコードまわりの問題として
1. unpack().to_sでは、戻り値がString型にならないので unpack().joinへ
(多分、Ruby 1.9での to_s methodの仕様変更が原因かと)
2. ヘッダーがUTF-8な MIMEエンコードのみを含む場合、latin2asciiでハンドリングされる(特にBASE64なUTF-8エンコードなSubject)ため
ヘッダーから抽出されるトークンがMIMEエンコードを切り出した記号列になる
手元では、UTF-8なMIMEは、デコードして EUC-JPに変換(invalidと undefは replaceする)してます
Reply to #69458

Reply to #69463×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-15 03:51 by nabeken #69501)

症状は確認していないのですが、1.86.2.10へマージさせていただきました。
Reply to #69463

Reply to #69501×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-15 03:49 by nabeken #69500)

デバッグありがとうございます。

String.encode('UTF-8', 'UTF-8')等に動作が変わった件については、
revision 1.86.2.9 で 一旦、UTF-16BE を経由するようにして、姑息な対応をしていました。
mecabのコーディングについては、コードを頂いて、1.86.2.10 でマージしました。
Reply to #69410

Reply to #69500×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-09 18:54 by 森田昭夫 #69449)

bsfilter 1.0.18rc5 on ruby-1.9.3にて quoted-printableのデコード失敗に対するパッチです

エラーは出ませんが、quoted-printableな本文で文字コードの検出失敗およびトークン化に失敗するので判定ミスを誘発します

unpackの戻り値はString型のArrayなので、String型のArrayである bufをデコードした結果はString型のArrayのArrayになりますが、
bufの期待される型は String型のArrayです
# base64の場合は、最初の joinでできたString型にunpackを作用させているので、String型のArrayが返るため正しい動作となっています

--- /usr/local/bin/bsfilter 2013-07-08 11:39:45.324515549 +0900
+++ bin/bsfilter 2013-07-09 18:45:33.052515889 +0900
@@ -1500,7 +1500,7 @@
buf = buf.join.gsub(/[\r\n]/, '').unpack("m*")
end
when /quoted-printable/i
- buf.map! {|str| str.unpack("M*").to_s}
+ buf.map! {|str| str.unpack("M*").join}
end

lang_backup = lang
Reply to #65446

Reply to #69449×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: Ruby 1.9のサポートについて (2013-07-15 03:53 by nabeken #69502)

1.86.2.10へマージさせていただきました。
Reply to #69449

Reply to #69502×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login