我正在尝试找到确定一组项目(在此示例中;鳄梨酱食谱中的成分)与所有项目组(表中的食谱;链接到另一个成分表)的相似程度的最佳方法.
例如;我有以下鳄梨酱食谱:
3 个牛油果
1 个葡萄成熟的西红柿
1 个红洋葱
3 个墨西哥胡椒
1 海盐
1 个胡椒粉
我想在我所有食谱的表格中运行这个食谱,以确定是否有另一个与之相似的食谱(基于成分和数量),按相似程度排序。此外,我希望它能够识别差异(无论是成分数量的差异;还是成分的不同)。
可能的输出是:
3 个牛油果
(- 1 个葡萄成熟的西红柿)
1 个红洋葱
3 个墨西哥胡椒
1 海盐
(- 1 个胡椒粉)
(+ 烟草)
89.5% 相同
这也可用于确定以下用例:“给定冰箱中的配料 list ;我可以做什么吃?”。
感谢您为我指明正确方向的任何帮助。
最佳答案
在我的脑海中,这里有一些我可以看到的问题,这些问题将通过字符串匹配出现:
3 Avocados
和2 Avocados
都使用鳄梨,但字符串不匹配。1 tbsp salt
和15ml salt
指的是相同数量的盐,但字符串不匹配。
您可能想要保留一个配方成分表,该表还存储标准化数量(即,在将所有内容放入数据库之前,所有内容都将转换为特定单位)。我在这里假设您已经有一个用于recipes
的表和一个用于ingredients
的表,它们在这里都用作外键(使它成为连接表)
CREATE TABLE recipe_ingredients (
recipe_id INT NOT NULL,
ingredient_id INT NOT NULL,
quantity DECIMAL NOT NULL,
PRIMARY KEY (recipe_id, ingredient_id),
FOREIGN KEY recipe_id REFERENCES recipes (id),
FOREIGN KEY ingredient_id REFERENCES ingredient (id)
)
然后在确定匹配项时,您可以使用确定哪个食谱包含您要查找的成分最多(这会忽略数量):
SELECT ri.recipe_id, COUNT(ri.ingredient_id) AS num_common_ingredients
FROM ingredients AS i
RIGHT JOIN recipe_ingredients AS ri
ON ri.ingredient_id = i.id
WHERE i.id IN (?) -- list of ingredient IDs being searched for
GROUP BY ri.recipe_id
ORDER BY COUNT(ri.ingredient_id) DESC
COUNT
最高的行具有最大的相似性(因为这意味着有最多的共同成分)。
要确定数量之间的相似性,一旦您的食谱与大多数成分相匹配,您就可以将给定的数量与 recipe_ingredients
中指定的数量进行比较。
关于mysql - 寻找相似的群体;包括差异和分数(是。类似的食谱),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917924/