2010-06-17 54 views
2

我在电影推荐引擎工作,我面临着数据库设计问题。 我实际的数据库看起来是这样的:电影推荐引擎概念数据库设计

MOVIES [ID,TITLE] 
KEYWORDS_TABLE [ID,KEY_ID] 
  • 其中,ID是MOVIES.id外键和KEY_ID是一个文字中的关键词表

这是不是整个数据库的关键,但我在这里展示了对我的问题重要的一点。 我有大约50,000部电影和大约1,3千万个关键字相关性,基本上我的算法包括提取所有与给定电影具有相同关键字的人,然后按照关键字相关数排序。

例如我找了类似的“投射走”了一部电影,它返回“六天六夜”,因为它有最多关键字的相关性(4个关键词):

Island 
Airplane crash 
Stranded 
Pilot 

该算法是基于在更多的因素上,但这是最重要和最困难的方法。

基本上我现在所做的是获得至少有一个关键字与给定电影相似的所有电影,然后通过其他一些暂时不重要的因素对它们进行排序。

如果没有那么多的记录,就不会有任何问题,查询在许多情况下持续高达10-20秒,其中一些甚至超过5000电影。 有人已经帮我在这里(感谢马克·拜尔斯)以优化查询,但因为时间过长

SELECT DISTINCT M.title 
FROM keywords_table K1 
JOIN keywords_table K2 
ON K2.key_id = K1.key_id 
JOIN movies M 
ON K2.id = M.id 
WHERE K1.id = 4 

所以,我认为这将是更好,如果我与电影的建议,预先制作的这些名单是不够的每部电影,但我不知道如何设计表格。不管是一个好主意,或者你会如何采取这种方法?

回答

1

@Supyxy更好的电影推荐方法是使用基于分析电影数据库后生成的抽象特征的神经网络方法(生成这些特征的因素可能是关键词|人的评级|导演名字|演员等) 。 Filmaster项目提供了一个示例开源影片推荐引擎。您可以在wiki上读到它:http://filmaster.org/display/DEV/New+recommendation+engine,并从到位桶仓库代码:http://bitbucket.org/filmaster/filmaster-test/src/tip/count_recommendations.cpp

但回答你必须在当前的解决方案,如果进一步的查询优化失败的问题,我想补充一些更多的冗余性数据为每部电影存储对类似电影的参考(计算可以懒惰地完成或每天在cron工作中进行,因为这些值不应经常改变)。

+0

神经网络不一定更好。神经网络是不透明的,所以如果你的模型成功了,你将不知道为什么 - 如果它不成功,你将无法改进它。 – isomorphismes 2011-03-05 05:54:41