Hatena::ブログ(Diary)

あまつぶ@はてなダイアリー RSSフィード

あまつぶWikiあまつぶ過去ログMacソフトWinソフト掲示板
<カレンダー>
2003 | 09 | 10 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 03 | 04 | 05 | 06 | 07 | 09 | 11 |
2011 | 02 | 07 | 08 | 11 |
2012 | 04 | 11 |
2013 | 07 | 09 | 10 |
2014 | 11 |
2015 | 11 |

<< 2007/07 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

<最近の見出し>




POPFile の Mac OS X(Panther/Tiger/Leopard/Snow Leopard/Lion/Mountain Lion/Mavericks/Yosemite)用インストーラをお探しの方は、POPFile プロジェクトのダウンロードページへ。
 | 

2007-07-30 健康診断 2007

[]健康診断 2007 健康診断 2007を含むブックマーク

今年の健康診断の結果が出た。話としては、id:amatubu:20060705#p1id:amatubu:20060909#p2id:amatubu:20070411#p1 あたりの続き。4 月から歩数計を持ち歩いてできるだけ歩くようにしてきた(これまでの歩数の合計は 60 万歩弱)が、果たしてその効果は。

AST(GOT) は 20、ALT(GPT) は 16、γ-GT は 43。なんと、すべて正常値に戻っていた。3 月には 44、91、137 だったのだからすごい変化だ。歩数を計り始めてから 3 ヶ月弱でこれだけの効果があったのだから、がんばったかいもあったというものだ。他にも、LDL コレステロールやら尿酸値やら軒並み下がっていた。

体重に至っては、(これはちょっと違うような気もするが)去年よりも 6kg も減っていた。BMI が 19.3 とかになってしまい、逆に低すぎて指摘されてしまった。あはは。

今後もこれを維持していかなくては。

[]「100年分のメールが保存可能」--au、Gmailを活用したウェブメールを開始 「100年分のメールが保存可能」--au、Gmailを活用したウェブメールを開始を含むブックマーク

すでに携帯で Gmail を見るようになっているのですぐにはメリットはなさそうだけれど、アクセスしやすくなるのであればありかも。しかし、WIN にしか対応しないという話もあり、微妙かな。すごく便利だったりすると、それがきっかけで WIN に乗り換え+定額サービスなんて可能性もあるかもしれないけど。

[]つながらない つながらないを含むブックマーク

このところプロバイダの調子が悪く、つながらないことがよくある。ルータをリセットしたり、ケーブルモデムの電源を入れ直したりあれこれしているうちにいつの間にかつながったり、またつながらなかったり。ルータに IP アドレスが振られない状態なのでなんともしようがない。

障害情報を見てみるとここ数日間障害が起こっていたことは書いてあるのだが、原因は「センター設備の不具合」と書かれているだけで具体的にはまったくわからない。今朝もつながらず、あとで障害情報を確認してみるとまたも原因は「弊社センター機器の不具合」。しかも処置内容は「機器の調整を行いました。」って、何をしたのかさっぱり。

短い期間で症状が繰り返されているところを見ると、根本的な解決にはなっていないのではないか。こういうことが続くと安心して使うことができない。こんなことのために別回線を確保する方がよいのかなぁ……。

GenGen 2007/08/05 22:34 auとGmailでそんなサービスしてるんですね。俺はauなので試してみようかなぁ?

amatubuamatubu 2007/08/06 08:30 > Gen さん

いまでも Gmail 使えますよ。最近では、外出時にメールチェックしたいときはもっぱらこれを使ってます。便利ですよ〜。

2007-07-25 Subversion 導入

[]Subversion 導入 Subversion 導入を含むブックマーク

TeraStation に Subversion をインストールしてみることに。

Subversion の最新バージョンは 1.4.4 だけれど、なんかうまくいかなかったので、1.3.2 をインストールすることに。と、その前に、libpthread.a と libpthread_nonshared.a が /usr/lib にないとエラーが出るようなので、/mnt/array1/share/usr/lib にあったこれらのファイルへのシンボリックリンクを作成しておいた。また、shared library を使うと、ビルド後にコマンドを実行したときに

