スキップしてメイン コンテンツに移動

投稿

京大テキストコーパスのパーサを書いた

要旨 CaboCha やなんかの出力形式であるところの京大テキストコーパス形式のパーサモジュールを Perl で書いたので紹介します。 Github Tarball on Github Ppages これを使うと例えば CaboCha の出力した係り受け関係を Perl のオブジェクトグラフとして取得できます。 使用例 単なる文節区切りの例。 #!/usr/bin/env perl use v5.18; use utf8; use IPC::Open3; use Parse::KyotoUniversityTextCorpus; use Parse::KyotoUniversityTextCorpus::MorphemeParser::MeCab; use Symbol qw//; my ($in, $out, $err); my $pid; BEGIN { ($in, $out, $err) = (Symbol::gensym, Symbol::gensym, Symbol::gensym); $pid = open3($in, $out, $err, cabocha => '-f1'); } END { close $out; close $err; waitpid $pid => 0 if defined $pid; } binmode STDOUT, ':encoding(utf8)'; binmode $in, ':encoding(utf8)'; binmode $out, ':encoding(utf8)'; my $parser = Parse::KyotoUniversityTextCorpus->new( morpheme_parser => Parse::KyotoUniversityTextCorpus::MorphemeParser::MeCab->new, ); say $in '星から出るのに、その子は渡り鳥を使ったんだと思う。'; say $in '出る日の朝、自分の星の片付けをした。'; close $in; my $sentence...

Search::Fulltext で N-gram 検索できるように Search::Fulltext::Tokenizer::Ngram を書いた

2014-01-01: CPAN にアップロードしたので追記。 要旨 Search::Fulltext という大変シンプルな全文検索モジュールがリリースされていたので、N-gram トークナイザを提供する Search::Fulltext::Tokenizer::Ngram を書きました。 Github MetaCPAN これを使うと日本語として怪しい表現でもとりあえずヒットするような全文検索ができます。 動機 大変シンプルなモジュールだったのでシンプルに使ってみようと思ったら現在のところ日本語のトークナイザは Search::Fulltext::Tokenizer::MeCab のみでした。Text::MeCab のインストールが億劫なのと、ワンダー日本語が跋扈している Web 文書なんかの検索だと N-gram の方が都合が良いこともあるので作ってみました。 念の為: N-gram って何 テキストを N 文字毎に区切ったもの。e.g., "色彩を持たない多崎つくると、彼の巡礼の年" から 2-gram を作ると "色彩", "彩を", "を持", ... "の年" といった具合になる。 要は文書中に出現する N 文字の組合せを網羅するので、N-gram を使ってインデックスを作ると N 文字以上のクエリにヒットする文書は一切取り零さなくなる。 短所は形態素の区切りを知らないので "京都" というクエリで "東京都" という語を含んだ文書までヒットする、N 文字以下のクエリは一切ヒットしない、N が小さいとインデックスが大きくなるなど。 使い方 インストール cpanm などを使ってインストールできます: cpanm Search::Fulltext::Tokenizer::Ngram Dist::Zilla (dzil) が必要です。面倒なら CPAN に上がるのを待つか `lib/` 以下をコピーで動きます。 git clone git@github.com:sekia/Search-Fulltext-Tokenizer-Ngram.git cd...

Algorithm::LibLinear の紹介

