Archive for the ‘Programming’ Category

今日のPerl(息抜き)

木曜日, 8 月 21st, 2008

会社から貸与された新しい機種のPHS端末。まったく電話帳が入っておらず、以前の機種からの引継ぎも出来ないとのことでイライラ。社員の情報は ActiveDirectory で管理されているはずなので、LDAP から名前と電話(内線/外線)番号、メールアドレス等の情報を引っ張ってこれることを思い出し、ついカッとなって PHS 端末にインポート可能な形式の csv を生成する Perl スクリプトをデッチアップすることに。

まず引っかかったのが、携帯の電話帳に必須の「読み仮名」をどうしようかということ。読みが仮名で入っていないと、うまく電話帳検索の自動分類が働かないのでやっぱり対応必須だろう。だけど LDAP から「読み仮名」は取得できない。というわけで、ローマ字表記名をカナに変換できないかと Lingua::JA::Romaji を評価していたのですがイマイチうまく動かない。とりあえず時間も無いので断念。

続いて Dan Kogai さん作Lingua::JA::Kana を使ったらイイ感じ!!……と思ったんだけど、

「Junko」さんが 「Jウンコ」さんになってしまった

ため泣く泣く保留。 Lingua::JA::Romanize::* ってどうなんだろう。仮名->ローマ字のみかな?今度調べよう。

次に難字問題。にぽたん研究所:難字に難儀 にあるとおり、cp932 -> euc-jp でうまく変換できない文字がある。俗に言う「ハシゴ高」とかの難字。数字、カタカナなどを半角変換するために Encode::H2Z::z2h を使う場合、入力は euc-jp になるため、一度 euc-jp を経由してしまうので難字が化けてしまう。さらに、この難字を問題が出ない異字体に変換する Lingua::JA::Regular があるが、これも nipotan さんの先のエントリにあるとおり、内部で Jcode を経由するので「〓」(ゲタ文字)になってしまったりとちょっとクセがある。

そこでとりあえず nipotan さんが 30 分もかけ苦労して作成されたという Shift_JIS 用の %KANJI_ALT_TABLE を南無南無とありがたく使わせていただき、

my $enc = Encode::find_encoding('cp932');
my $string = $enc->encode($string);
my ($key, $value);
while ( ($key, $value) = each(%KANJI_ALT_TABLE_SJIS) ) {
   $sjis =~ s/$key/$value/ge;
}
Encode::from_to($string, 'cp932', 'euc-jp');
Encode::JP::H2Z::z2h(\$string);
Encode::from_to($string, 'euc-jp', 'cp932');

ってな感じでお茶を濁して終了。無事端末にインポート可能な csv を生成することが出来た。 今日の息抜きはここまで。

Plagger::Plugin::Filter::AutoTaggingをアップデート

木曜日, 6 月 19th, 2008

Plagger::Plugin::Filter::AutoTagging を少し改変しました。

AutoTagging.pm

変更内容は以下の通り。

  • otsune さんの diff を適用&ちょっと修正 (db省略時処理とMeCab用Encode処理のパフォーマンス改善) < otsune さんThx!
  • sub init を plugin.init ハンドラに変更しました。(他のプラグインの初期化処理もそのようになっているようなので……)

実は otsune さんに書いて頂いたdiff をそのまま適用したところうまく動きませんでした。というのも、「db 省略時に id_safe を使ってファイル名を生成するように」とコードを追加されておられるのですが、Plagger::Util::filename_for で $feed が参照できないために動きませんでした。

で、これ自体は単純なミスだと思ってなんとか取り込ませていただこうとしたのですが、otsune さんの意図が「Feed毎に学習できるように」というものなのか、それとも単に「Pluginユニークなdb名を生成したい」からなのか、それともなにか他にもあるのか気になりだして悩んでしまいました。

とりあえず Plagger::Util::filename_for で id_safe が使えるように safe_id と id サブルーチンを実装(というか Plagger::Feed から持ってきた)し、$self->id で $self->plugin_id が返るようにしてお茶を濁しておきましたが、これでは「Feed 毎に学習を分ける」という目的は達成できません。

学習データが完全に共通の場合、特に generate_tags を有効にするとあっというまにラベルがどんどん増えてDBのサイズが膨らんでしまいますし、guess の精度にも影響があるかもしれないので Feed 毎に学習データを分けられる(もちろん共通にもできる)ようにしておいたほうが色々と都合が良いかも?

ちょっと悩みます。

あと、safe_id は Plugin.pm レベルで持っていてもいいような気がしました。でもそんなのは既に議論されていそうだし、私のやり方よりもよい別の実現方法が既に実装されているのかも?

最近 Plagger の事を調べたりプラグインを書くのもご無沙汰だったので分からないことが多いのですが、ボチボチやっていこうと思いますので何かあれば皆様是非ご教授くださいませ。

