Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 寻找相似的分组;包括差异和分数(即相似配方)_Mysql_Comparison_Similarity - Fatal编程技术网

Mysql 寻找相似的分组;包括差异和分数(即相似配方)

Mysql 寻找相似的分组;包括差异和分数(即相似配方),mysql,comparison,similarity,Mysql,Comparison,Similarity,我试图找到最佳方法来确定一组项目(在本例中为鳄梨酱配方中的成分)与所有项目组(表中的配方;链接到另一个配料表)的相似程度 比如,;我有以下鳄梨酱配方: 3个鳄梨 1个葡萄成熟的西红柿 1个红洋葱 3个墨西哥辣椒 1海盐 1胡椒粉 我想在我所有的食谱表中运行这个食谱,以确定是否有其他与之类似的食谱(基于成分和数量),按其相似程度排序。此外,我希望它能够识别差异(无论是成分数量上的差异,还是成分上的差异) 一种可能的产出是: 3个鳄梨 (-1个葡萄成熟番茄) 1个红洋葱 3个墨西哥辣椒 1海盐 (-

我试图找到最佳方法来确定一组项目(在本例中为鳄梨酱配方中的成分)与所有项目组(表中的配方;链接到另一个配料表)的相似程度

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

3个鳄梨
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