work.log

元エンジニアの備忘録的ブログ

文章の類似度を計測するPerlのString::Trigramモジュールを使ってみる

投稿:2015-01-13 18:05  更新:

Perl の String::Trigram モジュールを使って文章の類似度を計測する方法のメモです。

文章Aと文章Bはどれ位似ているかを N-gram という手法を使って機械的に判定しようというモジュールになります。

String::Trigramモジュールのインストール方法

CentOS の場合は yum インストールが簡単です。

# yum -y install perl-String-Trigram

ソースからインストールする場合はこんな感じに。

$ mkdir ~/src ; cd src
$ wget http://search.cpan.org/CPAN/authors/id/T/TA/TAREKA/String-Trigram-0.12.tar.gz
$ tar xfz String-Trigram-0.12.tar.gz
$ cd String-Trigram-0.12
$ perl Makefile.PL
$ make
$ make test
$ sudo make install

String::Trigramモジュールを使ってみる

インストールが終わったらこんなスクリプトを書いてテストしてみます。

#!/usr/bin/perl

use strict;
use warnings;
use String::Trigram;

    my $str1 = '今は真冬なので外がとても寒いです。';
    my $str2 = '冬の外はとても寒いです。';
    my $str3 = '今は真夏なのに外がとても寒いです。';

    my $score1 = String::Trigram::compare($str1, $str2);
    my $score2 = String::Trigram::compare($str1, $str3);

    print "score (str1 <=> str2): $score1\n"; 
    print "score (str1 <=> str3): $score2\n";

exit;

$str1 の文章と $str2, $str3 はどれ位類似しているかを計算します。

実行結果はこんな感じに。

score (str1 <=> str2): 0.542372881355932
score (str1 <=> str3): 0.766666666666667

1 に近づくほど類似しているという結果になります。

N-gram (今回は Trigram なので3文字) は指定した文字数に文章を分割して比較するアルゴリズムなので文章の意味を加味していません。ですので $str1 と $str3 の方が似ているという判定になります。

Trigram で $str1 を分割するとこのようになります。

今は真
は真冬
真冬な
冬なの
なので
ので外
で外が
外がと
がとて
とても
ても寒
も寒い
寒いで
いです
です。

この調子で $st2, $str3 も分割して分割した文字単位で比較しスコアを計測します。

Trigramの使いみち

このアルゴリズムの使いみちですが、実際に試した感じ比較的短い文章のコピペチェックツールに使えます。

文章内の単語を少しだけ変えたような単純なリライトであればこのアルゴリズムでしっかり検知可能です。

他に手軽な方法としてはコサイン類似度という方法もあるので覚えておくといつか役に立つかも。

よく読まれている記事

  • 本日
  • 週間
  • 月間