久しぶりにPlaggerでなんかやってみた

水曜日, 6 月 18th, 2008

前回書いたとおり、Text::MeCab と Algorithm::NaiveBayes を利用して Auto Tagging する Plagger のプラグインを作成してみました。もちろん、Text::MeCab と Algorithm::NaiveBayes モジュールが必要です。

Plagger::Plugin::Filter::AutoTagging.pm

Perl のコード自体書いたのは久しぶりなので、あまり自信はないです。途中単純なミスにハマりながらもなんとか作りました。なにかおかしなところがあったら、是非ご指摘いただけると幸いです。

ちなみにしばらくの間、某所のDebien サーバで

- module: Filter::AutoTagging
config:
mecab_charset: utf-8
db: <DB_PATH>
generate_tags: 3
guess_tags: 3
threshold: 0.8
training: 1

とかやってテストをまわしていましたが、精度はイマイチです。generate_tagsでのキーワードの抽出方法はもう少しきちんと考えた方がいいかもしれない?あと、MeCab辞書が utf-8 の環境でしかテストしていません。

ちなみに config 項目の詳しい説明はこちら

Plagger/Plugin/Filter/AutoTagging

久しぶりにPlaggerでなんかやってみたくなった

木曜日, 6 月 12th, 2008

ずっと前から Plagger の最新動向を追うのをやめてしまっていたのですが、しばらくぶりに最新バージョンにアップデートして遊んでみました。

まず Debian でサーバを立て、Plagger を trunk からインストール。なるべく多くのプラグインと依存モジュールを頑張って入れました。Search::Estraier が使ってみたかったので HyperEstraier もインストール。

Search::Estraier に関しては下記のURLを参照のこと。

http://subtech.g.hatena.ne.jp/miyagawa/20060504/1146744042
http://subtech.g.hatena.ne.jp/miyagawa/20060504/1146739431

HyperEstraier をインストールしてマスターを起動し、管理者アカウントとノードを作成。example にあった search.yaml を変更して試してみたらすんなり動きました。イカス。

さらに、形態素解析エンジンの MeCab とその Perl バインディングである Text::MeCab を試してみたくなったのでインストール。MeCab の辞書は UTF-8 へコンバートしました。

んで例の「分かち書き」を試してみるといい感じ。これで各単語数カウントしてベイズ推定使えば日本語でもある程度精度のよいスパム判定とか自動レイティングとかできちゃうんでしょうか?(そんな簡単にはいかないか……)

と思ったけど「そんなの既に誰かやってそうだなあ。ずいぶん長いこと Plagger のこと調べてなかったからよく分からないしなあ。」といういつもの葛藤に苦しみながらも、エイヤとチャレンジしてみることに。

(more…)

Amazonで買った本が届く

火曜日, 4 月 3rd, 2007

会社から帰宅したら、先日買った「Lifehack with Mac」と「Perl プログラミング救命病棟」が届いていました。

Books

これから読もうと思ったけど時間が取れなそうです。明日は外出なので電車の中で読むことにします。

エラー忘却型コンピューティング

木曜日, 8 月 24th, 2006

Google で「エラー忘却型コンピューティング」という技術が用いられていると言う話。

Radium Software : Failure-Obliviousness in Google より

(more…)

VS2005 をセットアップ

月曜日, 3 月 6th, 2006

Visual Studio .NET 2003 (VC7.1) から Visual Studio 2005 Professional (VC8.0) へアップグレード。
(more…)

Flashコンテンツとローカルアプリケーションの連携を考える

金曜日, 1 月 20th, 2006

今日は Flash コンテンツとローカルアプリケーションの連携を色々と試行錯誤してみた。備忘録代わりにメモしておく。
(more…)

デザパタ本

木曜日, 1 月 12th, 2006

結城浩のはてな日記 - 『増補改訂版Java言語で学ぶデザインパターン入門』無料プレゼントより

日ごろの感謝を込めて、『増補改訂版Java言語で学ぶデザインパターン入門』を無料プレゼントいたします。

とのことで著者の結城先生ご自身によるプレゼント企画に応募させていただきます。会社のデザパタ本と併せて、知識の増強をはかりたいと思います。

増補改訂版Java言語で学ぶデザインパターン入門

AjaxなClickableToolTip

火曜日, 12 月 27th, 2005

「圏外からのひとこと」の essa さんが Ajax な ToolTip スクリプトを作成/公開。

ClickableToolTipとは

このスクリプトを利用するとリンクにカーソルを合わせた時に、del.icio.usMM/Memoはてなブックマークといったブックマークサービスからブックマーク件数を取得して ToolTip 表示。クリックすると各サービスの該当 URL ページへ飛べる。

下記の本館で実際の動作を見ることができる。タイトル下の「ToolTip有効」チェックをONにすると動作する。

圏外からのひとこと : Ajaxなtooltipテスト中

おもしろい。