Mysql 寻找相似的分组;包括差异和分数(即相似配方)
我试图找到最佳方法来确定一组项目(在本例中为鳄梨酱配方中的成分)与所有项目组(表中的配方;链接到另一个配料表)的相似程度 比如,;我有以下鳄梨酱配方: 3个鳄梨Mysql 寻找相似的分组;包括差异和分数(即相似配方),mysql,comparison,similarity,Mysql,Comparison,Similarity,我试图找到最佳方法来确定一组项目(在本例中为鳄梨酱配方中的成分)与所有项目组(表中的配方;链接到另一个配料表)的相似程度 比如,;我有以下鳄梨酱配方: 3个鳄梨 1个葡萄成熟的西红柿 1个红洋葱 3个墨西哥辣椒 1海盐 1胡椒粉 我想在我所有的食谱表中运行这个食谱,以确定是否有其他与之类似的食谱(基于成分和数量),按其相似程度排序。此外,我希望它能够识别差异(无论是成分数量上的差异,还是成分上的差异) 一种可能的产出是: 3个鳄梨 (-1个葡萄成熟番茄) 1个红洋葱 3个墨西哥辣椒 1海盐 (-
1个葡萄成熟的西红柿
1个红洋葱
3个墨西哥辣椒
1海盐
1胡椒粉
我想在我所有的食谱表中运行这个食谱,以确定是否有其他与之类似的食谱(基于成分和数量),按其相似程度排序。此外,我希望它能够识别差异(无论是成分数量上的差异,还是成分上的差异) 一种可能的产出是: 3个鳄梨
(-1个葡萄成熟番茄)
1个红洋葱
3个墨西哥辣椒
1海盐
(-1辣椒)
(+Tobasco)
89.5%相同 这也可以用于确定以下用例:“给定冰箱中的配料列表;我可以做什么来吃?”
感谢您为我指出正确的方向。在我的脑海中,我可以看到一些通过字符串匹配出现的问题:
和3个鳄梨
都使用鳄梨,但字符串不匹配2个鳄梨
和1汤匙盐
指的是相同数量的盐,但字符串不匹配15毫升盐
配方
的表和一个用于配料
的表,这两个表在这里都用作外键(使其成为联接表)
然后,在确定匹配项时,您可以使用确定哪个配方包含您要寻找的成分最多(忽略数量):
计数最高的行具有最大的相似性(因为这意味着常见成分的数量最多)
为了确定数量之间的相似性,一旦你有了与大多数成分相匹配的配方,你就可以将给出的数量与配方(配料)
中指定的数量进行比较。在这里,我可以通过字符串匹配看到一些问题:
3个鳄梨
和2个鳄梨
都使用鳄梨,但字符串不匹配
1汤匙盐
和15毫升盐
指的是相同数量的盐,但字符串不匹配
您可能希望保留一个配方成分表,该表还存储标准化数量(即,在放入数据库之前,所有成分都将转换为特定单位)。我在这里假设您已经有了一个用于配方
的表和一个用于配料
的表,这两个表在这里都用作外键(使其成为联接表)
然后,在确定匹配项时,您可以使用确定哪个配方包含您要寻找的成分最多(忽略数量):
计数最高的行具有最大的相似性(因为这意味着常见成分的数量最多)
为了确定数量之间的相似性,一旦你有了与大多数成分匹配的配方,你就可以将给出的数量与配方中指定的数量进行比较理想情况下,我希望它能像全文搜索一样返回一个分数;如果我把所有的成分都放到一个blob中,这可能仍然有效,但它不能准确地进行区分。理想情况下,我希望它能像全文搜索一样返回一个分数;如果我把所有的成分都放进一团,这可能仍然有效,但它不能准确地进行区分。
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