today's research about filters of Opera Mail - extracting japanese messages and... ~ 今日の Opera Mail フィルタのいじり - 日本語メッセージ抽出であれこれ
Friday, 4. July 2008, 11:28:03
えーと、このブログではおそらく Opera Mail に関する愚痴が一番ネタとしては多いと思うんだけど、実は今回もそれ。で、世の中 既にOperaだったら9.51に鳴ってるのは承知しているし、それも既にインストールはしてあるのだけど (9.51RC3) 、まだ全然自分のOperaじゃないので、このネタも相も変わらず 愛用中の Opera9.27 を対象にしてる。とはいえ、今まで試した印象ではこのネタは 9.51 になっても引き続き有効だとは思う。
前置き長いので本題へ。ちと前に Opera Mail で日本語メッセージを抽出するには? みたいなネタを書いたんだけど、そして、正規表現がどうなってるのか判らんと。というか、正規表現は公式ドキュメントにも書かれていて、先日もここでちょっと書いたように、「Ecma Script や Perl に準拠している (らしい)」ってとこまでは判っているだけど、それでも対象となる文書が複数の文字コードで構成される場合にはどのような扱いになるのか判らん…て事と、行とかヘッダとかのパーツの扱いがどうなってるのかも判らん…というところで終わらしてたので、今回この最初の判らんについてちょいとだけ試してみたのでメモしておく事にしたという訳。本題でも前置きが長い。
で、今回試したのは、前述したように日本語メッセージの抽出のネタ。例えば、前回の投稿では (確認して無いので不確かだけど…) 正規表現のメッセージ全体検索で 「[あ-ん]+」 という条件にすれば大抵日本語ならひらがなが混ざっているって事で抽出できるんじゃないか…でもうまくいかんなぁ…。みたいな内容だったと思うけど、これは要点をまとめるとこんな感じになると思う。
上のネタの要点
- Opera Mail で扱うメッセージは多くの文字コードが使われている。
- 日本語だけに限定しても 例えば SJIS,EUC,JIS,Unicode (UTF-8 UTF-16 etc.) のようにかなり乱立している。
- ひとつのメッセージにも各種ヘッダ、本文、添付ファイル(マルチパート)と多数の部分が有り、それぞれに別のコードが存在し得る。
- 上記のような特性のメッセージをひとつの条件で抽出する方法はあれこれあるが Opera Mail フィルタではどうやっているのだろう?
と、思いつく範囲で書くと上記のようになると思う。今回はこれら全部の要素をひっくるめて試すのはあまりにも面倒臭いので、ひとつのメッセージにはひとつの部分しかなく、かつ、ひとつのメッセージにはひとつの文字コードしかない。という風に単純化して考えて試す事にしてみた。それに加えて抽出するメッセージはとりあえず (概ね) 日本語だけになるようにする方法という事にしてみた。それともうひとつ。対象メッセージはニュースフィード (RSSフィード)メッセージに限定した (メールはあんまし来ないからチェックできないし…)。
ここで重要なのは、上記の要点の中の最後のひとつ、つまり、いろんな文字コードがある中で Opera Mail は与えられた抽出条件をどのように処理するのか…って事が一番問題になってくる。この手の方法でパッと思いつく方法を次にあげてみる事にする。
上のネタの方法
- メッセージはひとつのコードしかないと決めつける。伝統を重んじるからコードは全て7bit。日本語はJISに決ってる。他は知らん。
- メッセージはひとつのコードしかないと決めつける。CP/M時代から日本語コードの決定番はSJISに決ってる。他は知らん。
- 日本語何それ? コンピュータはASCII (ANSI)コードで十分。8bitは許すにしても他は知らん。(ここまでややネタ)
- メッセージのコードに従って与えられた抽出条件 (正規表現) を変換して対処する。 やや面倒臭いけどこれくらい当然でしょ。
- メッセージをひとつのコードに変換して与えられた抽出条件を適用して処理する。 時代は Unicode でしょ。javascript/DOMもコレ。
さて、Opera Mail はどの方法を採用したか? さっそく試してみる。が、その前に、前述したように「[あ-ん]+」は通用しなかったんだよなぁ…。て事は駄目な方からチェックした方がイイ? いや、単に正規表現に日本語が使えないだけかもしれない。それなら数値を使えばいいやんか…。
Search count=1 Search Field= メッセージ全体 Search Text= [\u3000-\u3eff]+
コレ、内部 unicode 統一って事が前提な…。時代の先端を行くOperaならやっぱこれでしょ…。
・結果→
それなりにうまく抽出するようだが、あまりにも数が少ない。Operaネタが目立つな。やはり駄目。おそらくunicode (utf-8)なメッセージだけ抽出したのだろう。
という訳で結局駄目な方からチェックする事にした。駄目な方ってのは、上記リストの 3) に近いかな? でも正規表現は確かなものという前提で。つまり、乱立している日本語の文字コードを全て抽出条件として与えてしまおうって事です。
Search count=4 Search Field=メッセージ全体 Search Text=[\u3000-\u3eff]+ Search Option 2=または Search Text 2=([\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc])\1+ Search Field 2=メッセージ全体 Search Option 3=または Search Text 3=([\xa1-\xfe])\1+ Search Field 3=メッセージ全体 Search Option 4=または Search Text 4=\e(\(I|\$[@B]|\$\(D|&\e\$B)([\x21-\x7e])\2+\e\([BJ] Search Field 4=メッセージ全体
これはかなりいい加減だけど、unicodeのCJK領域 または SHIFT-JIS領域 または、EUC領域 または、JIS領域っていう風にすべて並行してチェックするようにした。ていうか、コード判定無い (つまり駄目なやり方) という前提でこうしたわけで…。
・結果→
これはなかなか行けた。Opera Mail での日本語メッセージの抽出方法という意味ではうまく行ったと言っても良いと思う (JISコードの正規表現にはひとつもヒットしなかったけど間違ってるかな?)。でも、例えば 海外の何かしらのコードのメッセージがたまたまどれかに合致する事も有る訳で、そうしたらそれは素通りしてしまう事になる。実際にロシア語のメッセージが多少漏れて抽出されるのが確認できた。それで、最悪なのは、Opera Mail がメッセージのコードを見てそれに応じた条件を適用してくれない事がハッキリした事。当然、前のテストで統一した内部コードに変換している訳ではない事もハッキリしている訳で。そう言う意味じゃあ良いトコひとつもなしの最低って事になるね。ただ、救いは正規表現がちゃんと使えていそうって事くらいかな?
・総評
これ、たぶん Opera9.51 でも変化は無いと思うんだけどどうなんだろ? それは置いておくとして、やっぱりなんとかして欲しいとおもうなぁ…。なんとかするとしたらどこをどうしたらいいだろうか?
- 部分毎の文字コードでそれ専用に変換した抽出条件を適用する
コレ、ハッキリ言って大変だと思う。文字コードがらみでメールの構造を考えるとメチャメチャ複雑だし。与えられた条件を相応しいものに変換といわれても固有の文字だと困る場合も有るだろう (そういうのもそれなりの対処法はあるだろうが…)。
- 内部コードを unicode に統一する。
コレ、一番いいように見えるけど、ニュースフィードはともかく、メールではそうは行かないだろうなぁ。抽出時に一時的に uniocodeに変換するという事も考えられるけど、面倒かもしれない。ただ、メッセージからDOMを作ってしまうという方法なら (XMLではないが…)、別のご利益も有るかもしれない。
- 正規表現を高度にする。unicode regexp ってのがあるけど、更にそれよりも進んだ大抵の文字コードや字種をクラスとして扱えるような正規表現を使う事ができれば他をいじる必要はなくなると思うが、そんな正規表現は少なくとも俺は知らん。
その他にまだチェックしたいのは正規表現の「^」や「$」がどんな風に扱われるのかって事。例えば、メッセージ全体とか言ったら各ヘッダの先頭と末尾に一致するのか、とか、本文の改行に一致するのかとか…。これはおいおいチェックしてみる必要が有るかも?
最後に感想だけど、仮に上記のような方法でそれなりに完全といえる抽出ができるようになったとしても、こんなんじゃあ素人は使えんと俺は思うね。あと、これとはまた全然別の話なんだけど、高速検索用にインデックス作成を動かすのに拘る理由がおれは良く判らんのよな…。この手のフィルタは予め用意しておけば、新着メッセージは到着する度に逐次抽出できる訳だし、バックグラウンドで勝手にCPUリソースを食らう処理をする必要も無いと思うんだよな。そうでなくて既存のメッセージアーカイブから抽出するにしても、プログレスメータなりを出してその間待たされた方が裏でコソコソされるよかナンボもマシだと思うんだよ。特に Opera Mailのようなメッセージマネージャだと、アドレスバーで文字を入力する度にサジェストが出るようなあれこれ凝った芸当を見せる最近のブラウザの流行とも無縁だと思うしね…。
※今後の未定なんだけど、mail ディレクトリにある lexicon.dat ファイルを眺めながら Opera Mail のインデックス作成時の語彙の抽出についてあれこれ愚痴るネタも考え中。以前の考察はやや的外れだった感じが有ったし。でも難しいな。このネタは俺の手には終えないと思う。あと、眺めたのはOpera9.27 だし。






How to use Quote function: