2010-10-12 72 views
1

我试图找到最好的方式来确定一组物品(在这个例子中;在鳄梨食谱配方)是如何相似的所有组的项目(食谱在一个表;链接到另一个成分表)。寻找类似的分组;包括差异和得分(即类似食谱)

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

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

我想运行通过这个食谱我所有食谱的表格,以确定是否有另一个类似于它的食谱(基于成分和数量),按照它的相似程度排序。另外,我希望能够确定它们之间的差异(无论是成分计数差异还是不同成分)。

一种可能的输出将是:

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

这也可以用于确定th e用下面的用例:“给出我的冰箱里的配料清单;我可以吃“

感谢您的任何援助,指着我在正确的方向

回答

1

关闭我的头顶,这里有些问题,我可以看到,将拿出通过字符串匹配?:

  • 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行具有最相似(因为这意味着是最大的共同点redients)。

要确定数量之间的相似性,一旦您的配方与大多数配料匹配,您可以比较给定的数量与recipe_ingredients中指定的数量。

+0

理想情况下,我会喜欢它有它像全文搜索返回一个分数;如果我把所有的成分放到一个blob中,这可能仍然有效,但它不会准确地进行差异化。 – Typhon 2010-10-14 17:11:18