我有集体智慧书,但我不确定它如何在实际中应用。
假设我有一个带有 mySQL 数据库的 PHP 网站。用户可以在数据库中插入带有标题和内容的文章。为了简单起见,我们只比较标题。
- 如何煮咖啡?
- 关于咖啡的 15 件事。
- 大问题。
- 如何削铅笔?
- 被球击中的家伙
我们打开“如何制作咖啡?” 文章,并且由于与第二和第四个标题的单词相似,它们将显示在相关文章部分。
如何使用 PHP 和 mySQL 来实现它?如果我必须使用 Python 也没关系。提前致谢。
我有集体智慧书,但我不确定它如何在实际中应用。
假设我有一个带有 mySQL 数据库的 PHP 网站。用户可以在数据库中插入带有标题和内容的文章。为了简单起见,我们只比较标题。
我们打开“如何制作咖啡?” 文章,并且由于与第二和第四个标题的单词相似,它们将显示在相关文章部分。
如何使用 PHP 和 mySQL 来实现它?如果我必须使用 Python 也没关系。提前致谢。
在每个产品旁边存储一组关键字,它们本质上应该是标题中除了一组停用词之外的所有内容。显示标题时,您会发现任何其他具有共同关键字的产品(与具有一个或多个共同优先级的产品)。
您可以通过根据每个关键字的稀缺性为每个关键字分配一个分数来进一步增强这一点(越稀缺的单词被赋予更高的分数,例如,与“PHP”的匹配将比“编程”的匹配更相关'),或者通过跟踪用户在一组产品之间手动导航的次数。
不管怎样,你最好先让它变得简单,然后随着你的进步而增强它。根据您的数据库的大小,更高级的技术可能并不那么富有成效。
您最好使用一组标签,这些标签在插入标题时被解析并存储在数据库中,然后基于该标签进行查询。
如果你必须解析标题,你基本上是在做一个 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.
这可以通过在 SQL 查询中使用通配符来简单地实现。如果您有较大的文本并且通配符似乎无法捕获文本的中间部分,请检查一个的子字符串是否与另一个匹配。我希望这有帮助。顺便说一句,您的问题标题询问有关实施推荐系统的问题,而问题描述仅询问有关在数据库记录中匹配字段的问题。推荐系统是一个广泛的话题,并带有许多有趣的算法(例如,协同过滤、基于内容的方法、矩阵分解、神经网络等)。如果您的项目达到这种规模,请随意探索这些高级主题。