形態素解析をMapで行ない、単語の登場回数をReduceで行なうプログラムを書きました。
MapReduceのフレームワークは、MapReduce::Liteを使用しました。
Mapperの定義
文章を受け取って、形態素解析を行ない「(単語,1)」のkey-valueペアを作成します。
形態素解析には、「MeCab+IPA辞書+Text::MeCab」を使用しています。
package WordVectorMaker::Mapper; use Moose; with 'MapReduce::Lite::Mapper'; use Text::MeCab; sub map { my ($self, $key, $value) = @_; my $mecab = Text::MeCab->new; for (my $node = $mecab->parse($value); $node; $node = $node->next) { if ($node->posid =~ m/^(?:1|2|3|4)$/) { $self->emit( $node->surface => 1 ); } } }
Reducerの定義
シャッフルされたkey-valuesペアを受け取り、「(単語、valuesの数=出現回数)」のkey-valueペアを作成して、
出力しています。
package WordVectorMaker::Reducer; use Moose; with 'MapReduce::Lite::Reducer'; sub reduce { my ($self, $key, $value) = @_; $self->emit( $key => $values->size ); }
MapReduceの実行
実行プログラムは下記のようになります。
use MapReduce::Lite; use FindBin::libs; my $spec = MapReduce::Lite::Spec->new(intermidate_dir => "./tmp"); for my $arg (@ARGV) { my $in = $spec->create_input; $in->file($arg); $in->mapper('WordVectorMaker::Mapper'); } $spec->out->reducer('WordVectorMaker::Reducer'); $spec->out->num_tasks(3); mapreduce($spec);
MapReduce::Liteでの分散処理は、ithreadを使用しているそうです。
参考
- アルゴリズム実践教室「ベイジアンフィルタ開発に挑戦」
- 作者: 赤松祐希,紀平拓男,牧大輔,西林孝,中島聡,中島拓,角田直行,はまちや2,舘野祐一,きしだなおき,和田裕介,伊藤直也,大沢和宏,塙与志夫,増井俊之,ミック,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/24
- メディア: 大型本
- 購入: 14人 クリック: 162回
- この商品を含むブログ (40件) を見る
- MapReduce