メメメモモ

プログラミング、筋トレ、ゲーム、etc

MapReduce::Liteを使って形態素解析と単語ベクトル生成

形態素解析を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を使用しているそうです。

参考