7

私は集合知の本を持っていますが、実際にどのように適用できるかわかりません.

mySQL データベースを備えた PHP Web サイトがあるとします。ユーザーは、タイトルと内容を含む記事をデータベースに挿入できます。簡単にするために、タイトルだけを比較します。

  • コーヒー作り方_
  • コーヒーに関する15のこと。
  • 大きな質問。
  • 鉛筆を削るには?
  • ボールに打たれる男

「コーヒーの淹れ方」を開きます。記事と、2番目と4番目のタイトルと言葉が似ているので、関連記事欄に表示します。

PHP と mySQL を使用してこれを実装するにはどうすればよいですか? Pythonを使用する必要がある場合は問題ありません。前もって感謝します。

4

3 に答える 3

12

各商品と一緒に一連のキーワードを保存します。これは基本的に、一連のストップ ワード以外のタイトルのすべてである必要があります。タイトルが表示されると、共通のキーワードを持つ他の製品が表示されます (1 つ以上の共通するものを優先します)。

希少性に基づいて各キーワードにスコアを割り当てることで、これをさらに強化できます (たとえば、「PHP」での一致は「プログラミング」での一致よりも関連性が高くなるため、希少な単語ほど高いスコアが与えられます)。 ')、またはユーザーが一連の製品間を手動で移動した回数を追跡することによって。

いずれにせよ、最初はシンプルにすることから始めて、次に進むにつれて強化するのが最善です。データベースのサイズによっては、より高度な手法を使用してもあまり効果がない場合があります。

于 2011-06-10T05:11:57.657 に答える
5

タイトルが挿入されたときに解析されてデータベースに保存される一連のタグを使用し、それに基づいてクエリを実行するのが最善です。

ただし、タイトルを解析する必要がある場合は、基本的に LIKE クエリを実行します。

SELECT * FROM ENTRIES WHERE TITLE LIKE '%<keyword>%';

ただし、より詳細な回答については:

// You need some test to see if the word is valid. 
// "is" should not be considered a valid match.
// This is a simple one based on length, a 
// "blacklist" would be better, but that's up to you.
function isValidEntry( $word )
{
    return strlen( $word ) >= 4;
}

//to hold all relevant search strings:
$terms = array();
$postTitleWords = explode( ' ' , strtolower( 'How to Make Coffee' ) );

for( $postTitleWords as $index => $word )
{
    if( isValidEntry( $word ) ) $terms[] = $word;
    else
    {
        $bef = @$postTitleWords[ $index - 1 ];
        if( $bef && !isValidEntry( $bef ) ) $terms[] = "$bef $word";
        $aft = @$postTitleWords[ $index + 1 ];
        if( $aft && !isValidEntry( $aft ) ) $terms[] = "$word $aft";
    }
}
$terms = array_unique( $terms );
if( !count( $terms ) ) 
{
    //This is a completely unique title!
}
$search = 'SELECT * FROM ENTRIES WHERE lower( TITLE ) LIKE \'%' . implode( '%\' OR lower( TITLE ) LIKE \'%' $terms ) . '\'%';
// either pump that through your mysql_search or PDO.
于 2011-06-10T05:20:27.767 に答える