点击上方关注,All in AI中国
有很多应用程序需要文本分类或者是我们所说的意图分类。如今,所有的东西都需要分类,比如内容、产品通常是按类别标注的。
然而,互联网上绝大多数的文本分类文章和教程都是二进制文本分类,比如垃圾邮件过滤(垃圾邮件和有用邮件)、情感分析(正面和负面)。然而,我们现实世界中的问题要比这复杂得多。而这也将是我要在这个文章中讨论的,即将文本按多个类别分类。
问题陈述:
我为我的GSoC项目(Owasp SKF-Chatbot)开发了这个分类器。问题是安全保卫知识框架有一个针对不同漏洞的知识库。它提供了不同漏洞的描述、解决方案和代码示例。因此,我需要对用户(在安全保卫知识框架)的查询进行分类,不管他是在寻找描述、解决方案还是代码示例。
我用Python(https://www.python.org/)和Jupyter笔记本(http://jupyter.org/)开发了我们的系统,机器学习组件则依赖于Scikit-Learn(http://scikit-learn.org/stable/)。
准备数据集
对于任何与分类或机器学习相关的问题,我们需要做的第一件事就是确保数据的格式正确。因此,首先我将解释我如何为意图分类准备数据集。
查看data.json请点击:https://github.com/Priya997/SKF-Chatbot/blob/master/Basic_Approach/Scripts_to_prepare_dataset/data.json 。我将准备CSV格式的数据集,因为可以降低训练模型的难度。
文本分类是一种问答系统。需要生成问题,因此我提取了一个列表中的所有标题。
因此,这些问题需要根据描述、解决方案和代码进行分类。所以,我分别列了三张清单来存储问题。
所以,现在数据已经准备好了。查看完整的数据请点击:https://github.com/Priya997/SKF-Chatbot/blob/master/Basic_Approach/Scripts_to_prepare_dataset/intent_data.csv。
为了更好地理解如何准备数据集,你也可以查看这个Jupyter笔记本的示例(https://github.com/Priya997/SKF-Chatbot/blob/master/Basic_Approach/notebook/intent_data_prepare.ipynb)。
现在,我们已经准备好了数据。是时候使用它了。让我们看看我们如何进行意图分类。
让我们引进一些库吧。
首先,我们将从CSV文件中提取数据并将其存储在数据帧中。
在这个步骤中,我们将准备数据以将其提供给算法。首先,我们从"Y"开始。
然后"pd.notnull"用于检查问题列中的数据是否为null,如果为null则整个行将被删除。
这一步对于获取高质量的干净数据非常重要。因为,如果我们有好的数据,我们就会有好的结果。
我们将创建一个新的列"category_id",它将为类提供一个数字。像描述的一样,它可能是0,解决方案1和代码2。
删除副本后,我们将得到这样的结果。
你可以在下面图检查data_prep的代码片段。
我使用了多项式朴素贝叶斯算法进行预测,因为我发现它易于实现,而且具有很高的准确率。
OneVsRest策略可用于多标签学习,其中使用分类器可以预测多个标签,朴素贝叶斯支持多类分类。但我们处于多标签场景,因此,我们将朴素贝叶斯包装在OneVsRestClassifier中。
OneVsRest多标签策略
多标签算法在多个标签上都接受一个二进制掩码。每个预测的结果将是一个由0和1组成的数组,类标签应用于每行输入示例。
为了更好地理解以下代码片段和多项分布的朴素贝叶斯模型,请点击:http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html 。
一个简短的概述是:我将数据分为测试数据和训练数据,然后将这些数据输入模型。
我还尝试过其他算法或模型,如线性SVC(Linear SVC)、逻辑回归和随机森林。你可以点击这里:https://github.com/Priya997/SKF-Chatbot/blob/master/Notebooks/implementing%20multiclass.ipynb。
这是我们最后的预测。
最后,我们输入问题并将其传递给预测函数,期待奇迹的发生。
很漂亮,很准确,不是吗?
你可以点击:https://github.com/Priya997/SKF-Chatbot/blob/master/Basic_Approach/notebook/Intent_classifier.ipynb,以更好地理解意图分类。
閱讀更多 AI中國 的文章