使用机器学习构建自动问答系统

起因

  其实这个项目是我今年上半年的时候参加微软编程之美2017的时候的参赛作品,也是我的第一个比较完整的 NLP 的应用,在Task1 里的 MRR 分数应该是是排名前几的,所以来介(chui)绍(yi)一(bo)下。

  这个比赛会给你一堆问题和有关这个问题的正确答案和错误答案,然后在测试集中将给出另外一些问题以及和这个问题相关的一些答案,要求你将这些答案排序,正确答案越靠前则分数越高。下面是我的模型的部分测试结果:

Demo

问题分析及建模

  我在这个项目中用到的模型主要参考了这篇论文:《APPLYING DEEP LEARNING TO ANSWER SELECTION: A STUDY AND AN OPEN TASK》,下面的内容都会围绕这篇论文展开。

NLP中的一些概念

  在 CV 领域中,模型的输入很自然地成为一张RGB图片的三个通道×图片宽度×图片高度这样一个矩阵,且矩阵的每个元素的取值均为0-255,但在 NLP 领域内要用这样一个向量或矩阵来直接表示一句话不太可能,因为计算机无法理解人类的语言,而如果使用utf-8编码来直接代替文字做运算的话,一个汉字可能会占用4字节,也就是 2^32 bit,这样不仅难以运算,而且由于一段话是由多个文字组成的,那么模型的输入空间将变得非常大,这样训练出来的模型将难以收敛。

  要减少模型的输入空间,首先可以将只在目标文章中出现的字词作为模型空间,再其次可以将文本做分词,将一整个词作为最小单元,并将这些单元给予索引,那么一段话就可以表示成为一段索引号组成的向量(即词袋模型、词向量模型)。

本问题的分析

  本问题的训练集给了我们问题集A、正确答案集B、错误答案集C,将这些文本向量化之后我们就得到了三个向量:A、B、C,那么问题就转变成为了优化函数:max( F(A,B,C) ),其中F(A,B,C) = abs( Model_Score(A,B) - Model_Score(A,C) ),也就是说,需要给出一个让A与B、A与C之间的分数差异最大的模型。

  在上面提到的论文中,给出了四个简单的模型:
5.png

  其中Q、A分别代表问题和答案的词向量,HL层代表隐层、CNN层代表卷积层、P+T层代表Pooling+tanh层,每个模型在最后计算余弦相似度,这样的话,我们只要设定好模型的优化目标,让正确答案的Score远大于错误答案的Score即可。

模型建立和训练

  作为坚定不移的谷粉,建立神经网络的首选工具当然是天下第一的Tensorflow。这个项目的代码主要分成了三块:

  • net.py:神经网络模型的主体
  • util.py:文本到词向量的预处理工具、以及一些配套的方便函数
  • train.py:训练和测试的主要过程

评论卡