我正在努力寻找最佳方法来确定一组物品的相似程度(在此示例中;鳄梨酱配方中的成分)对于所有物品组(表中的食谱;链接到另一个成分表)
例如;我有以下鳄梨酱配方:
3鳄梨
1个葡萄成熟的西红柿
1红洋葱
3墨西哥胡椒
1海盐
1胡椒
我想通过我所有食谱的表格运行这个食谱,以确定是否有另一个类似于它的配方(基于成分和计数),按它的相似程度排序。此外,我希望能够找出差异(是否只是成分数量的差异;或者成分的不同)。
可能的输出是:
3鳄梨
( - 1个葡萄成熟的西红柿)
1红洋葱
3墨西哥胡椒
1海盐
( - 1胡椒)
(+ Tobasco)
89.5%相同
这也可用于确定以下用例:“我的冰箱里有一份食材清单;我可以吃什么?”。
感谢您帮助我指明正确的方向。
答案 0 :(得分:1)
在我的脑海中,我可以看到一些可以通过字符串匹配得出的问题:
3 Avocados
和2 Avocados
都使用鳄梨,但字符串不匹配。1 tbsp salt
和15ml salt
指的是相同数量的盐,但字符串不匹配。您可能希望保留一份配方成分表,该表还存储标准化数量(即,在放入数据库之前,所有内容都将转换为特定单位)。我在这里假设您已经拥有recipes
的表和ingredients
的表,这两个表都用作外键(使这个连接表< / em>的)
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
中指定的数量进行比较。