PHPで2つの文章の類似度を計算する

(1/2)
PHP の組み込み関数  similar_text  を使うことで、異なる 2 つの文章の類似度を計算できる。もちろん日本語にも対応している。
ブログなどに投稿される文章の中には、Wikipedia や他人の記事を無断引用するケースが少なくない。今回のプログラムを使えば、2 つの文章の類似度を自動的に比較・判定することができるようになる。

サンプル・プログラム

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説

プログラムの構造は簡単である。
POST 渡しされた 2 つのテキスト、$sour$dest を関数  similar_text  に投入しているだけである。
事前に、文字コードを UTF-8 に統一するために関数  mb_convert_string  を通し、XSS* 対策として関数  mb_convert_string  を通している。

0019:     $sour = isset($_POST['sour']) ? $_POST['sour'] : '';
0020:     $dest = isset($_POST['dest']) ? $_POST['dest'] : '';
0021:     $sour = mb_convert_encoding($sour$InternalEncoding, 'auto');
0022:     $dest = mb_convert_encoding($dest$InternalEncoding, 'auto');
0023:     $sour = htmlspecialchars($sour);             //XSS対策
0024:     $ret = similar_text($sour$dest$result);      //2つのテキストを比較
0025:     $result = sprintf('%02.1f', $result);
0026: }

たとえば、「元のテキスト」として、以下の Wikipedia の引用文を入れる。これは「PHP: Hypertext Preprocessor」からの抜粋である。
PHP: Hypertext Preprocessor(ピー・エイチ・ピー ハイパーテキスト プリプロセッサー)とは、動的に HTML データを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。
PHP は、HTML 埋め込み型のサーバサイド・スクリプト言語として分類される。この言語処理系自体は、C言語で記述されている。
「比較するテキスト」には、以下の文章を入れてみよう。
PHP(Hypertext Preprocessor;ピー・エイチ・ピー)とは、動的に HTML データを生成することによって、動的なウェブページを実現すること目的としたプログラミング言語である。
PHP は、HTML 埋め込み型のサーバサイド・スクリプト言語の一種で、処理系自体は C言語で記述されている。
結果は 84.0% である。
2 つめの文章は、一見すると元の文章とは異なっているが、じつは Wikipedia の引用文の順番を変えただけである。
このような違いでは、かなり高い類似度の値となる。
space
次に、「比較するテキスト」に以下の文章を入れて実行してみていただきたい。これは「PHP とは何か」(ぱふぅ家のホームページ)の冒頭部分である。
「PHP(Hypertext Preprocessor)」は、オープンソースのサーバ・サイド・スクリプト言語である。
サーバ・サイド・スクリプトとは、データベースサーバなどのサーバ群と Web ブラウザ(クライアント)を結ぶインターフェースの役割をするもので、Web サーバ上で動作する。HTML に比べて、動的なページを実現することができる。
結果は 21.7% となる。
なお、どこまでの値を「類似」とみなすかは、各人の判断にお任せする。
space

N-gram と類似度

テキストの隣り合う N 文字のことを N-gram* を呼ぶ。
異なる 2 つの文章の N-gram を総当たりで比較することで、たとえ文節の順番が異なっていても、登場する単語の種類と頻度の比較が可能となる。
N=3 の Tri-gram としてプログラムに実装したものが、Perl の String::Trigram である。これが livedoor で利用されているということが、公式ブログ「String::Trigram でテキストの類似度を測る」に記されている。
space
N-gram を用いた類似度計算は、Google のような全文検索でも利用されている。
space
ところで、組み込み関数  similar_text  は、ソースを見ると、N-gram を忠実に実装しているわけではない。
類似度を計算するのに使える組み込み関数として  levenshtein  もあるが、こちらも N-gram ではない。
そこで次節では、PHP で N-gram にもとづく類似度計算プログラムを作ってみることにする。
space
この項つづく
header