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

了解聊天机器人(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’(常用词)是唯一的匹配,例如:

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

本文分享自微信公众号 - 机器学习AI算法工程(datayx)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券