この投稿作品はデータベースに収められていて、文字数は1件あたり50文字前後の日本語です。
この中から「類似した内容を持つレコード」をグルーピングすることって、出来るのでしょうか。
機械的な処理になっても構わないですが、このような処理を行いたい場合に何をすればよいかの検討がつきません。
データ自体は通番と投稿文の2カラムで、これを PostgreSQL に投入して操作していますが、もし PostgreSQL 以外のデータベースで実現できるのであれば、それも知りたいです。
何をもって「類似」とするか、その考え方にもよりますが、出来ます。データベースの違いは問題になりませんが、類似度を計算するためのプログラミング言語が必要です。
livedoor開発チームが、livedoorキーワードに登録されている内容が Wikipedia の丸写しでないことをチェックするために perl の String::Trigram を使っているとのこと。公式ブログの記事「String::Trigram でテキストの類似度を測る」を参考にしてください。
String::Trigram のアルゴリズムはN-gram言語モデルと呼ばれるもので、Google検索エンジンなどでも利用されています。
Python や PHP での実装方法については「テキストの類似度をプログラムで処理するには」が参考になるでしょう。
何をもって「類似」とするか、その考え方にもよりますが、出来ます。データベースの違いは問題になりませんが、類似度を計算するためのプログラミング言語が必要です。
livedoor開発チームが、livedoorキーワードに登録されている内容が Wikipedia の丸写しでないことをチェックするために perl の String::Trigram を使っているとのこと。公式ブログの記事「String::Trigram でテキストの類似度を測る」を参考にしてください。
String::Trigram のアルゴリズムはN-gram言語モデルと呼ばれるもので、Google検索エンジンなどでも利用されています。
Python や PHP での実装方法については「テキストの類似度をプログラムで処理するには」が参考になるでしょう。
String::Trigram
python-ngram
PHP:similar_text
PHP: levenshtein
ありがとうございます!
※もしやPHPのMLでお見かけするぱぱぱふぅさんでしょうか!
バレちゃいましたね(苦笑)。その通り、PHPのMLに出入りしている者です。
さて、面白いテーマだったので、similar_text、N-gram、形態素解析(KAKASI、Yahoo!WebAPI)の3種類の方式を使った類似度計算サンプル・プログラムを作ってみました。いずれもPHPスクリプトで、下記で紹介しています。
案の定、方式によって結果に大きな差が出ました。
形態素解析は機械的な処理ではありますが、日本語の構造を意識しているので、同じようなキャッチコピーをふるい分けるという目的に適っていると思います。
しかし、CPUパワーを必要とする処理なので、1文50文字前後とはいえ、4万件を一気に処理するのは厳しいかもしれません。
String::Trigram
python-ngram
PHP:similar_text
PHP: levenshtein
ありがとうございます!
※もしやPHPのMLでお見かけするぱぱぱふぅさんでしょうか!