mysql - 寻找相似的群体;包括差异和分数(是。类似的食谱)

标签 mysql comparison similarity

我正在尝试找到确定一组项目(在此示例中;鳄梨酱食谱中的成分)与所有项目组(表中的食谱;链接到另一个成分表)的相似程度的最佳方法.

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

3 个牛油果
1 个葡萄成熟的西红柿
1 个红洋葱
3 个墨西哥胡椒
1 海盐
1 个胡椒粉

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

可能的输出是:

3 个牛油果
(- 1 个葡萄成熟的西红柿)
1 个红洋葱
3 个墨西哥胡椒
1 海盐
(- 1 个胡椒粉)
(+ 烟草)
89.5% 相同

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

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

最佳答案

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

  • 3 Avocados2 Avocados 都使用鳄梨,但字符串不匹配。
  • 1 tbsp salt15ml 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/

相关文章:

mysql - 计算具有 2 个以上条件的行条目

java - 如何比较数组列表中的整数

python - 使用 NLTK 和 Python 检查两个单词之间的相似性

java - 为什么ws4j在线演示值和源代码演示值不同,尤其是lesk值?

php - php mysql 数据库连接错误

MySQL 无法识别虚拟列/字段

c# - '正则表达式' VS 'String Comparison operators/functions'

elasticsearch - 文本字段上的ElasticSearch Analyzer

python - 在python中加入列表和列表列表

javascript - 优化此双重比较结果以在 javascript 中排序