可能的重复问题:
文本分类到类别
我目前正在开发一个解决方案,用于根据10k家餐馆的描述来确定它们提供的食物类型。我使用关键词列表来决定提供哪种食物。
我对机器学习略有了解,但完全没有实际经验。能有人解释一下为什么对于这样一个简单的问题,机器学习会是一个更好的解决方案吗?我认为准确性比性能更重要!
简化示例:
["China", "Chinese", "Rice", "Noodles", "Soybeans"]["Belgium", "Belgian", "Fries", "Waffles", "Waterzooi"]
可能的描述可能是:
“Hong’s Garden Restaurant为我们的顾客提供美味且价格合理的中餐。如果您在周六晚上8点突然想吃米饭、面条或大豆,别担心!我们一周七天营业,并提供外带服务。您也可以在这里吃到薯条!”
回答:
您确实描述了一个分类问题,可以通过机器学习来解决。
在这个问题中,您的特征是描述中的词语。您应该使用词袋模型 – 该模型基本上表示词语及其出现次数是分类过程中的关键因素。
要解决您的问题,以下是您应该采取的步骤:
- 创建特征提取器 – 给定餐馆的描述,返回该餐馆的“特征”(根据上述词袋模型解释的例子)。
- 手动标记一组示例,每个示例都将标记为所需的类别(中餐、比利时菜、垃圾食品等)。
- 将您的标记示例输入到学习算法中。它将生成一个分类器。根据个人经验,支持向量机(SVM)通常能提供最佳结果,但还有其他选择,如朴素贝叶斯、神经网络和决策树(通常使用C4.5),每种都有其优势。
- 当一个新的(未标记的)示例(餐馆)出现时 – 提取特征并将其输入到您的分类器中 – 它会告诉您它认为是什么(通常还会给出分类器正确性的概率)。
评估:
您可以使用交叉验证或从您的标记示例中分离出一组测试集,仅用于评估算法的准确性来评估您的算法。
优化:
根据个人经验,以下是一些对特征提取有帮助的优化方法:
- 词干提取和消除停用词通常很有帮助。
- 使用二元语法往往能提高准确性(尽管会显著增加特征空间)。
- 一些分类器容易受到大特征空间的影响(SVM除外),有几种方法可以克服这个问题,例如降低特征的维度。主成分分析(PCA)是其中一种方法。遗传算法在子集选择方面也(经验上)表现不错。
库:
遗憾的是,我对Python不够熟练,但这里有一些可能有帮助的库:
- Lucene可能对文本分析很有帮助,例如,词干提取可以使用EnglishAnalyzer来完成。Lucene有一个Python版本,称为PyLucene,我相信它可能会对您有所帮助。
- Weka是一个开源库,实现了许多对机器学习有用的东西 – 包括许多分类器和特征选择器。
- Libsvm是一个实现SVM算法的库。