/mnt/array1/share/usr/local/bin/svn: error while loading shared libraries: /mnt/array1/share/usr/local/lib/libapr-0.so.0: R_PPC_REL24 relocation at 0x0fcec990 for symbol `64' out of range

というエラーが発生してしまったため、shared library を作らずにいくことに。インストール先はいつも通り /mnt/array1/share/usr/local ということにして、

% sudo ./configure --prefix=/mnt/array1/share/usr/local --disable-shared

% make

% sudo make install

でインストール。こう書くとあっさりだけれど、ここに至るまでにあれこれ試行錯誤した。あとは、/mnt/array1/share/usr/local にできた、svn、svnadmin、svnserve のシンボリックリンクを /usr/bin へ作成。これで準備は完了だ。

ここからは、Subversion によるバージョン管理を大いに参考にさせていただいた。

リポジトリの作成は svnadmin create で簡単にできる。

% svnadmin create /path/to/svn/repository

リポジトリが作成できたら、外からアクセスできるように設定ファイルを編集する。今回は、svnserve をサーバとして使うことにする。面倒なのでとりあえずは ssh も使わない(というかまだインストールもしていない)。リポジトリ内の conf フォルダにある2 つのファイル(svnserve.conf と passwd)を編集する。このファイルはすでにテンプレートのようになっているので、必要な部分のコメントを外して設定を変更していくだけでいい。デフォルトで、匿名アクセスは読み取り専用、認証アクセスは書き込み可能、パスワードファイルは passwd となっているので、そのままコメントを外すだけとした。passwd ファイルは、使いそうなアカウントを適当に設定。ssh 経由ではなくて独自の認証となるので、TeraStation に設定してあるアカウントと一致させる必要もないようだ。

  • 動作確認

設定ができたら、サーバ(svnserve)をテストする。いきなり svnserve -d としてしまうとデーモンとして起動してしまい、kill で止めるしかなくなってしまうので、

% svnserve -r /path/to/svn/repository --foreground -d

というように、--foreground オプションをつけて起動するのがよさそう(これだと Ctrl-C(Terminal からは Cmd-.)で停止させることができるため)。最初、-X オプションを使う方がよいのかと思ったのだが、アクセスしようとした時点でサーバが止まってしまいアクセス拒否状態になってしまった。設定が悪いのかと思いあれこれ確認してみたが結局原因が判らず、試しに --foreground オプションを使ってみたら何事もなくアクセスすることができた。

設定がうまくいっているようであれば、 svnserve -r /path/to/svn/repository -d でデーモンとして起動させる。あとは TeraStation の起動時に自動的に起動するようスタートアップスクリプトを準備すれば完璧かな。これはまだ試していないが、ここらあたりが参考になりそう。

あとは使うのみ!

[]今日のあまつぶむら45 今日のあまつぶむら45を含むブックマーク

昨夜未明(?)、プラチナコガネ発見。ようやく寄贈。「こんな高価なものを寄贈していただいて」とかなんとか。高価だったの?(汗)

2007-07-24 WL54TE は WL54SE と交換

[]WL54TE は WL54SE と交換 WL54TE は WL54SE と交換を含むブックマーク

id:amatubu:20070719#p1 の続き。交換の子機が届いた。が、元の WL54TE ではなく、WL54SE という機種だった。TE の方はもう生産終了になっているようなので、それより新しいもの、ってことなのかな。中に入っていた紙には「同等品」と書かれていたけれど、有線のポートが TE は 2 個なのに対して SE は 4 個。後継機種ってことなのかな。

さっそくつないで動作は良好。「らくらく無線スタート」で設定したのだけど、離れた場所に設置しているのでちょっと面倒だった。子機側でボタン長押し→(POWER が緑点滅)→親機側でボタン長押し→(親機、子機の POWER が橙点滅)→親機側で再度長押しという手順なのだけれど、親機側で長押ししたあとで子機を確認しにいっているうちに点滅が終わってしまって失敗。もう少し待ってくれてもいいのに。近くで設定してから動かすのが基本なんだろうか。

[]お酒 お酒を含むブックマーク

もう先月のことになるのだけど、親にお酒を購入。齊藤酒造さんの金賞受賞酒。

私も少しもらって飲んでみた。最初は結構甘みを感じた。でも後味はしっかり日本酒。すっきりしていておいしかった。親も満足してくれたようでよかった。

なかなか買えないけど、たまにはいい酒を飲むのもいい。

[]HP7 20 ページ HP7 20 ページを含むブックマーク

全然進んでない。まだ 2 章の途中。

zakaizakai 2007/07/24 23:55 お、例の酒ですね...僕も飲みました。味が有って口当たりが良く、甘く感じますよね。未だに不思議に感じる一本です...たまには日本酒も良いですよ!!(^^)


僕は最近は、毎晩日本酒です...

amatubuamatubu 2007/07/25 16:05 > zakai さん

そうですね〜。最初に甘く感じたのが印象的でした。米を磨くと甘みが出るんですかね?
母親曰く、「辛口なのに甘く感じるお酒はいい酒だ」とのことです。

2007-07-21 607 ページ

[]607 ページ 607 ページを含むブックマーク

UK 版は 607 ページ。Half-Blood Prince とちょうど同じページ数だ。意外に薄く感じた。

さて、これから読む。

zakaizakai 2007/07/24 23:52 そ、それで薄いのかー(^^;
今週末、見せて下さいね。

amatubuamatubu 2007/07/25 16:03 > zakai さん

今までのと比べると、見た目かなりスリムに見えますよ。
箱を開けたときの第一印象は「薄っ」でしたから(汗)

2007-07-20 POPFile 0.22.5 日本語パッチ(テスト版その1)を公開

[]POPFile 0.22.5 日本語パッチ(テスト版その1)を公開 POPFile 0.22.5 日本語パッチ(テスト版その1)を公開を含むブックマーク

昨日の高速化と分かち書きプログラム切替パッチ、細かいバグ修正をまとめたパッチを POPFile 0.22.5 日本語パッチとして公開した。これで POPFile の次のバージョンで実現したいと個人的に考えていた項目はすべて準備できた。パッチの内容の詳細は以下のとおり。

  • 分かち書きプログラム切替

以前公開したものと変わりなし。

  • メール処理の高速化

昨日書いたものに若干の改良を加えたもの。簡単に time コマンドで速度比較(昨日と同じ 500 通のメールを bayes.pl を使って処理。3 回の平均を比較)したところ、0.22.5 を 1 として、パッチ適用後では Kakasi 使用時で 1.429 倍、MeCab 使用時で 1.425 倍、内蔵パーサ使用時で 1.626 倍の高速化がはかられた。

  • UI の履歴タブで長い件名が省略表示される際に一部が文字化けするバグを修正

UI の履歴タブにおいて、件名や差出人が長い場合後ろが省略されて表示されるが、その際にマルチバイトを考慮していないため、省略された部分が文字化けすることがあった。細かい部分ではあるが、気になるので修正を行った。

いつものとおり動作テストにご協力いただける方を募集中。動作確認を行ったら、動作した/しないにかかわらずフォーラムへ報告を。

[]いよいよ明日 いよいよ明日を含むブックマーク

忘れかけていたが、明日 Harry Potter and the Deathly Hallows 発売。

ということで明日から読書モードに突入。これまでと同様に 1 日 10 ページくらいを目標に読もうと思う。

読み始めるとおそらく他の作業は停滞すると思われるので、そうなる前にパッチリリースしたのだったり。

[]ローカルで Subversion を動かしたい ローカルで Subversion を動かしたいを含むブックマーク

ソースやらなにやらごちゃごちゃしてきたので導入を検討中。しかし明日からは時間がとれなくなりそうなのでしばらく先かな……。

前に TeraStation (の共有フォルダ)上にリポジトリを設置してみようと思ったがうまくいかなかった(ファイルのアクセス権かなにかの関係だったろうか)。できれば共有できるところに置きたいのだけれどうまい方法はないものか。

2007-07-19 AtermWL5400AP/WL54TEの不具合のお知らせとお詫び

[]AtermWL5400AP/WL54TEの不具合のお知らせとお詫び AtermWL5400AP/WL54TEの不具合のお知らせとお詫びを含むブックマーク

みごとに当たってしまった。しばらく前に親機とセットで買ったのだった。あまり使わないがテレビをインターネットにつなぐためなどに使っている。別に不具合が出ているわけではないが、煙が出ても困るので一応交換を申し込んでおいた。

[]さらなる高速化を目指して さらなる高速化を目指してを含むブックマーク

  • 単語抽出部分を見直す

0.22.5+分かち書きパッチのプロファイルで、Classifier::MailParse::add_line で時間がかかっていることがわかったのでこの部分の最適化を考えてみた。まずは、前回にも書いた、単語抽出部分を見直してみる。具体的には、

 while ( $line =~ s/^$euc_jp*?(([A-Za-z]|$non_symbol_euc_jp)([A-Za-z\']|$non_symbol_euc_jp){1,44})([_\-,\.\"\'\)\?!:;\/& \t\n\r]{0,5}|$)//ox ) {
     if ( ( $self->{in_headers__} == 0 ) && ( $self->{first20count__} < 20 ) ) {
         $self->{first20count__} += 1;
         $self->{first20__} .= " $1";
     }

     my $matched_word = $1;

     # In Japanese, 2 characters words are common, so care about
     # words between 2 and 45 characters

     if (((length $matched_word >= 3) && ($matched_word =~ /[A-Za-z]/)) || ((length $matched_word >= 2) && ($matched_word =~ /$non_symbol_euc_jp/))) {
         update_word($self, $matched_word, $encoded, '', '[_\-,\.\"\'\)\?!:;\/ &\t\n\r]'."|$symbol_euc_jp", $prefix);
     }
 }

という箇所である。1 行目の正規表現で、アルファベットも日本語(euc-jp)も一緒くたに扱うようにしているが、これを

 s/^$euc_jp*?([A-Za-z][A-Za-z\']{1,44}|$non_symbol_euc_jp{2,45})([_\-,\.\"\'\)\?!:;\/& \t\n\r]{0,5}|$)//ox

と順番を変更するだけで若干速度が向上する。また、ここで単語を抽出したあとに文字数を調べるような処理になっているが、これも抽出時にアルファベットなら 3 文字以上、日本語なら 2 文字以上という条件をつけることができる(日本語についてはすでに 2 文字以上になっている)。{1,44} を {2,44} に修正するだけだ。

 s/^$euc_jp*?([A-Za-z][A-Za-z\']{2,44}|$non_symbol_euc_jp{2,45})([_\-,\.\"\'\)\?!:;\/& \t\n\r]{0,5}|$)//ox

また、細かいところでは最後の「x」は不要なので削除し、さらに 2 つめの括弧は後方参照としては使わないので「?:」をつける(これらはほとんど変わらないだろうけれど)。

最終的には

 # In Japanese, 2 characters words are common, so care about
 # words between 2 and 45 characters

 while ( $line =~ s/^$euc_jp*?([A-Za-z][A-Za-z\']{2,44}|$non_symbol_euc_jp{2,45})(?:[_\-,\.\"\'\)\?!:;\/& \t\n\r]{0,5}|$)//o ) {
     if ( ( $self->{in_headers__} == 0 ) && ( $self->{first20count__} < 20 ) ) {
         $self->{first20count__} += 1;
         $self->{first20__} .= " $1";
     }

     update_word($self, $1, $encoded, '', '[_\-,\.\"\'\)\?!:;\/ &\t\n\r]'."|$symbol_euc_jp", $prefix);
 }

というようなコードになった。見た目にもかなりすっきりした。この処理の部分だけで、元のコードよりも 1.3〜1.7 倍くらい高速になった(幅があるのは日本語だけの場合や英語だけの場合で速度差が生じるため。英文の方がより有利だ)。

  • spacedout の処理を見直す

上記のコードをテストしている間に、add_line にはもっと大きなボトルネックが存在しているのを発見した。それは、例えば「V.I.A.G.R.A」のように文字と文字の間に空白やピリオドなどを挟み込むことによってフィルタを欺こうとしている箇所(POPFile ではこれを trick:spacedout という特別なキーワードとして認識する)を見つける処理を行っている部分だ。POPFile 0.22.5 では、次のようなコードだ。

 # Deal with runs of alternating spaces and letters

 foreach my $space (' ', '\'', '*', '^', '`', '  ', '\38', '.' ){
     while ( $line =~ s/( |^)(([A-Z]\Q$space\E){2,15}[A-Z])( |\Q$space\E|[!\?,])/ /i ) {
         my $original = "$1$2$4";
         my $word = $2;
         print "$word ->" if $self->{debug__};
         $word    =~ s/[^A-Z]//gi;
         print "$word\n" if $self->{debug__};
         $self->update_word( $word, $encoded, ' ', ' ', $prefix);
         $self->update_pseudoword( 'trick', 'spacedout', $encoded, $original );
     }
 }

