Quora作为一个高质量的知识平台,需要确保相同的问题不会多次出现。答题者不应该把相同的答案复制粘贴到类似的问题下方,而读者也应该只能在站内找到唯一的问题与他的需求对应。例如,“减体重的最佳方法是什么?”,“如何才能减肥?”,“最有效的减肥计划是什么?”,通常这些问题都会被人们认为是重复提问,因为这些问题的意图都相同。为了避免出现类似的问题,Quora的工程师们利用机器学习和自然语言处理技术,开发了一套自动识别重复问题的系统。
最近,Quora的工程师们公开了一个重复问题的
数据集
,供爱好者们训练模型,来解决类似于Quora重复提问检测的任务。在此篇文章中,笔者会介绍Quora工程师在过去几周内将这份数据集与深度学习技术相结合,做了哪些探索性的研究。
问题定义
严格来说,重复检测的问题可以定义为这类形式:已知两个问题q1和q2,训练模型来逼近公式:
f(q1, q2) → 0 or 1
1表示q1和q2两个问题非常相似,反之则为0。
一种简单的重复检测方法是基于词语的比较。举个例子,我们可以采用标准的基于词的信息检索方法,比如
tfidf
或者
BM25
,来比较两个问题的相似度,若相似度超过阈值则判断为重复问题。但是,Quora的工程师认为若想更进一步的在语义或者意图层面判断相似性,就需要用更智慧的方法。其实,在自然语言处理界,一直有科研人员在研究这方面问题[1-3]。
Quora的方法
目前Quora生产环境中所用的是基于大量人工提取特征的随机森林模型,特征包括了词向量加权平均的余弦相似度,常用词的数量,问题标记的常用话题标签,以及词语的词性标签。
受到近年来深度学习技术的启发,笔者和同事们尝试了三种端到端的深度学习方法试图解决这一问题。由于都是端到端的深度学习方法,节省了大量的提取复杂特征的时间和精力。
他们的第一种方法是采用递归神经网络(RNN)。具体说来,用到的是RNN的变种,长短期记忆网络(LSTM),相比RNN后者能更好地捕获长期依赖信息。他们利用Quora自己的文本集训练了词向量,将词向量结合来表示一个问题,然后将两个问题的词向量表示都送入表示层。然后将输出的两个向量拼接送入下一层网络,计算最终的分类结果。下图是此方法的示意图:
图1:方法1的示意图(向量拼接的LSTM)
在探索第二种方法时,作者采用了Tai,Socher的方法构建特征:(1)距离,即两个向量之差的平方和;(2)角度,即两个向量逐点相乘之积。这两维特征也被传入神经网络模型。与前一种方法类似,这也属于LSTM网络,但不是将两个表示向量直接拼接,而是