实现用于意图识别的文本分类神经网络

向AI转型的程序员都关注了这个号????????????

机器学习AI算法工程  公众号: datayx

 loveai.tech

AI图谱,一个全新的IT技术分享社区

原创作者在AI图谱平台上每成功发布一篇文章,通过审核后可奖励人民币30-50元不等,欢迎参与!


了解聊天机器人(chatbots)的工作原理很重要。 聊天机器人的一个基本机制是利用文本分类器进行意图识别 。 我们来看一下人工神经网络(ANN)的内部工作原理。 

实现用于意图识别的文本分类神经网络

在这个教程中,我们将使用2层神经元(1个隐层)和词袋(bag of words)方法来组织我们的训练数据。 文本分类的方法有三种 : 模式匹配 , 传统算法和神经网络 。 虽然使用多项朴素贝叶斯(Multinomial Naive Bayes)的算法出乎意料地有效,但它有三个基本缺陷:

  • MNB算法的输出是一个分值(score)而不是概率(probability)。 我们更希望得到一个概率,以便忽略低于某个阈值的预测。 这类似于VHF无线电中的“噪音抑制”机制。

  • MNB算法只能从分类的正例样本中学习模式,然而从分类的负例样本中进行学习也是非常重要的。

  • 不平衡的训练数据会导致NMB分类器的分值扭曲,迫使算法按照不同分类的数据集的大小来调整分值 。 这不是理想的方案。

与朴素(naive)相对应,文本分类器并不是试图理解一个句子的意思 ,而只是进行分类。理解这一点很重要, 实际上所谓的智能聊天机器人并不能真的理解人类的语言,不过这是另一回事 了。

要理解用于分类的传统算法,请参见此处 。

https://chatbotslife.com/text-classification-using-algorithms-e4d50dcba45

现在,让我们按以下步骤实现一个用于意图识别的文本分类神经网络:

  1. 选择技术栈

  2. 准备训练数据

  3. 预处理数据

  4. 迭代 :代码实现 + 测试 + 模型调整

  5. 抽象思考

本文完整源码 获取方式:

关注微信公众号 datayx  然后回复 意图识别 即可获取。

我们使用iPython Notebook,对于数据科学项目而言,它是一种超高效的工作方式。 代码开发语言是Python

我们使用NTLK进行自然语言处理。 首先需要一种方法将句子可靠地切分为单词(tokenize)并进行词干提取(stem):

实现用于意图识别的文本分类神经网络

我们的训练数据中,12个句子分别属于3类意图(intent):greetinggoodbyesandwich

实现用于意图识别的文本分类神经网络

现在我们进行数据预处理:

实现用于意图识别的文本分类神经网络

运行上面的代码,输出结果如下:

实现用于意图识别的文本分类神经网络

请注意,每个单词都转换为小写并进行了词干提取。 词干提取可以帮助机器理解havehaving是一样的。 另外,我们也不关心单词的大小写。

我们将训练数据中的每个句子转化为词袋(bag of words)表示:

实现用于意图识别的文本分类神经网络

下面是转换代码:

实现用于意图识别的文本分类神经网络

代码运行的输出结果如下:

实现用于意图识别的文本分类神经网络

机器学习的第一步是要有干净的数据。

接下来,我们实现这个2层神经网络的核心功能:

实现用于意图识别的文本分类神经网络

我们使用numpy,因为它可以快速进行矩阵乘法计算。

我们使用一个sigmoid函数作为神经元的**函数。 然后,不断迭代并进行参数调整,直到错误率低到可接受。

实现用于意图识别的文本分类神经网络

下面的代码,实现了词袋处理并将输入句子转换为0、1数组。 这和我们对训练数据的转换完全匹配,这一点对于获得正确的结果是至关重要的。

实现用于意图识别的文本分类神经网络

现在我们来实现神经网络的训练函数来调整突触的权重。 不要太紧张,主要用到的知识就是中学数学中的矩阵乘法:

实现用于意图识别的文本分类神经网络

现在准备建立神经网络模型 ,我们将把网络中的突触权重保存到一个json文件,也就是我们的模型文件。

你可以尝试不同的梯度下降参数(alpha),来看看它是如何影响错误率的变化。 这个参数帮助我们的模型达到最低的错误率:

synapse_0 += alpha * synapse_0_weight_update

实现用于意图识别的文本分类神经网络

我们在隐层中只使用了20个神经元,因此比较容易进行调节。 这些神经元的连接突触权重将根据训练数据的大小和数值而变化,一个合理的错误率目标是小于10 ^ -3。

实现用于意图识别的文本分类神经网络

上面代码的运行结果是:

实现用于意图识别的文本分类神经网络

现在,synapse.json文件包含了网络中所有的突触权重, 这就是我们的模型。

一旦计算出突触权重,下面的classify()函数就是进行分类的核心:

现在我们可以预测一个句子属于某个分类的概率。 预测速度很快,因为它就是think()函数中的点积计算:

实现用于意图识别的文本分类神经网络

运行结果如下:

实现用于意图识别的文本分类神经网络

你可以尝试一些其他的句子,也可以添加训练数据来改进和扩展模型。

有些句子会产生多个预测(都超过指定的阈值)。 你需要根据具体的应用来设置正确的阈值。 并非所有的文本分类场景都是相同的: 有些场景需要比其他方案更高的置信度。

上面代码中最后的那个分类调用使用show_details参数展示了一些内部的实现细节:

实现用于意图识别的文本分类神经网络

注意这个句子的词袋表示,其中有两个单词可以我们的词库相匹配。 神经网络也从0中得到了学习,即那些与词库不匹配的单词。

很容易通过一个示例句子来展示低概率的分类预测,其中’a’(常用词)是唯一的匹配,例如:

实现用于意图识别的文本分类神经网络

现在你有了一个构建聊天机器人的基本工具,它能够处理大量的类 (意图),并适用于对有限或大量的训练数据进行分类。 也很容易在模型中添加一个或多个新的意图。


阅读过本文的人还看了以下:

不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  

实现用于意图识别的文本分类神经网络

长按图片,识别二维码,点关注

实现用于意图识别的文本分类神经网络

相关文章:

  • 2022-12-23
  • 2021-05-30
  • 2021-07-20
  • 2022-12-23
  • 2021-04-11
  • 2021-07-08
  • 2021-09-11
猜你喜欢
  • 2021-10-07
  • 2021-12-20
  • 2021-07-16
  • 2021-11-09
  • 2021-12-19
  • 2021-04-29
  • 2023-02-20
相关资源
相似解决方案