建议我使用算法来匹配人

时间:2011-10-11 09:05:45

标签: php mysql cakephp

目前我正在开展一个项目,我需要根据他们喜欢的食物类别来匹配人们:

这是情景:

我的数据库中有USERS及其喜欢的食物清单。数据库结构如下:

USERS(id,name,email,gender,dob)
Fav_Food (id,user_name,food,desc)

用户数据表:

1,Alice,alice @ lala.com,女,2010年10月11日

2,Bob,bob @ lala.com,男,2010年10月12日

3,Jason,jason @ lala.com,男,2010年10月13日

fav_foods表的数据:

1,爱丽丝,苹果,一些desc

2,爱丽丝,香蕉,一些desc

3,Alice,Pear,some desc

4,Bob,apple,some desc

5,鲍勃,奶油蛋糕,一些desc

6,杰森,香蕉,一些desc

6,杰森,苹果,一些desc

想象一下,我是爱丽丝,我喜欢苹果,香蕉和香水。梨。我怎样才能根据喜欢的食物搭配人?例如,我首先检查是否有人喜欢苹果,香蕉和梨(包括所有三个),而不是只使用两个组合的排列(apple,banana)(apple,pear)(banana,pear)(banana,apple) ....等等......

想象一下,它就像一个维恩图,其中的互动就是我感兴趣的。我有兴趣为用户提供最匹配的建议。有没有可用于php的算法?

3 个答案:

答案 0 :(得分:4)

您可以做的是将fav_foods表连接到自身,然后计算匹配项:

SELECT u2.user_name,count(*) as likeness 
FROM `fav_food` as u1 INNER JOIN `fav_food` as u2 ON (u1.user_name = 'alice' AND 
                                                 u1.food = u2.food AND 
                                                 u2.user_name != "alice")
GROUP BY u2.user_name 
ORDER BY likeness DESC

它会输出:

user_name   likeness
jason       2
bob         1

诀窍在于内连接的条件...... =)

希望这有帮助

已编辑:oops我更正了查询=)

答案 1 :(得分:1)

您可以查看Matching within Bipartite Graphs,但我怀疑这是否是最有效的算法。

答案 2 :(得分:1)

就个人而言,我会建立一个用户HABTM食物关系,而不是一遍又一遍地存储相同的字符串。

其次,look here for a good explanation of Jaccard coefficient

如果您决定使用HABTM关系,请查看此文档:http://book.cakephp.org/view/1044/hasAndBelongsToMany-HABTM该页面上的最后一个示例可能对您最感兴趣。

您可以在飞行中使用绑定,以获得所有用户,例如苹果和香蕉作为最喜欢的食物。

或者您可以使用Jaccard系数获取所有用户及其食物并进行比较。

只是抛出一些可能性,希望它有所帮助!