4

ユーザーが生成したコンテンツを格納する MySQL テーブルがあります。コンテンツごとに、タイトル (VARCHAR 255) と説明 (TEXT) 列があります。

ユーザーがレコードを表示しているときに、タイトル/説明が類似していることに基づいて、それに「類似」している他のレコードを見つけたいと考えています。

これを行う最善の方法は何ですか?PHPとMySQLを使用しています。

私の最初のアイデアは次のとおりです。

1) タイトルと説明から一般的な単語を取り除き、「固有の」キーワードを残してから、それらのキーワードを共有する他のレコードを見つけます。

たとえば、「ボブは午前 5 時に起きて学校に行きました」という文の場合、キーワードは「ボブ、目が覚めました、5、行きました、学校」になります。次に、タイトルが「ボブ」と「学校」について語っている別のレコードがある場合、それらは「類似」と見なされます。

2) または、MySQL の全文検索を使用しますが、これがこのようなものに役立つかどうかはわかりません。

2 つのうちどちらの方法が優れているでしょうか、またはさらに優れた別の方法はありますか?

4

3 に答える 3

3

短くまとめます(長くなりすぎるかもしれません)...

「手動で」キーワードを選択したり、元のデータを変更したりしません。

MySQL は MyISAM (InnoDB ではない) エンジンによる全文検索をサポートしています。DB にクエリを実行するときに使用できるオプションの完全な説明は、ここで入手できます。クエリは、クエリ方法に応じて、一般的なストップ ワードや、データ セット内で一般的すぎる単語 (行の 50% 以上に含まれる) を自動的に取り除くことができます。クエリ拡張も利用可能であり、ニーズに応じてクエリ タイプを決定する必要があります。

Lucene のような別のエンジンを使用することも検討してください。Lucene を使用すると、おそらくより多くの機能とより優れたインデックス作成/検索が可能になります。一般的な単語を自動的に取り除き (スコアが低く、検索に影響を与えません)、たとえばステミングとして使用することができます。少し学習曲線がありますが、私は間違いなくそれを調べます.

編集:

MySQL の「全文自然言語検索」は、最も類似した行 (およびその関連性スコア) を返しますが、ブール一致検索ではありません。

于 2012-12-19T18:38:55.917 に答える
1

まず、類似性が自分にとって何を意味するのか、2つの異なるドキュメント間の類似性をどのようにスコアリングするのかを定義することから始めます。

そのアルゴリズムを使用すると、すべてのドキュメントを処理し、類似度スコアのテーブルを作成できます。

スコアリングアルゴリズムの複雑さとデータセットのサイズによっては、これはリアルタイムで実行するものではなく、Hadoopなどでバッチ処理する場合があります。

于 2012-12-19T18:28:22.610 に答える
0

私はこのようなことをしました。文字列内のすべてのスペースを%に置き換えてから、where句でLIKEを使用します。ここで、私のコードを紹介します。これはMSSQLからのものですが、MySQLで動作するように微調整を行うことができます。それが役に立てば幸い。

CREATE FUNCTION [dbo].[fss_MakeTextSearchable] (@text NVARCHAR(MAX)) RETURNS NVARCHAR(MAX)
--replaces spaces with wildcard characters to return more matches in a LIKE condition
--              for example:
--              @text = 'my file' will return '%my%file%'
--              SELECT WHERE 'my project files' like @text would return true

AS
BEGIN
   DECLARE @searchableText NVARCHAR(MAX)

   SELECT @searchableText = '%' + replace(@text, ' ', '%') + '%' 

   RETURN @searchableText
END

次に、次のような関数を使用します。

SELECT @searchString = dbo.fss_MakeTextSearchable(@String)

次に、クエリで:

Select * from Table where title LIKE @searchString 
于 2012-12-19T18:34:20.723 に答える