如何实施推荐系统?

Aza*_*zam 5 php python mysql recommendation-engine

我是集体智力的书,但我不确定它在实际中是如何应用的.

假设我有一个带有mySQL数据库的PHP网站.用户可以在数据库中插入带有标题和内容的文章.为简单起见,我们只是比较标题.

  • 如何咖啡
  • 关于咖啡的 15件事.
  • 大问题.
  • 如何磨铅笔?
  • 在球中被击中的家伙

我们打开'如何制作咖啡?' 文章和因为第二和第四标题的词语相似,它们将显示在相关文章部分.

如何使用PHP和mySQL实现这一点?如果我必须使用Python,那没关系.提前致谢.

小智 10

在每个产品旁边存储一组关键字,除了一组停用词之外,它应该基本上是标题中的所有内容.显示标题时,您会发现共享关键字的任何其他产品(与具有一个或多个共同优先级的产品).

您可以通过根据每个关键字的稀缺性为每个关键字指定一个分数来进一步增强这一点(例如,更多稀缺的单词得分更高,因为"PHP"的匹配比'编程的匹配更具相关性' '),或跟踪用户在一组产品之间手动导航的次数.

无论你最好从简单开始,然后随着你继续增强它.根据数据库的大小,更高级的技术可能并不是那么富有成效.


cwa*_*ole 5

您最好使用一组标签,这些标签在插入标题时会被解析并存储在数据库中,然后基于该标签进行查询。

如果你必须解析标题,你基本上会做一个 LIKE 查询:

SELECT * FROM ENTRIES WHERE TITLE LIKE '%<keyword>%';
Run Code Online (Sandbox Code Playgroud)

不过,对于更详细的答案:

// 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.
Run Code Online (Sandbox Code Playgroud)