用于对食谱进行编程分类的算法
Posted
技术标签:
【中文标题】用于对食谱进行编程分类的算法【英文标题】:Algorithms used for programmatic classification of recipes 【发布时间】:2012-03-05 03:34:03 【问题描述】:我对基于配方的各种属性的统计分析以编程方式对配方进行分类感兴趣。换句话说,我想在没有任何用户输入的情况下将食谱分类为Breakfast
、Lunch
、Dinner
或Dessert
。
我可用的属性是:
-
食谱标题(例如鸡肉沙拉)
配方描述(描述配方的任意文本)
烹饪方法(准备此食谱的步骤)
准备和烹饪时间
配方中的每种成分及其用量
好消息是我有一个样本集,其中包含大约 10,000 个已经分类的食谱,我可以使用这些数据来教我的算法。我的想法是寻找模式,例如 syrup 一词是否在统计上更频繁地出现在 breakfast 食谱中,或者任何需要超过 1 杯糖的食谱中 有 90% 的可能性是甜点。我想如果我从多个维度分析配方,然后适当调整权重,我可以得到相当准确的东西。
在解决这个问题时,有哪些好的算法可以研究?像 k-NN 这样的东西会有帮助吗,还是有更适合这项任务的?
【问题讨论】:
您愿意投入多少编程工作?最简单(最少编程)的解决方案是将所有这些字段连接成一个大文本并运行任何文本分类工具。第二种方法需要更多的参与,需要您从数据中创建自己的特征并运行一种或多种分类算法:SVM、Boosting、KNN、神经网络、决策树等。 @ElKamina - 我正在寻找涉及构建我自己的算法的后一种方法。我主要想从这个问题中得到什么是指向最适合这类问题的算法的指针,我不是在寻找任何示例代码或任何东西(这个问题显然太宽泛了!) 拥有这些功能后,您可以使用Weka 轻松尝试多种不同的分类算法,并选择最适合您要求的一种。 @LarsKotthoff - 这个 Weka 项目看起来非常棒!我肯定会检查一下,至少我可以以这种格式获取我的数据并快速测试一些各种算法。谢谢指点! 【参考方案1】:我认为 NN 对此可能有点矫枉过正。我会尝试对每种餐食(早餐、晚餐)使用单个感知器“网络”进行分类,然后让它遍历输入并调整权重向量。在数据集中找到的每个有意义的词都可以作为网络的输入。我希望这足以满足您的需求。我之前用这个方法成功地对文本进行了分类。
【讨论】:
【参考方案2】:如果我要这样做,我会尝试像李考建议的那样去做。我会首先关注成分。我会为食谱的成分部分中出现的单词建立一个字典,并以监督的方式清理列表以删除非成分术语,例如数量和单位。
然后我将求助于贝叶斯定理:您的数据库允许您计算早餐和晚餐中都有鸡蛋的概率......;您将预先计算这些先验概率。然后给定一个包含鸡蛋和果酱的未知食谱,您可以后验计算这顿饭是早餐的概率。
您以后可以使用其他术语和/或考虑数量(每人的鸡蛋数量)来丰富...
【讨论】:
好建议 - 幸运的是,我的数据库已经以这种方式标准化,所以我有一套成分字典,数量/单位分别存储.. 如果您正在使用这样的贝叶斯定理,那么使用朴素贝叶斯学习器(无论是自行实现的一种还是主要可用的一种)究竟有什么区别?除了您在描述中忽略了膳食类型的先验概率之外,这似乎只是做一个朴素贝叶斯学习者所做的事情。仍然对朴素贝叶斯的简短描述表示赞成。 @LiKao:没有区别。【参考方案3】:尝试各种众所周知的机器学习算法。我建议首先使用贝叶斯分类器,因为它很容易实现并且通常工作得很好。如果这不起作用,请尝试更复杂的方法,例如神经网络或 SVM。
主要问题是决定将一组特征作为方法的输入。为此,您应该查看哪些信息是唯一的。例如,如果您有一个名为“鸡肉沙拉”的食谱,那么“鸡肉”部分将不会引起太大兴趣,因为它也存在于配料中并且更容易从那里收集。因此,您应该尝试找到一组提供新信息的关键字(即沙拉部分)。尝试为此找到一组好的关键字。这可能可以通过某种方式实现自动化,但如果您手动完成,则更有可能会更好,因为它只需要完成一次。
描述也是如此。找到正确的特征集始终是此类任务中最难的部分。
一旦您拥有了一组特征,只需在它们上训练您的算法,看看它的效果如何。如果您对机器学习没有太多经验,请查看正确测试 ML 算法的不同方法(例如,将 N 排除在外测试等)。
【讨论】:
以上是关于用于对食谱进行编程分类的算法的主要内容,如果未能解决你的问题,请参考以下文章