文章の関連性の分析をしたくなった
緊急連絡システムの配信されるメールの内容の相関を分析したくって、準備。文章比較を自分で書くと大変そうだし、便利なツールを 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/