2010-10-12 74 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