搜索类似的分组;包括差异和分数(即类似的食谱)

时间:2010-10-12 18:43:07

标签: mysql comparison similarity

我正在努力寻找最佳方法来确定一组物品的相似程度(在此示例中;鳄梨酱配方中的成分)对于所有物品组(表中的食谱;链接到另一个成分表)

例如;我有以下鳄梨酱配方:

3鳄梨
1个葡萄成熟的西红柿
1红洋葱
3墨西哥胡椒
1海盐
1胡椒

我想通过我所有食谱的表格运行这个食谱,以确定是否有另一个类似于它的配方(基于成分和计数),按它的相似程度排序。此外,我希望能够找出差异(是否只是成分数量的差异;或者成分的不同)。

可能的输出是:

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

这也可用于确定以下用例:“我的冰箱里有一份食材清单;我可以吃什么?”。

感谢您帮助我指明正确的方向。

1 个答案:

答案 0 :(得分:1)

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

  • 3 Avocados2 Avocados都使用鳄梨,但字符串不匹配。
  • 1 tbsp salt15ml 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中指定的数量进行比较。