« 2005年05月 | メイン | 2005年07月 »

2005年06月28日

ACL 2日目

大域的制約を Named Entity に使うという話が最近はやっているみたいです。
最初は Andrew McCallum が指摘して、それに続くようにチラホラ
話がでてきています。

大域的制約とは、「同じ表記の単語は同じNEになりやすい」という
性質をモデル化することに相当します。たとえば、「一青窈」はどんな
コンテキストでも人名です。しかし、以前の局所制約のみで動くものは
局所的な情報が不足したとたんに、正しく解析できません。

ACLで聞いた以下の論文は、Gibbs Sampling をつかって近似的に
inference しています。

Incorporating Non-local Information into Information
Extraction Systems by Gibbs Sampling
http://www.stanford.edu/~jrfinkel/papers/gibbscrf.pdf

去年の今頃、上記の大域的制約はNEに特に重要だと思っていて、
その性質を取り入れるようなモデルの定式化をやっていましたが、
なんやかんやで放り投げてしまいました。もっとがんばっておけば。。。

投稿者 taku : 12:12 | コメント (15) | トラックバック

ACL 2005

発表原稿をおいておきました

投稿者 taku : 04:21 | トラックバック

2005年06月27日

ACL

ACLの発表で Ann Arbor に来ています。
発表は初日におわって、いろいろありましたが、なんとか終わりました。

気づいたこと

- parsing session は質疑応答がタフでした。
 私も場合も質問があったのですが、1つに対して
 長いこと時間をかけて返答したので、いんちきくさく逃げました。

- parsing のスペシャリストである Marc Johnson と
Eugan Charniak からお褒めの言葉をいただいて、名刺交換までしました。

- Tsujii 研究室の方が何人かいらしていました。さすが Tsujii 研です。発表も質疑もそつなくこなしていて、とてもびっくりしました。私の
初めての発表の時は、落ち着きなくてやばかったと思います。今もそんな感じですけど。

- 私のツールを使っているという方から声をかけられました。
ありがたいことです。

投稿者 taku : 14:35 | トラックバック

2005年06月26日

Ajax IME

ひさびさにいじってみる。
FireFox だと、ネットワークが細いときに反応しない場合があったので、setTimer で定期的に入力を監視するようにした。イベントの発生回数も制御できるので、サーバーに優しいと思う。

http://chasen.org/~taku/software/ajax/ime/

投稿者 taku : 16:50 | コメント (10) | トラックバック

2005年06月12日

SWIG で C++ の pure virtual を wrap

pure virtual method を含む C++ class を
SWIG で wrap する方法に手こずった

class Foo { public: virtual int bar() = 0; };
Foo は pure virtual を含んでいるので instance 化できない。

実際には、

Foo *createFoo ()

みたいな Factory 関数で Foo の instance を得ることとする。
(Factory Pattern, Foo の実態はユーザは知らなくてよい。)

Foo.i (SWIG のインターフェイスファイル) には

%feature("notabstract") Foo;

%extend Foo {
Foo();
~Foo();
}

%{
void delete_Foo (Foo*t) {
delete t;
}

Foo* new_Foo () {
return CreateFoo();
}
%}

とかけば、各スクリプト言語のコンストラクタ syntax が
そのまま使えるようになる。内部では CreateFoo
Factory Function が呼ばれる。

投稿者 taku : 18:55 | コメント (13) | トラックバック

2005年06月08日

file upload script for sourcefourge.jp

sourcefourge へのアップロードが手動でめんどくさいので、
WWW::Mechanize を使ってコマンドラインから実行できるスクリプトを作成してみました。

% ./upload.pl -p mecab -n mecab-python -r 0.90 -f mecab-python-0.90.tar.gz

のように使う。ad-hoc なので、サイト変更に対する頑健性は保証できません。
mecab-perl/python/ruby のアップロードが一瞬でできて満足です。



use strict;
use Getopt::Std;
use WWW::Mechanize;

my %arg;
getopts("hu:P:p:r:s:n:f:",\%arg);

my $user = $arg{"u"} || $ENV{"USER"};
my $password = $arg{"P"} || "";
my $project_name = $arg{"p"} || "mecab";
my $package_name = $arg{"n"};
my $release_name = $arg{"r"};
my $file_name = $arg{"f"};
my $status = $arg{"s"};

sub usage {
print "$0 -u user_name -P password -p project_name \n";
print " -n package_name -r release_name -f file_name [-s status]\n";
print "e.g, $0 -p mecab -n mecab-python -r 0.90 -f mecab-python-0.90.tar.gz\n";
exit;
}

usage () if ($arg{"h"} ||
! $project_name ||
! $package_name ||
! $release_name ||
! $file_name);

# main
$| = 1;
my $mech = new WWW::Mechanize;


print "logging in sourcefourge ...";
$mech->get("https://sourceforge.jp/account/login.php");
$mech->form_number(3);
$mech->field('form_loginname' ,$user);
$mech->field('form_pw' ,$password);
$mech->click();
print " done\n";

print "moving to upload page $project_name/$package_name ...";
$mech->get("/projects/$project_name/admin");
my @links = grep ($_->[1] eq $package_name,
$mech->find_all_links(url_regex => qr[index.php]));
print "done\n";

die "$package_name is not found\n" unless (@links);
my ( $url, $title ) = @{$links[0]};
$url =~ s/show_edit_package/show_edit_release/g;
$mech->get($url);

print "uploading $file_name ...";
$mech->form_number(3);
$mech->field('status_id' ,$status) if (defined $status);
$mech->field('release_name' ,$release_name);
$mech->field('userfile' ,$file_name);
$mech->click();
print " done\n";

投稿者 taku : 01:05 | コメント (15) | トラックバック

2005年06月06日

Piecewise CRF

http://www.cs.umass.edu/~mccallum/papers/lcrf-nips2004.pdf

去年のNIPS WSで Andrew McCallum が提案した
新しい sequential ラベリング手法

基本的には MEMM を出発点としているが、label-bias が発生するので
それを巧妙に回避している。MEMM は、学習データのみ使って
前状態から次の状態への遷移を学習する。この時、学習データに
出現しなかった遷移は学習対象にならない。対象外の
遷移は他の理由(グラフのトポロジーなど)に影響を受けることになる。
これが label bias の私の理解。

そこで、学習データに出現しなかった遷移のたの特別な状態
NOTA を設ける。学習データに出現しなかった遷移はすべて
NOTA に遷移すると考える。

これだけの設定であとは MEMM を作る。式展開を進めていくと
きわめてスッキリした形になる。おもしろい。あと、初期の
berief propergation との類似展も指摘されてるみたいだ。
性能も実は CRF よりいい場があるそうだ。

ただ、decode が少し遅いのではないだろうか。
各状態ごとに確率の正規化が行われるので、計算量的には
CRF と変わらないし、viterbi で解けるとはいえ、ちょっと遅い気がする。

投稿者 taku : 07:46 | コメント (7) | トラックバック

CRF++

pre-release をとって正式バージョンにしました。
とくに変個点はありません。

http://chasen.org/~taku/software/CRF++/

投稿者 taku : 06:53 | コメント (10) | トラックバック