如何实施推荐系统?

Posted

技术标签:

【中文标题】如何实施推荐系统?【英文标题】:How to Implement A Recommendation System? 【发布时间】:2011-09-12 05:32:26 【问题描述】:

我有一本《集体智慧》的书,但我不确定它如何在实际中应用。

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

如何制作咖啡? 关于咖啡的 15 件事。 大问题。 如何削铅笔? 家伙被球击中

我们打开“如何制作咖啡?”文章,并且由于第二和第四个标题的单词相似,它们将显示在相关文章部分。

如何使用 PHP 和 mySQL 来实现?如果我必须使用 Python 也没关系。提前致谢。

【问题讨论】:

【参考方案1】:

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

您可以通过根据每个关键字的稀缺性为每个关键字分配一个分数来进一步增强这一点(稀缺的单词被赋予更高的分数,例如,“PHP”上的匹配将比匹配更相关在“编程”上),或者通过跟踪用户在一组产品之间手动导航的次数。

无论如何,您最好先让它变得简单,然后在继续进行时对其进行改进。根据您的数据库的大小,更高级的技术可能并不那么富有成效。

【讨论】:

我在这里的理解是,每次用户插入包含文章内容(可能有数千个单词)的文章时,我必须将所有单词分解并存储在一个表格中(忽略停用词)然后将带有内容ID的关键字附加到每个单词。同时,程序会再次从其他可能有很多词的文章中寻找相似词,并找出哪篇文章有更多相似的关键词,然后将相关文章存储在一个表格中。我认为它很重还是不是我想的那样? 它不必是“沉重的”。最简单的方法是具有 2 列的多对多表 - 文章 ID 和关键字。用户选择文章#1,其中包含关键字 A、B 和 C。您可以像这样进行简单的 COUNT:SELECT articleID, COUNT(keyword) FROM keyword WHERE keyword IN (A, B, C) GROUP BY articleID ORDER BY COUNT(keyword) DESC - 显然这很简单,只给您匹配 MOST 关键字的文章,而不考虑单个关键字贾斯汀西蒙所说的价值。但这只是一个开始,而且启动和运行一点也不难。索引不错,速度也很快!【参考方案2】:

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

如果你必须解析标题,你基本上是在做一个 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.

【讨论】:

感谢您的详细回答。我将使用此答案作为参考。【参考方案3】:

这可以通过在 SQL 查询中使用通配符来简单地实现。如果您有较大的文本并且通配符似乎无法捕获文本的中间部分,请检查一个的子字符串是否与另一个匹配。我希望这有帮助。 顺便说一句,您的问题标题询问有关实施推荐系统的问题,而问题描述仅询问有关在数据库记录中匹配字段的问题。推荐系统是一个广泛的话题,并带有许多有趣的算法(例如,协同过滤、基于内容的方法、矩阵分解、神经网络等)。如果您的项目达到这种规模,请随意探索这些高级主题。

【讨论】:

以上是关于如何实施推荐系统?的主要内容,如果未能解决你的问题,请参考以下文章

推荐系统评测方法

推荐系统概述 -- 摘要

初码干货记一次分布式B站爬虫任务系统的完整设计和实施

亚马逊喜欢电子商务网站和推荐系统

推荐系统中的负反馈策略设计

推荐 | 综合电子系统集成测试试验平台