目前我正在开展一个项目,我需要根据他们喜欢的食物类别来匹配人们:
这是情景:
我的数据库中有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的算法?
答案 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系数获取所有用户及其食物并进行比较。
只是抛出一些可能性,希望它有所帮助!