Как внедрить систему рекомендаций?

У меня есть книга коллективного разума, но я не уверен, как ее можно применить на практике.

скажем, у меня есть PHP-сайт с базой данных mySQL. Пользователь может вставлять статьи с заголовком и содержимым в базу данных. Для простоты сравним название.

  • как сделать кофе?
  • 15 Вещей, О кофе.
  • Большой Вопрос.
  • как Точить Карандаш?
  • парень получает удар по яйцам

мы открываем как сделать кофе?"статья и потому, что есть сходство в словах со вторым и четвертым заголовком, они будут отображаться в соответствующем разделе Статьи.

Как я могу реализовать это с помощью PHP и mySQL? Это нормально, если я должен использовать Python. Спасибо заранее.

3 ответов


храните набор ключевых слов рядом с каждым продуктом, который по существу должен быть всем в названии, кроме набора стоп-слов. При отображении заголовка вы найдете любые другие продукты, которые имеют общие ключевые слова (с одним или несколькими общими приоритетами).

вы можете еще больше улучшить это, назначив оценку каждому ключевому слову на основе его дефицита (с более редкими словами, получающими более высокий балл, как, например, матч на " PHP будет более релевантным, чем совпадение по "программированию"), или отслеживая количество переходов пользователя вручную между набором продуктов.

независимо от того, что вам лучше начать, сделав его простым, а затем улучшить его по мере продолжения. В зависимости от размера вашей базы данных более продвинутые методы могут быть не столь плодотворными.


лучше всего использовать набор тегов, которые анализируются и хранятся в БД при вставке заголовка, а затем запрашиваются на основе этого.

Если вам нужно разобрать заголовок, вы в основном будете делать подобный запрос:

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.

Это может быть просто достигнуто с помощью подстановочных знаков в SQL-запросах. Если у вас есть большие тексты, и подстановочный знак, похоже, не может захватить среднюю часть текста, проверьте, соответствует ли подстрока одной другой. Надеюсь, это поможет. Кстати, название вашего вопроса спрашивает о реализации системы рекомендаций, а описание вопроса просто спрашивает о соответствии поля между записями базы данных. Система рекомендаций является широкой темой и поставляется со многими интересными алгоритмами (e.g, Коллаборативная фильтрация, контент-метод, матричная факторизация, нейронные сети и др.). Пожалуйста, не стесняйтесь исследовать эти дополнительные темы, если ваш проект в этом масштабе.