Notice: This article is outdated. Please refer an updated English tutorial . 要旨 かなり前になりますが、Algorithm::LibLinear という Perl モジュールを書きました。 CPAN Github これを使うと線形分類器などが高速に学習できます。テキストや画像の分類が応用として期待されます。 LIBLINEAR について LIBLINEAR は LIBSVM と同じ台湾国立大学の Chih-Jen Lin 教授のチームが公開しているオープンソースの機械学習パッケージです。 関数のロジスティック回帰、サポートベクター回帰及び線形 SVM による多クラス分類を行うことができます。LIBSVM と違ってカーネル関数を使うことはできませんが、はるかに高速に動作します。 Algorithm::LibLinear について LIBLINEAR には C++ で書かれたライブラリと、その機能を使って機械学習と分類・関数回帰を行うコマンドラインユーティリティが含まれています。 Algorithm::LibLinear はライブラリの機能を Perl からオブジェクト指向的に利用できるようにした上で、コマンドラインユーティリティの一部機能をライブラリ化して Perl で再実装したものです。 使い方 分類問題を解くときは、 訓練データセットの読み込み・スケーリング 学習器パラメータの設定 分類器の訓練 実データの分類 という手順で行います。 訓練データセットの読み込み 正解ラベルのついたデータを大量に用意して学習させます。 LIBSVM 形式のデータを読み込むか: my $data_set = Algorithm::LibLinear::DataSet->load(string => <<'EOD'); 1 1:0.1 2:0.1 4:0.1 -1 1:0.1 2:-0.1 3:0.1 ... EOD HashRef として表現されたデータを使います: my $data_set = Algorithm::LibLinear::DataSet->new(data_set => [ +{ feature => +{ 1...

YAPC::Asia Tokyo 2012 で LT してきた話とか感想など

去る9月、27日からの3日間に渡って東京大学伊藤国際学術研究センターで開催された YAPC::Asia Tokyo 2012 に参加してきましたので感想など。 YAPC に参加したのは昨年以来2回目。前夜祭から最後まで参加したのは始めて。中国地方在住ということもあってこれまでコミュニティとは無縁で一人勝手にやってきたのだけれど、昨年はインターンシップで東京にいたので2日目午後のみ当日券で参加しました。 その時は知り合いもいないし、トークと LT を眺めて O’reilly 本を買ってそそくさと帰ったのだけれど、過去最大の YAPC (当時) ということで一プログラミング言語をテーマにした催事で東工大のホールが埋まる光景はすごかった。あとどうでも良いけど LT の間中吹奏楽部らしき音が外から響いていたのも妙に覚えています。 そんなわけで今年は人といくらかでも繋がりたいなァと思いつつ、学生チケットが無料だということを知って去年は惜しいことをしたなァと卑しい後悔をしつつ参加しました。 LT してきた 去年までカンファレンスに行ったことがなかったので LT なるものをリアルで観たことがありませんでした。 YAPC, LT の始まる前に「LT 観たことない人」って言われて元気よく手を挙げたのが私です — SATOH, Koichi (実質抽象)さん (@outerinside) 10月 15, 2011 手を挙げたのは私一人だったはず。みんな意識高い。 @ outerinside 来年は LT 見たことある人として参加しましょう!!! — ともくんのママさん (@uasi) 10月 15, 2011 などと激励も頂いたし、今年は LT 見たことある人として参加するつもりでしたが、 遠方からの参加者支援制度 に申し込んだところ 株式会社スカイアーク 様から旅費支援を頂くことができたので、 遠方からの参加者枠 で LT する人にクラスチェンジ。 20年越しで Perl 4 to 5 した話 from outerinside おかげでボーイング787で快適に東京へ行くことができましたが、スライドもトークもギリギリまで直してイメトレのみのぶっつけ本番。 1人5分だわ時間は押して...

「Perlにもしあったらいいなぁと思う機能」は大体Perl6にあると思う

2011-03-19: 複数行コメントについて加筆しました。 背景 Perlにもしあったらいいなぁと思う機能 - サンプルコードによるPerl入門 を読んでて「それPerl6でできるよ」と思ったので。一応Perlです。一応。 1. ダブルクォーテーションの中で関数が展開できる機能 ダブルクォート( qq 演算子)はエスケープシーケンス、スカラ、配列、ハッシュ、関数、クロージャを展開します: "aaa { $book.title } bbb" Q クォート演算子でオレオレ展開ルールも作れます(Rakudoだとまだ動きませんが): Q:function/funcall: &func()/; Q:closure/closure: { ucfirst('hello') ~ ', world' }/; # qq//と同じ Q:qq/$scalar, @array[], %hash{}, &subroutine(), { 'closure' }/; 2. メソッドにおけるオブジェクトの名前 自身を self で参照できます: class Foo { has Str $.objective = 'world'; method greet { say "Hello, { self.objective }"; } } Foo.new.greet; # Hello, world Foo.new(:objective<Perl6>).greet; # Hello, Perl6 3. データを簡単にダンプする標準関数 オブジェクトをPerl6コードにダンプする .perl メソッドがあります: say 42.perl; # 42 say { foo => 'bar', hoge => qw/fuga piyo/ }.perl; # {"foo" => "bar", "hoge" => ("fuga", "piyo")} デバッグ用には変数名が分か...

部分継続チュートリアル

この文書について これは Community Scheme Wiki で公開されている composable-continuations-tutorial (2010年09月30日版)の日本語訳です。 誤字脱字・誤訳などがありましたらコメントあるいはメールで御指摘いただけると幸いです。 本訳は原文のライセンスに基づき Creative Commons Attribution-ShareAlike 2.0 Generic の下で公開されます。 Original text: Copyright© 2006-2010 Community Scheme Wiki Japanese translation: Copyright© 2011 SATOH Koichi 本文 部分継続(Composable continuation)は継続区間を具象化することで制御を逆転させるものです。 ウンザリするほど複雑な概念を表す長ったらしいジャーゴンのように聞こえますが、実際はそうではありません。今からそれを説明します。 reset と shift という2つのスペシャルフォームを導入するところから始めましょう [1] 。 (reset expression) は特別な継続を作るなりスタックに目印を付けるなりしてから expression を評価します。簡単に言えば、 expression が評価されるとき、あとから参照できる評価中の情報が存在するということです。 実際には shift がこの情報を参照します。 (shift variable expression) は目印のついた場所、つまり reset を使った場所にジャンプし、その場所から shift を呼び出した場所までのプログラムの断片を保存します; これはプログラムの区間を「部分継続」として知られる組み合わせ可能な手続きに具象化し、この手続きに variable を束縛してから expression を評価します。 組み合わせ可能(Composable)という語はその手続きが呼び出し元に戻ってくるため、他の手続きと組み合わせられることから来ています。 Composable continuationの別名として例えば限定継続(Delimited continuation)や部分...

Perl 5 to 6 - カリー化

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 28 - Currying の日本語訳です。 原文は Creative Commons Attribution 3.0 Germany に基づいて公開されています。 本エントリには Creative Commons Attribution 3.0 Unported を適用します。 Original text: Copyright© 2008-2010 Moritz Lenz Japanese translation: Copyright© 2011 SATOH Koichi NAME "Perl 5 to 6" Lesson 28 - カリー化 SYNOPSIS use v6; my &f := &substr.assuming('Hello, World'); say f(0, 2); # He say f(3, 2); # lo say f(7); # World say <a b c>.map: * x 2; # aabbcc say <a b c>.map: *.uc; # ABC for ^10 { print <R G B>.[$_ % *]; # RGBRGBRGBR } DESCRIPTION カリー化、あるいは部分適用とは関数やメソッドにいくつかの引数を与えて関数を生成する処理のことです。 これは打鍵数を節約し、また他の関数にコールバック関数を渡したいときに便利です。 "Hello, World" から簡単に部分文字列を取り出せる関数が欲しいと仮定しましょう。古典的なやり方は専用の関数を書くことです: sub f(*@a) { substr('Hello, World', |@a) } assuming によるカリー化 Perl6のコードオブジェクトは assuming メソッドを持...

Perl 5 to 6 - 一般的なPerl6データ処理イディオム

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 27 - Common Perl 6 data processing idiom の日本語訳です。 原文は Creative Commons Attribution 3.0 Germany に基づいて公開されています。 本エントリには Creative Commons Attribution 3.0 Unported を適用します。 Original text: Copyright© 2008-2010 Moritz Lenz Japanese translation: Copyright© 2011 SATOH Koichi NAME "Perl 5 to 6" Lesson 27 - 一般的なPerl6データ処理イディオム SYNOPSIS # キーと値のリストからハッシュを作る: # 方法1: スライス my %hash; %hash{@keys} = @values; # 方法2: メタ演算子 my %hash = @keys Z=> @values; # 配列の各要素に真を対応づけたハッシュを作る: my %exists = @keys Z=> 1 xx *; # 値を指定された範囲に制限する。ここでは範囲は 0..10 my $x = -2; say 0 max $x min 10; # デバッグ用: 変数の内容を変数名込みでSTDERRに書き出す note :$x.perl; # 大文字小文字を区別せずにソートする say @list.sort: *.lc; # 必須アトリビュート class Something { has $.required = die "Attribute 'required' is mandatory"; } Something.new(required => 2); # エラーなし Something.new() # ブーン DESCRIPTION ある言語で生産性を発揮するには言語仕様を学ぶだけでは不十分です...

Perl 5 to 6 - 例外と制御例外

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 26 - Exceptions and control exceptions の日本語訳です。 原文は Creative Commons Attribution 3.0 Germany に基づいて公開されています。 本エントリには Creative Commons Attribution 3.0 Unported を適用します。 Original text: Copyright© 2008-2010 Moritz Lenz Japanese translation: Copyright© 2011 SATOH Koichi NAME "Perl 5 to 6" Lesson 26 - 例外と制御例外 SYNOPSIS try { die "OH NOEZ"; CATCH { say "there was an error: $!"; } } DESCRIPTION 例外はその名前に反してまったく例外的なものではありません。実際のところPerl6では通常の制御フローの一部です。 例外は潜在的なエラー(例えば0除算、存在しないメソッドの呼び出し、型チェック失敗)または die その他の関数の明示的な呼び出しによって生成されます。 例外が投げられるとプログラムは呼び出しフレームから CATCH ブロックか try ブロックを探し、スタックを完全に巻き戻します(つまりそれまでに呼び出された全部のサブルーチンから無理矢理戻ってくるということです)。 もし CATCH も try も見つからなければプログラムは終了し、運が良ければ役に立つエラーメッセージが表示されます。 どちらか一方が見つかった場合はエラーメッセージは特殊変数 $! に格納され、 CATCH ブロックが実行されます( try ブロックに CATCH ブロックがない場合、ブロックは undef を返します)。 ここまでの説明ではまだ例外が例外的なものに思えるかも知れませんが、エラー処理は些末なアプリケー...

Perl 5 to 6 - 交差メタ演算子

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 25 - The Cross Meta Operator の日本語訳です。 原文は Creative Commons Attribution 3.0 Germany に基づいて公開されています。 本エントリには Creative Commons Attribution 3.0 Unported を適用します。 Original text: Copyright© 2008-2010 Moritz Lenz Japanese translation: Copyright© 2011 SATOH Koichi NAME "Perl 5 to 6" Lesson 25 - 交差メタ演算子 SYNOPSIS for <a b> X 1..3 -> $a, $b { print "$a: $b "; } # 出力: a: 1 a: 2 a: 3 b: 1 b: 2 b: 3 .say for <a b c> X 1, 2; # 出力: a1\n a2\n b1\n b2\n c1\n c2\n DESCRIPTION 交差演算子 X は2つ以上のリストのデカルト積を返します。 つまりどういうことかというと、最初のリストから1つ取って最初の要素に、2番目のリストから1つ取って2番目の要素に、といった具合で作り得るすべての組を返します。 X の後に演算子を付けるとそれが組のすべての要素に対して適用され、その結果が代わりに返されます。 よって 1, 2 X+ 3, 6 は 1+3, 1+6, 2+3, 2+6 (当然 4, 7, 5, 8 と評価されます)を返します。 MOTIVATION 2つ以上のリストの取り得る組み合わせをすべて走査しなければならないことはよくあります。交差演算子はそれを1つの走査に濃縮できるので、プログラムを簡潔にし、字下げのレベルを1つ減らせます。 メタ演算子としての使用法は時としてループを完全になくすことができます。 SEE ALSO http...