1

我试图找到最好的方法来确定一组项目(在这个例子中;鳄梨酱食谱中的成分)与所有项目组(表中的食谱;链接到另一个成分表)的相似程度。

例如; 我有以下鳄梨酱食谱:

3 鳄梨
1 成熟番茄
1 红洋葱
3 墨西哥胡椒
1 海盐
1 胡椒

我想在我所有的食谱表中运行这个食谱,以确定是否有另一个与之相似的食谱(基于成分和数量),按相似程度排序。此外,我希望它能够识别差异(无论是成分数量的差异;还是成分的不同)。

一个可能的输出是:

3 个鳄梨
(- 1 个成熟的西红柿)
1 个红洋葱
3 个墨西哥胡椒
1 个海盐
(- 1 个胡椒)
(+ 烟草)
89.5% 相同

这也可用于确定以下用例:“给定冰箱中的配料清单;我可以做些什么来吃?”。

感谢您为我指明正确方向提供的任何帮助。

4

1 回答 1

1

在我的脑海中,我可以看到一些通过字符串匹配出现的问题:

  • 3 Avocados并且2 Avocados都使用鳄梨,但字符串不匹配。
  • 1 tbsp salt15ml salt引用相同数量的盐,但字符串不匹配。

您可能希望保留一个配方成分表,该表还存储标准化数量(即,在放入数据库之前,所有内容都将转换为特定单位)。我在这里假设您已经有一个表 forrecipes和一个表 for 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

于 2010-10-12T19:09:39.493 回答