間に挟まる文字の候補を変えながら何度も調べている。しかも、$space の内容が毎回変わるので o オプションも使えない。これは非常に重たい処理だ。ここを、ループや変数を使わずに書き換えることができればかなり高速化が期待できる。そこで、最初の正規表現を見直して

 s/( |^)([A-Za-z]([\'\*^`&\. ]|  )(?:[A-Za-z]\3){1,14}[A-Za-z])( |\3|[!\?,]|$)/ /

というように処理することにしてみた。すると、この部分だけの速度比較で 40 倍近く高速化された。これはかなり気持ちがよかった。ここは日本語処理とは無関係なところなので、英語環境で動かしている場合でもかなり効果があるはずだ。

  • Encode オブジェクトの再利用

Encode::Guess でオブジェクトが得られている場合には、それを使って例えば

 $string = Encode::encode($to, $enc->decode($string));

とする方が、

 Encode::from_to($string, $from, $to);

よりも速い(from_to では、再度 find_encoding で $from と $to に該当するエンコードを探すことになるからだろう)。また、一度作成したオブジェクトを保存しておいて再利用するようにすればより効率が良くなる。修正部分が多くなってしまうのでそこまではしなかったが、上記の修正だけでも若干の高速化は期待できる。


以上のような修正を、次のバージョンには含めたいと考えている。ざっとテストしてみたところでは、0.22.5+分かち書きパッチの状態よりも 1.4 倍くらい速くなっているようだ。このくらい変化があれば、また違いが体感できるだろうか。

ブルースターブルースター 2007/07/19 20:08 ハズレくじを引いてしまった気分ですね(笑)

煙で思ったのですが、今日気付いた武道場の電源供給装置(電気の供給をオン・オフにする装置)が「焦げ臭い」匂いするんですよ。
つい最近、雷が落ちた事が原因です
多分フューズが焼き切れたはずなのに、電源供給装置が一部供給できなくなった所を除き何ら問題なく動くのです。
ミステリーに包まれた謎みたいです。
では〜

amatubuamatubu 2007/07/19 23:10 > ブルースターさん

見たときに「なんか実覚えるのある型番だなぁ」と思い写真を見たら「これだ」って感じでした。カメラもあたりでしたし、最近不具合にあたるのが多いような気もします。まあ、ただで交換してくれるのだからいいんですけどね。

焦げ臭い、ですか。それはちょっと怖いですね。どこかショートしたりして火事の原因になりそうな感じなので一度見てもらった方がいいのかもしれないですね。

ブルースターブルースター 2007/07/19 23:21 >ただで交換してくれるのだからいいんですけどね。
「新品」になりますからね^^

>焦げ臭い、ですか。それはちょっと怖いですね。どこかショートしたりして火事の原因になりそうな感じなので一度見てもらった方がいいのかもしれないですね。

本当に気持ち悪いんですよ。何故、一部の箇所(ブロックと言った方が適切か)だけが電力を供給出来ないんですよ。
このまま武道場が焼けてしまえばいいんですけどね、新しい武道場になりますし(死
その間、部活もサボれるし(笑)
一応、責任者が何とかするらしいです。

最後にですが、数時間前にメールを送りましたので確認お願いします。

amatubuamatubu 2007/07/21 00:05 > ブルースターさん

そうですね。迅速に対応してくれるならよし、なのかも知れません。申し込んだらしばらくすると交換品が送られてきて、代わりに古いのを着払いで送り返せばいいみたいですし。

ふーむ。おそらくそこへいくどこかの線が断線しているのでしょうかね。そういうときはその元を切っておかないと危ないかもです。まあ、責任者の方が対応していただけるならおそらく大丈夫なのでしょうけれど。

メール見ました。返信遅くてすみません。

2007-07-17 POPFile 0.22.2 から 0.22.5 の速度向上

[]POPFile 0.22.2 から 0.22.5 の速度向上 POPFile 0.22.2 から 0.22.5 の速度向上を含むブックマーク

POPFile 0.22.2 から 0.22.3、0.22.4 から 0.22.5 のバージョンアップにおいて少しずつ細かな速度向上を図ってきたが、実際にどの程度の効果があったのか調べてみた。

テストには最近受信したメール 500 通を用い、POPFile に付属の bayes.pl スクリプトでメールを分類するのにかかる時間を測定した(実際のメールの受信時には、分類処理以外にもメールをサーバから受信してクライアントへ送る処理やメッセージを履歴に記録するといった処理があるが、今回は分類処理部分のみに注目した)。測定に際しては、どのルーチンで時間がかかっているのかを調べるため、Devel::DProf モジュールを用いた。結果にばらつきがあるようだったので、同じテストをそれぞれ 3 回行い、最も結果のよいものを比べることにした。

また、POPFile 0.22.3 では特に処理速度が向上するような修正を行っていないことから、このバージョンは除き、0.22.2、0.22.4、0.22.5 を比較することにした。現在テスト中の分かち書きプログラム切替パッチについてもテストしてみた。

  • 処理全体での速度比較

まずは全体での比較から。500 通のメールを分類するのにかかった時間は、

0.22.2 104.5725 秒 4.78 通/秒
0.22.4 81.51022 秒 6.13 通/秒
0.22.5 61.09028 秒 8.18 通/秒
0.22.5+分かち書きパッチ Kakasi 53.75493 秒 9.30 通/秒
0.22.5+分かち書きパッチ MeCab 52.55238 秒 9.51 通/秒
0.22.5+分かち書きパッチ Internal 47.67753 秒 10.49 通/秒

という結果であった。それぞれのバージョン間で速度比較すると、

0.22.2  0.22.4  0.22.5 
0.22.4  1.2829x -
0.22.5  1.7718x  1.3343x -
0.22.5+パッチ Kakasi  1.9434x  1.5163x  1.1365x 
0.22.5+パッチ MeCab  1.9899x  1.5510x  1.1625x 
0.22.5+パッチ Internal  2.1933x  1.7096x  1.2813x 

という感じになった(横方向から見て、縦方向のバージョンに比べてどの程度速度が向上したかをあらわす)。最新バージョンの 0.22.5 は(分類処理だけで比べれば)0.22.2 よりも 1.77 倍高速になっている(もちろん、これは適当に選んだ 500 通のメールでのテスト結果なので、どんな場合でもこれだけ向上するという意味ではない)。また、0.22.4 と比べても 1.33 倍だ。いずれも個人的には「少しは速くなったかな」と体感できるくらいの変化があったことから、このくらいの効果はあったのだろう。

分かち書き切替パッチについては、現状のバージョンよりも 10 数%〜30%弱の向上が見込まれるとの結果が出た。こちらは体感としては違いを感じなかったが、数値では若干の差があるということだろうか。

  • 速度向上を狙った部分で実際に向上しているか

0.22.2 から 0.22.3 のバージョンアップでは、分かち書き処理で使用している Kakasi の初期化を、メールの 1 行ごとではなくメール 1 通ごとに行うという修正を行った。バージョン 0.22.2 の Devel::DProf の結果は

Total Elapsed Time = 119.0525 Seconds
  User+System Time = 104.5725 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 31.3   32.77 37.465  40647   0.0008 0.0009  Classifier::MailParse::add_line
 29.8   31.20 31.208  49765   0.0006 0.0006  Text::Kakasi::xs_getopt_argv
 8.22   8.598  8.598  49765   0.0002 0.0002  Text::Kakasi::xs_do_kakasi
 7.31   7.641  7.641 246276   0.0000 0.0000  DBI::st::fetchrow_arrayref
 5.74   6.001  6.001   1512   0.0040 0.0040  DBI::st::execute
 5.58   5.839  6.565  49904   0.0001 0.0001  Encode::Guess::guess
 4.95   5.173 101.39  51068   0.0001 0.0020  Classifier::MailParse::parse_line
 4.10   4.289 120.16    500   0.0086 0.2403  Classifier::Bayes::classify
 3.27   3.424 33.148  31239   0.0001 0.0011  Classifier::MailParse::parse_html
 3.25   3.400  3.400 187977   0.0000 0.0000  Classifier::WordMangle::mangle
 3.22   3.367  3.367  51434   0.0001 0.0001  Encode::JP::JIS7::jis_euc
 1.98   2.066 33.274  49765   0.0000 0.0007  Text::Kakasi::getopt_argv
 1.85   1.938  1.938  49765   0.0000 0.0000  Text::Kakasi::xs_close_kanwadict
 1.53   1.595  7.196  49904   0.0000 0.0001  Classifier::MailParse::convert_enc
                                             oding
 1.19   1.240  2.119  10042   0.0001 0.0002  Classifier::MailParse::add_url
 0.91   0.951  0.951 187857   0.0000 0.0000  Classifier::MailParse::increment_w
                                             ord
 0.87   0.915 11.807   9212   0.0001 0.0013  Classifier::MailParse::parse_heade
                                             r
 0.87   0.913 102.79    500   0.0018 0.2056  Classifier::MailParse::parse_file
 0.77   0.806  9.404  49765   0.0000 0.0002  Text::Kakasi::do_kakasi
 0.65   0.681 44.982  49765   0.0000 0.0009  Classifier::MailParse::parse_line_
                                             with_kakasi
 0.48   0.500  1.156   9325   0.0001 0.0001  Classifier::MailParse::update_tag
 0.38   0.397  0.397   1017   0.0004 0.0004  DBD::SQLite2::st::_prepare
 0.30   0.314  0.833  13234   0.0000 0.0001  Classifier::MailParse::update_pseu
                                             doword
 0.28   0.296  0.627   6211   0.0000 0.0001  Classifier::MailParse::decode_stri
                                             ng
 0.23   0.239  0.271    500   0.0005 0.0005  Classifier::MailParse::start_parse
 0.22   0.234  0.296 301064   0.0000 0.0000  Encode::getEncoding
 0.22   0.230  0.410  31984   0.0000 0.0000  Encode::utf8::decode_xs
 0.17   0.180  0.180  31984   0.0000 0.0000  Encode::Encoding::renewed
 0.16   0.168  4.000 174743   0.0000 0.0000  Classifier::MailParse::update_word
 0.14   0.149  0.149   2483   0.0001 0.0001  Classifier::MailParse::compute_rgb
                                             _distance

となっており、Classifier::MailParse::parse_line_with_kakasi サブルーチン内で約 45 秒(表中で、ExclSec はそのルーチンのみ(そこから呼ばれるサブルーチンは除く)でかかった時間を、CumulS はそのルーチンとそこから呼ばれるサブルーチンでかかった時間の合計をあらわしている)という長い時間がかかっていることがわかる。ここから呼ばれているサブルーチンを探すと、Text::Kakasi::getopt_argv に約 33 秒、Text::Kakasi::do_kakasi に約 9 秒がかかっている。このうち Text::Kakasi::getopt_argv を呼ぶ回数を減らしたバージョン 0.22.4 では、

Total Elapsed Time = 92.22022 Seconds
  User+System Time = 81.51022 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 35.0   28.58 37.239  40763   0.0007 0.0009  Classifier::MailParse::add_line
 10.9   8.920  8.920 247076   0.0000 0.0000  DBI::st::fetchrow_arrayref
 8.32   6.778 13.787  49949   0.0001 0.0003  Encode::Guess::guess
 8.20   6.683 95.696    500   0.0134 0.1914  Classifier::Bayes::classify
 7.68   6.259  6.259   1512   0.0041 0.0041  DBI::st::execute
 5.31   4.327  4.327 188926   0.0000 0.0000  Classifier::WordMangle::mangle
 4.92   4.012  4.012   9674   0.0004 0.0004  Text::Kakasi::xs_do_kakasi
 4.54   3.698 70.480  51068   0.0001 0.0014  Classifier::MailParse::parse_line
 3.73   3.041  8.322 175676   0.0000 0.0000  Classifier::MailParse::update_word
 3.47   2.830  2.830  51463   0.0001 0.0001  Encode::JP::JIS7::jis_euc
 3.11   2.539 31.671  31242   0.0001 0.0010  Classifier::MailParse::parse_html
 2.09   1.701 18.974  49949   0.0000 0.0004  Classifier::MailParse::convert_enc
                                             oding
 1.97   1.608  1.608 188806   0.0000 0.0000  Classifier::MailParse::increment_w
                                             ord
 1.61   1.309  1.345 301245   0.0000 0.0000  Encode::getEncoding
 1.50   1.222  2.567 301245   0.0000 0.0000  Encode::find_encoding
 1.42   1.158  2.549  10050   0.0001 0.0003  Classifier::MailParse::add_url
 1.13   0.919  4.876  51463   0.0000 0.0001  Encode::JP::JIS7::decode
 1.11   0.902 72.783    500   0.0018 0.1456  Classifier::MailParse::parse_file
 1.08   0.882  2.965  49928   0.0000 0.0001  Encode::from_to
 1.00   0.815 12.103   9212   0.0001 0.0013  Classifier::MailParse::parse_heade
                                             r
 0.93   0.754  4.950  49810   0.0000 0.0001  Classifier::MailParse::parse_line_
                                             with_kakasi
 0.82   0.666  0.666 100598   0.0000 0.0000  DBD::_::db::quote
 0.73   0.599  1.068  51463   0.0000 0.0000  Encode::decode
 0.62   0.507  0.507 187560   0.0000 0.0000  Encode::XS::decode
 0.58   0.475  1.269   9492   0.0001 0.0001  Classifier::MailParse::update_tag
 0.52   0.422  0.422  59692   0.0000 0.0000  Encode::Encoding::name
 0.50   0.407  0.407    500   0.0008 0.0008  Text::Kakasi::xs_getopt_argv
 0.48   0.392  0.518  32004   0.0000 0.0000  Encode::utf8::decode_xs
 0.48   0.391 14.177  49949   0.0000 0.0003  Encode::Guess::guess_encoding
 0.43   0.351  1.017 100598   0.0000 0.0000  DBI::db::quote

という結果になった。0.22.2 で大きな時間がかかっていた Classifier::MailParse::parse_line_with_kakasi は 5 秒弱に短縮され、上位にいた Text::Kakasi::xs_getopt_argv は 500 回(=メール数)しか呼ばれなくなった。代わりに目立つようになったのは文字コードを変換する Encode 関係のルーチンだ。中でも文字コードを推測する Encode::Guess::guess が(そこから呼び出されるルーチンを含めて)14 秒弱を占めている。バージョン 0.22.5 ではここに手を加えた。その結果、

Total Elapsed Time = 72.14028 Seconds
  User+System Time = 61.09028 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 48.0   29.34 34.571  40763   0.0007 0.0008  Classifier::MailParse::add_line
 12.3   7.521  7.521 247127   0.0000 0.0000  DBI::st::fetchrow_arrayref
 10.7   6.543  6.543   1512   0.0043 0.0043  DBI::st::execute
 8.18   4.996 68.601    500   0.0100 0.1372  Classifier::Bayes::classify
 6.18   3.774  3.774   9674   0.0004 0.0004  Text::Kakasi::xs_do_kakasi
 5.74   3.508  3.508 189216   0.0000 0.0000  Classifier::WordMangle::mangle
 3.77   2.303 48.033  51068   0.0000 0.0009  Classifier::MailParse::parse_line
 3.08   1.882 29.035  31242   0.0001 0.0009  Classifier::MailParse::parse_html
 2.16   1.320  2.228  10150   0.0001 0.0002  Encode::Guess::guess
 1.95   1.191  1.191  19881   0.0001 0.0001  Encode::JP::JIS7::jis_euc
 1.68   1.024  1.816  10050   0.0001 0.0002  Classifier::MailParse::add_url
 1.59   0.970  0.970 189096   0.0000 0.0000  Classifier::MailParse::increment_w
                                             ord
 1.38   0.846  3.513  49949   0.0000 0.0001  Classifier::MailParse::convert_enc
                                             oding
 1.23   0.754  4.583 175966   0.0000 0.0000  Classifier::MailParse::update_word
 1.14   0.699 10.194   9212   0.0001 0.0011  Classifier::MailParse::parse_heade
                                             r
 0.92   0.564  0.564    500   0.0011 0.0011  Text::Kakasi::xs_getopt_argv
 0.73   0.449  0.449   1017   0.0004 0.0004  DBD::SQLite2::st::_prepare
 0.51   0.312 49.829    500   0.0006 0.0997  Classifier::MailParse::parse_file
 0.46   0.283  0.713   9492   0.0000 0.0001  Classifier::MailParse::update_tag
 0.44   0.267  0.924    500   0.0005 0.0018  Classifier::MailParse::start_parse
 0.33   0.199  0.199  10129   0.0000 0.0000  Encode::XS::encode
 0.32   0.193  0.193 100619   0.0000 0.0000  DBD::_::db::quote
 0.24   0.148  0.263   6211   0.0000 0.0000  Classifier::MailParse::decode_stri
                                             ng
 0.22   0.134  0.134  21433   0.0000 0.0000  Encode::XS::decode
 0.18   0.113  0.761  13250   0.0000 0.0001  Classifier::MailParse::update_pseu
                                             doword
 0.18   0.108  0.125     13   0.0083 0.0096  Classifier::Bayes::BEGIN
 0.16   0.099  0.099   1021   0.0001 0.0001  DBI::_new_handle
 0.15   0.093  0.093   1512   0.0001 0.0001  Classifier::Bayes::valid_session_k
                                             ey__
 0.15   0.089  0.319     11   0.0081 0.0290  POPFile::Loader::load_module_
 0.14   0.088  0.341    500   0.0002 0.0007  Classifier::Bayes::get_buckets_wit
                                             h_magnets

となり、Encode::Guess::guess の 1 回あたりの実行時間はそれほど変わらない(0.22.4 では 13.787/49949=0.000276 秒/回、0.22.5 では 2.228/10150=0.000220 秒/回)が、呼び出し回数が大幅に減った(約 1/5)ため時間を節約することができた。文字コード変換ルーチン(Classifier::MailParse::convert_encoding)全体で見れば、19 秒弱から 4 秒弱と大きく速度が向上しているのがわかる。

最後に分かち書き切り替えパッチを適用し、内蔵パーサを使った場合の結果。

Total Elapsed Time = 57.98753 Seconds
  User+System Time = 47.67753 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 57.1   27.23 29.545  40762   0.0007 0.0007  Classifier::MailParse::add_line
 15.3   7.321  7.321 239882   0.0000 0.0000  DBI::st::fetchrow_arrayref
 12.9   6.150  6.150   1512   0.0041 0.0041  DBI::st::execute
 7.88   3.757 54.967    500   0.0075 0.1099  Classifier::Bayes::classify
 5.43   2.587  2.587 187868   0.0000 0.0000  Classifier::WordMangle::mangle
 3.67   1.751 37.585  51068   0.0000 0.0007  Classifier::MailParse::parse_line
 3.32   1.583 25.460  31242   0.0001 0.0008  Classifier::MailParse::parse_html
 2.52   1.202  1.202  19881   0.0001 0.0001  Encode::JP::JIS7::jis_euc
 2.14   1.021  1.304  10150   0.0001 0.0001  Encode::Guess::guess
 2.02   0.962  1.464  10051   0.0001 0.0001  Classifier::MailParse::add_url
 1.98   0.942  0.942  49810   0.0000 0.0000  Classifier::MailParse::parse_line_
                                             with_internal_parser
 1.42   0.675  2.113  49949   0.0000 0.0000  Classifier::MailParse::convert_enc
                                             oding
 1.31   0.626  7.908   9212   0.0001 0.0009  Classifier::MailParse::parse_heade
                                             r
 1.11   0.529  0.529 187742   0.0000 0.0000  Classifier::MailParse::increment_w
                                             ord
 0.79   0.377  0.377   1017   0.0004 0.0004  DBD::SQLite2::st::_prepare
 0.69   0.327 38.682    500   0.0007 0.0774  Classifier::MailParse::parse_file
 0.54   0.258  0.850   9491   0.0000 0.0001  Classifier::MailParse::update_tag
 0.47   0.223  0.250   6211   0.0000 0.0000  Classifier::MailParse::decode_stri
                                             ng
 0.44   0.211  0.211  21433   0.0000 0.0000  Encode::XS::decode
 0.30   0.141  0.206    500   0.0003 0.0004  Classifier::MailParse::start_parse
 0.29   0.137  0.137   2503   0.0001 0.0001  Classifier::MailParse::compute_rgb
                                             _distance
 0.23   0.109  0.307     11   0.0099 0.0279  POPFile::Loader::load_module_
 0.18   0.088  0.114     13   0.0068 0.0087  Classifier::Bayes::BEGIN
 0.16   0.075  0.075   3427   0.0000 0.0000  Classifier::MailParse::map_color
 0.13   0.060  0.060   1512   0.0000 0.0000  Classifier::Bayes::valid_session_k
                                             ey__
 0.10   0.048  0.048  10129   0.0000 0.0000  Encode::XS::encode
 0.10   0.047  0.082    232   0.0002 0.0004  Encode::Alias::find_alias
 0.10   0.047  0.047   1021   0.0000 0.0000  DBI::_new_handle
 0.09   0.043  0.439  13251   0.0000 0.0000  Classifier::MailParse::update_pseu
                                             doword
 0.08   0.037  0.060    502   0.0001 0.0001  Classifier::Bayes::get_buckets

先ほどの 0.22.5 の表には(そのルーチン自体の処理時間が短いため)出てきていなかったが、分かち書き処理を行っているルーチン(Classifier::MailParse::parse_line_with_kakasi)は全体で 4 秒弱の時間がかかっていた(そこから呼ばれている Text::Kakasi::xs_do_kakasi は表に載っている)。これの代わりとなる Classifier::MailParse::parse_line_with_internal_parser は 1 秒弱なので、メール 500 通あたり約 3 秒(メール 1 通あたりでは 0.006 秒)の時間短縮ができたことになる。初期化ルーチン(0.64 秒 / 500 通)とあわせても微々たる差でしかないが、多少は効果があると言えるだろうか(まあ、内蔵パーサに対応する目的は、速度向上というよりも外部モジュールがなくても動作するようにすることなので速度的な効果がなくても問題はない)。

ここまでくると、日本語処理のメインルーチンである、Classifier::MailParse::convert_encoding と Classifier::MailParse::parse_line_with_internal_parser をあわせても全体の 6% ほどにしかならない(0.22.2 の時点ではほぼ半分、0.22.4 では約 3 割、0.22.5 では約 12% であった)。これはもうこれらのルーチンを改善してもほとんど効果はないということだ。あとどこかあるとしたら、呼び出し回数も多く時間も比較的かかっている Classifier::MailParse::add_line あたりだろうか。このルーチンだけで半分以上の時間を使っているのだから調べてみない手はない。単語に切り分ける処理で使っている正規表現あたりに改善の余地があるかもしれない。ちょっと考えてみよう。

2007-07-15 MeCab を Universal Binary でビルドする

[]MeCabUniversal Binary でビルドする MeCab を Universal Binary でビルドするを含むブックマーク

なんとか成功したのでメモ。

id:amatubu:20060930 で書いた、Kakasi と同様にいけるかなと思っていたのだけれどなかなかうまくいかなかった。

まず、いっぺんに作る方法は、なぜか configure でエラーが起こってしまってどうにもならなかった。config.log を見ると、コンパイラの動作チェックのところで

gcc: -E, -S, -save-temps and -M options are not allowed with multiple -arch flags

というエラーが起こっていた。テストではコンパイルだけを行うために「-E」オプションが使われているが、それと複数の「-arch」フラグは同時に使えないということらしい。なぜだかわからないが(というか以前はここは通ったような気がするのだが……)、原因が判らないのでとりあえず断念。

ということで、別々に作ってくっつける。mecab と libmecab.a が作れれば ok なのでまあそれでいいかなと。

% mkdir i386

% cd i386

% env CPPFLAGS="-O -g -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386" env LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch i386" ../configure --disable-dependency-tracking --disable-shared --host=none-apple-darwin

で configure までは問題なくいける(host オプションを指定しないと、実行チェックでひっかかってしまった。Intel Mac なら指定しなくても ok かな)。あとは make という流れなのだけど、このままだとリンク時に /usr/lib/libiconv.dylib が ppc アーキテクチャしかないというエラーになってしまう。これではなく、/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libiconv.dylib を使ってもらわないといけない。

あれこれ検索してみたところ、Apple Mailing List のメッセージを発見。これによると、libtool にバグがあって、-isysroot を見てくれないらしい。ということで、生成された libtool を開き、一部を修正する。修正する箇所は、sys_lib_search_path_spec=... という部分だ(なぜか 2 カ所あるので注意)。

sys_lib_search_path_spec="/Developer/SDKs/MacOSX10.4u.sdk/usr/lib"

こんな感じに修正する。

あとは、

% make

% cd ..

でビルド完了。

次は ppc。

% mkdir ppc

% cd ppc

% env CPPFLAGS="-O -g -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc" env LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch ppc" ../configure --disable-dependency-tracking --disable-shared

libtool は i386 と同様に書き換えておく。

% make

% cd ..

最後に lipo でくっつける。

% mkdir ub

% cd ub

% lipo -create ../i386/src/mecab ../ppc/src/mecab -output mecab

% lipo -create ../i386/src/.libs/libmecab.a ../ppc/src/.libs/libmecab.a -output libmecab.a

できたファイルの確認。

% file mecab

mecab: Mach-O fat file with 2 architectures

mecab (for architecture i386): Mach-O executable i386

mecab (for architecture ppc): Mach-O executable ppc

% file libmecab.a

libmecab.a: Mach-O fat file with 2 architectures

libmecab.a (for architecture i386): current ar archive random library

libmecab.a (for architecture ppc): current ar archive random library

以上。

書くと短く感じるが、なかなかうまくいかなくてかなり時間がかかってしまった。Intel Mac での動作検証はできていないけれど、多分大丈夫だと……。

あとは Perl モジュールのビルドと、辞書。辞書については Kakasi と同様にプラットフォーム依存(エンディアン依存)ということなので、また何か方法を考えなくては。単純にはそれぞれ別の辞書を用意すればよいのだけど、ファイルの大きさを考えるとできればその方法は取りたくないなぁと。

[]POPFile に投票をお願いします! POPFile に投票をお願いします!を含むブックマーク

POPFileSourceForge.net の Community Choice Award にノミネートされています。(Best Project for Communications カテゴリ)

投票は 7 月 20 日締め切りです。POPFile を使ってくださっているみなさん、ぜひ投票をお願いします!

POPFile に投票するには、SourceForge.net: Community Choce Awards Voting の「Best Project for Communications」カテゴリで「POPFile」を選択してください。(投票には SourceForge.net へのユーザ登録が必要です。これから登録される方は、SourceForge.net: User Account Registration から登録をお願いします)

POPFile が受賞した場合、国境なき医師団への寄付が行われる予定とのことです。

(参考)

https://sourceforge.net/forum/message.php?msg_id=4412585

(2007/08/06 追記:残念ながら POPFile は受賞できませんでした。投票いただいた方、ありがとうございました)

[]今日のあまつぶむら44 今日のあまつぶむら44を含むブックマーク

昨晩、オオクワガタ発見。本当に大猟だ。去年このシーズンはさぼってたってことかな? あともう少し。

そういえば、昨日なんか茶色っぽい生き物に襲われた。タランチュラとは違う感じ。長かったし。あれは……サソリ? あれをつかまえるのは骨が折れそうだ。あと 2 種類なんだけどなぁ。

2007-07-14 MinGW + MSYS 環境で Text::Kakasi と MeCab をビルドする

[]MinGW + MSYS 環境で Text::Kakasi をビルドする MinGW + MSYS 環境で Text::Kakasi をビルドするを含むブックマーク

MinGW + MSYS 環境で Text::Kakasi をビルドする手順。忘れないようにメモしておく。以下は、MinGW 5.1.3、MSYS 1.0.10、ActivePerl 5.8.8 build 820 での話。バージョンが違えば異なる箇所も出てくるかもしれない。

  • MinGW と MSYS をインストールする

http://www.mingw.org/ からダウンロード。

インストーラがあるのでそれを使ってインストールするだけ。

  • nmake をインストールする

Perl モジュールのビルドには nmake を使う。nmake はここらへんからダウンロードできる。できなければ、「nmake15」とかで検索すると出てくるかも。

  • ExtUtils::FakeConfig をインストールする

http://search.cpan.org/~mbarbon/ExtUtils-FakeConfig/ からダウンロード。

ppm からもインストールできるが、バージョンが古くいろいろと不都合が生じるので CPAN から最新バージョン(これを書いている時点では 0.10)をダウンロードしてインストールする。

MSYS のホームフォルダかどこかに展開後、

perl Makefile.PL

nmake

nmake install

でインストール。make の代わりに nmake を使う以外は特筆すべきこともなし。

  • Kakasi のインストール

http://kakasi.namazu.org/ からダウンロード。

普通にインストールするだけ。

./configure

make

make install

  • Text::Kakasi のインストール

http://search.cpan.org/dist/Text-Kakasi/ からダウンロード。

ExtUtils::FakeConfig を使うことを忘れないこと。

perl -MConfig_m Makefile.PL

nmake

nmake install

……でうまくいくはずなのだが、なぜか libkakasi.a やら libkakasi.h やらを見つけてくれないので、Makefile.PL の /usr/local/includeE:\msys\1.0\local\include に、/usr/local/libE:\msys\1.0\local\lib にそれぞれ置き換えて(msys は E ドライブにインストールされている)から実行する。

なにか設定が間違っているだけとか、あるいはもっといい方法がありそうな気もするが(ls /usr/local/include などとすれば libkakasi.h がちゃんと見つかるのだし)、とりあえずはこんな感じで。

[]MinGW + MSYS 環境で MeCabPerl モジュールも含め)をビルドする MinGW + MSYS 環境で MeCab (Perl モジュールも含め)をビルドするを含むブックマーク

ExtUtils::FakeConfig までは Kakasi と共通。

  • MeCab のインストール

http://mecab.sourceforge.net/ からダウンロードする。

MeCab 自体は ./configuremakemake install で何事もなくインストールすることができるのだが、このままだと Perl モジュールのビルドに失敗してしまうため、MinGw における MeCab のシェアードライブラリの問題: ナマズのブログを参考に mecab.h を修正する。具体的には、(MeCab 0.96 では)119 行目あたりにある条件式を書き換える。

あとは、

./configure

make

make install

で完了。

  • 辞書のインストール

辞書は簡単。

./configure

make

make install

だけ。

Makefile.PL 内で mecab-config を呼ぶようになっているが、どうも Perl からは呼び出せずエラーになってしまうようなので、MSYS 上で mecab-config --cxx などを実行してその結果を貼付けてしまう。が、ここでも /usr/local/include などのファイルをなぜか見つけてくれないので、実行結果を貼付けつつ内容を修正する。具体的には

use ExtUtils::MakeMaker;

WriteMakefile(

'NAME' => 'MeCab',

'CC' => 'g++',

'LD' => 'g++',

'INC' => '-Ie:\msys\1.0\local\include',

'LIBS' => '-Le:\msys\1.0\local\lib -lmecab',

'VERSION' => '0.96',

'OBJECT' => 'MeCab_wrap.o'

);

こんな感じになる。あとは、

perl -MConfig_m Makefile.PL

nmake

nmake install

でビルド完了。

2007-07-13 今日のあまつぶむら43

[]今日のあまつぶむら43 今日のあまつぶむら43を含むブックマーク

ヘラクレスオオカブト! なんか最近大猟だ。虫あと(たぶん)3 種類。未寄贈は 4 種類。

2007-07-12 分かち書きに MeCab、内蔵パーサ(文字種による分割)を使うためのパ

[]分かち書きに MeCab、内蔵パーサ(文字種による分割)を使うためのパッチ 分かち書きに MeCab、内蔵パーサ(文字種による分割)を使うためのパッチを含むブックマーク

分かち書きに文字種による分割を使った場合でも分類精度はほとんど変わらないという結果が得られたので、POPFile 0.22.4 のときに公開していたパッチを若干修正して、分かち書きに MeCab、内蔵パーサ(文字種による分割)を使うためのパッチとして再公開。

パッチの使い方などについては、分かち書きに Kakasi 以外のプログラム(例えば MeCab など)を使用するを参照のこと。

とりあえずはパッチ適用後のファイルのみ。Mac 版や Windows 版のインストーラについてはおりをみて。

[]今日のあまつぶむら42 今日のあまつぶむら42を含むブックマーク

おお、ドラド! 魚あと 2 種類(のはず)。

2007-07-09 今日のあまつぶむら41

[]今日のあまつぶむら41 今日のあまつぶむら41を含むブックマーク

プラチナコガネ!と思ったら、荷物がいっぱいで逃がしてしまった(涙)。地面に果物が散らばっていたのが敗因。虫リスト(?)には追加されたけど寄贈できず。むー、また捕まえなくては。

[][]旅行中の不便さ 旅行中の不便さを含むブックマーク

外出しているときには Palm T|X と A5504T でインターネットに接続している。今回、泊まったホテルにはインターネット接続サービスがついていたのだけど、有線接続しかできない。無線では接続できないため、結局 A5504T でダイアルアップ。すぐそこに接続できる線があるのにちょっと悲しかった。こういうときのために小型の無線ルータを確保しておくべきかなぁ。銀座の Apple Store に寄ったときに AirMac Express を見て「これ使えるかな〜」と思ったのだけど、店員さんに聞いたら、やはり Mac(か Windows の動くパソコン)がないと設定ができないそうで断念したのだった。まあ、そう滅多に使うわけでもないのでそこまでしなくてもいいかとも思いつつ……。

ところで、最近携帯で Gmail が読めるようになったのでメールはもっぱらそちらで見るようにしている。これが Palm でも見られれば無線 LAN のあるところならただでメールが読めるから便利だなぁと思うのだけど、UTF-8 に対応して日本語が読めるブラウザは Opera mini しかない。しかし、重いのは我慢するとしてもやはり不安定だ。もう少しなんとかならないものだろうか。

2007-07-08 今日のあまつぶむら40

[]今日のあまつぶむら40 今日のあまつぶむら40を含むブックマーク

おお、シーラカンス! 久しぶりに寄贈。残りあと 3 種類かな。虫はたぶんあと 5 種類。

2007-07-07 TOE(間違ったときだけ鍛える)とTA(常に鍛える)の精度比較

精度の比較グラフ

[]TOE(間違ったときだけ鍛える)とTA(常に鍛える)の精度比較 TOE(間違ったときだけ鍛える)とTA(常に鍛える)の精度比較を含むブックマーク

ずいぶん間が空いてしまったが、ようやく TOE と TA の精度比較の結果をまとめることができた。

POPFileTOE(間違ったときだけ鍛える)というポリシーで使用することがすすめられている。これは、POPFile がメールの分類を間違えたときにだけ UI を開いて正しいバケツに再分類するということであり、分類が正しい場合には何もしなくてもよいということである。これは、再分類させるという手間を考えれば至極合理的な考え方だというのはわかるのだが、ドキュメントに書かれている

調査では、TAはほんの少し正確なだけだということがわかっています。

の「ほんの少し」とはどの程度なのかがずっと気になっていたのだ。

調査には、分かち書きのプログラムによる精度比較を行った際のものと同じデータを用いた。結果は、調査結果(ページの後半部分)を参照。これもまあ偶然の一致なのだろうが、テストに使った 22,400 通のメールデータにおいては、TA でも TOE でも精度はまったく同じということになってしまった。TA の方が常に高い精度を維持しており、また序盤では TA が有利なのは事実ではあるが、メールを処理すればするほどその差は縮まっていく。結局、正しく分類されたメールを手間をかけて再分類する意味はまったくなかったのだ(最初の数十通〜数百通においてはある程度は有効だろう)。

学習を繰り返すことによってコーパスがどんどん大きくなっていくことから、速度面ではどんどん不利になっていく。学習させる時間まで含まれているので単純には比較できないが、調査には TOE の場合の 10 倍くらいの時間がかかったようだ。当然、TA で運用しようと思ったら人間がすべてのメールを学習させていくことになるのだから、メールの受信に時間がかかるだけでなく、UI を開いてすべてのメールを分類する時間も余分にかかってしまう。メールを分類する手間を省くためにツールを導入しているのにもかかわらず、余計に時間がかかるというのでは本末転倒だ。しかも、精度もほとんど向上しない。

もちろんこの結果はある特定のデータについてのものなので常にこういう結果が出るのかどうかについては何とも言えないが、ある程度の量のデータで検証ができたことから、個人的にはこれで十分かなと思っている。これまでも TOE で POPFile を使用してきたが、これからも TOE で使っていくことにしよう。そういえばここしばらく、テストの際に POPFile を停止させるため以外に UI を開いた覚えがないような……。

2007-07-02 続々・分かち書きプログラムの違いによる精度比較

精度グラフ

[]続々・分かち書きプログラムの違いによる精度比較 続々・分かち書きプログラムの違いによる精度比較を含むブックマーク

id:amatubu:20070524 の続きの続き。テストに使ったデータを修正して再挑戦。結果の詳細

結果は、なんと、22,340 通のメールを分類させ、Kakasi 270 通、文字種による分割(simple) 270 通、MeCab 269 通の分類ミス(精度では 98.791%、98.791%、98.796%)。2 万通ものメールを分類してミスの数が 1 通しか変わらないというのは驚いた。KakasiMeCab の結果がほぼ同じというだけならばまだわかるが、文字種による分割でも何ら変わらない。しかもグラフを見ると、一部では文字種による分割の方が精度が良いところもあり、これは十分実用になりそうだ。

また、当然ながらデータを精査したことによって精度が大きく向上した。さらに、途中から精度が下がっていくという謎の現象も解消した。やはりデータを使って検証を行うときはそのデータ自体の精度をまず確認しなければならないようだ。

次回(?)は TOE(間違ったときだけ鍛える)と TA(常に鍛える)の精度比較を予定。TOE は 3 時間くらいで検証できるが、TA となると丸 1 日たっても終わらないので明日までかかりそうなのだ……。

 | 
477522
Connection: close