ホーム » スタッフ » 斉藤徹 » 文章の関連性の分析をしたくなった

2010年12月
« 11月   1月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

文章の関連性の分析をしたくなった

緊急連絡システムの配信されるメールの内容の相関を分析したくって、準備。文章比較を自分で書くと大変そうだし、便利なツールを Perl でできないかと探す。

文章をMecabで単語分割して、diff で差分を確認して、差分の行の量に応じてスコアをつければ簡単と思われる。かといって、テキストを子プロセスで MeCab や diff に渡すのは、中間ファイルが大量そうだし避けたい。 Perlモジュールを探すけど、やっぱり節操のない Perl だと、すべてが揃う…(^_^;

# aptitude search text-diff | grep perl
p   libtext-diff-perl  - Perl module to find differences in files a
# aptitude install libtext-diff-perl
# aptitude search mecab | gerp perl
p   libmecab-perl      - Perl 用 mecab バインディング
# aptitude install mecab libmecab-perl

簡単な実験プログラム。

#!/usr/bin/perl
use MeCab ;
use Algorithm::Diff 'sdiff' ;
my $a = "This is a pen.晴れた!"
."今日の天気は晴れています。"
."明日は雪がふるかな?"
."でもたぶん雨でしょう。" ;
my $b = "That is a pencil."
."今日の天気はどんよりと晴れてるよー。"
."明日はアラレがふるかな?"
."でもたぶん雪でしょう。" ;
sub mecab_split { # MeCabで単語分割
my $str = shift ;
my $mecab = new MeCab::Tagger( "" ) ; # コマンドライン引数
return map  { my @z = split( /\s+/ ) ; $z[0] }
split( /\n+/ , $mecab->parse( $str ) ) ;
}
my @a = mecab_split( $a ) ;
my @b = mecab_split( $b ) ;
my @diff = sdiff( \@a , \@b ) ;
foreach ( @diff ) {
my ($sign , $a , $b) = @$_ ;
print "$sign/$a/$b/\n" ;
}
(( 動作例 u:同じ,c:変更,+:追加,-:削除 ))
$ perl text-diff.pl
c/This/That/
u/is/is/
u/a/a/
c/pen/pencil/
:
u/たぶん/たぶん/
c/雨/雪/
u/でしょう/でしょう/
u/。/。/
u/EOS/EOS/