向AI转型的程序员都关注了这个号 👇👇👇
机器学习AI算法工程 公众号: datayx
句子相似度计算,即给定客服里用户描述的两句话,用算法来判断是否表示了相同的语义。
句子相似度判定
今年和去年前后相继出现了多个关于句子相似度判定的比赛,即得定两个句子,用算法判断是否表示了相同的语义或者意思。 其中第4、5这个2个比赛数据集格式比较像,
2、3 的数据集格式比较像,本仓库基于2、3数据集做实验
下面是比赛的列表:
- 1 Quora Question Pairs
https://www.kaggle.com/c/quora-question-pairs
The goal of this competition is to predict which of the provided pairs of questions contain two questions with the same meaning.
数据集未经过脱敏处理,用真实的英文单词标识
- 2 ATEC学习赛:NLP之问题相似度计算
https://dc.cloud.alipay.com/index#/topic/intro?id=8
问题相似度计算,即给定客服里用户描述的两句话,用算法来判断是否表示了相同的语义。
数据集未经过脱敏处理 示例:
“花呗如何还款” --“花呗怎么还款”:同义问句
“花呗如何还款” -- “我怎么还我的花被呢”:同义问句
“花呗分期后逾期了如何还款”-- “花呗分期后逾期了哪里还款”:非同义问句 对于例子a,比较简单的方法就可以判定同义;对于例子b,包含了错别字、同义词、词序变换等问题,两个句子乍一看并不类似,想正确判断比较有挑战;对于例子c,两句> 话很类似,仅仅有一处细微的差别 “如何”和“哪里”,就导致语义不一致。"""
- 3 CCKS 2018 微众银行智能客服问句匹配大赛
https://biendata.com/competition/CCKS2018\_3/leaderboard/
与基于Quora的的的语义等价判别相同,本次评测任务的主要目标是针对中文的真实客服语料,进行问句意图匹配。集给定两个语句,要求判定两者意图是否相同或者相近。所有语料来自原始的银行领域智能客服日志,并经过了筛选和人工的意图匹配标注。
数据集经过脱敏处理 输入:一般几天能通过审核\ t一般审核通过要多久 输出:1
- 4 CHIP 2018-第四届中国健康信息处理会议(CHIP)
https://biendata.com/competition/chip2018/
本次评测任务的主要目标是针对中文的真实患者健康咨询语料,进行问句意图匹配。给定两个语句,要求判定两者意图是否相同或者相近。所有语料来自互联网上患者真实> 的问题,并经过了筛选和人工的意图匹配标注。平安云将为报名的队伍提供GPU的训练环境。
数据集经过脱敏处理,问题由数字标示 训练集包含20000条左右标注好的数据(经过脱敏处理,包含标点符号),供参赛人员进行训练和测试。 测试集包含10000条左右无label的数据(经过脱敏处理,包含标点> 符号)。选手需要对测试集数据的label进行预测并提交。测试集数据作为AB榜的评测依据。
- 5 第三届魔镜杯大赛
https://ai.ppdai.com/mirror/goToMirrorDetail?mirrorId=1
智能客服聊天机器人场景中,待客户提出问题后,往往需要先计算客户提出问题与知识库问题的相似度,进而定位最相似问题,再对问题给出答案。本次比赛的题目便是问 > 题相似度算法设计。
数据集经过脱敏处理,问题由数字标示 为保护用户隐私并保证比赛的公平公正,所有原始文本信息都被编码成单字ID序列和词语ID序列。单字包含单个汉字、英文字母、标点及空格等;词语包含切词后的中> 文词语、英文单词、标点及空格等。单字ID和词语ID存在于两个不同的命名空间,即词语中的单字词或者标点,和单字中的相同字符及相同标点不一定有同一个ID。其> > 中,单字序列以L开头,词语序列以W开头。
这篇文章想发散开来讲,从传统方法到深度模型,结合赛题的数据特点对文本相似性匹配的方法做一个梳理。以及针对比赛中的技巧做一个总结。
Quora给的题就给定两个quora中的提问。提问数据是类似知乎上的提问标题,判断两个问题是不是一个问题。比如:A.如何学习NLP?
B.怎样学习自然语言处理?这就明显是一个问题。这个题属于NLP中的文本相似性匹配,由于quora构建数据的方式存在图的特征,后来发现其图模型方面也值得研究。以下部分图片来自于Quora第四名YesOfCourse团队的ppt。
文本相似性/相关性度量是NLP和信息检索中非常基础的任务,在搜索引擎,QA系统中有举足轻重的地位,一般的文本相似性匹配,从大的方法来讲,传统方法和深度学习方法。
特征工程方法
传统方法不外乎各种角度的特征工程,我把常用的特征罗列如下,比如
- 编辑距离
编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
例如:
我们有两个字符串: kitten 和 sitting:
现在我们要将kitten转换成sitting
我们可以做如下的一些操作;
k i t t e n –> s i t t e n 将K替换成S
sitten –> sittin 将 e 替换成i
sittin –> sitting 添加g
在这里我们设置每经过一次编辑,也就是变化(插入,删除,替换)我们花费的代价都是1。
FuzzyWuzzy这个python包提供了比较齐全的编辑距离度量方法。
- 集合度量特征
集合度量方式就是把两个句子看成 BOW (bag of words)。然后使用集合相似性度量方法比如Jaccard等。这种方法有一个严重问题就是丢失语序。当然基于集合算重合度的度量方法不止Jaccard,也有很多别的,感兴趣的同学可以了解下。
- 统计特征
比如句子长度,词长度,标点数量,标点种类,以及词性序列上的度量,这也是最直观的度量方法,大家可以发挥自己的想象力把这一部分做丰富一点
- 使用预训练的词向量得到句子表示进行度量
词向量是深度学习进入NLP的非常代表性的工作,谷歌的词向量论文引用了3000+次,可谓影响深远了。
使用词向量的一种简单的方法是,BOW求平均,得到两个句子的表示,然后利用余弦相似度度量或者Minkowski,欧几里得距离等等。这是一种非常简单而直观的方法。
在比赛中我们这篇参考了论文, From Word Embeddings To Document Distances 这篇论文提出的一种叫做WMD的度量方法,七级本原理是利用word2vec的特性,将文本文档表示为一个weighted point cloud of embedded words。两个文档A和B之间的距离定义为A中所有的词移动精确匹配到文档B中点云的最小累积距离。这个思路也非常直觉,实际表现也非常良好‘
- 使用传统方法如tfidf,LDA等topic model等拿到句子表示进行度量
对于LDA和tfidf的句子表示原理在此不做细讲,在实践中我们发现,使用tfidf值对词向量做一个加权,得到的句子表示也是一种不错的表示。
深度模型
深度模型有两种思路,一种是基于表示,一种是基于交互。不过基于交互的模型大多也是先要拿到文本表示,从文本表示构建交互,从交互到特征抽取的思路。其基本的模型如下所示
这是一个非常直观的思路,最后一层的matching score建模方法甚至可以用一个简单的FC代替,或者做一次element-wise 乘之后接FC。下面有在IR中用表示方法做这个问题的几篇论文。
-
DSSM: LearningDeep Structured Semantic Models for
-
WebSearchusing Click-through Data (Huanget al., CIKM’13)
-
CDSSM: Alatentsemanticmodelwith convolutional- poolingstructureforinformationretrieval (ShenY,HeX, Gao J,etal.CIKM’14)
-
ARC I: ConvolutionalNeural NetworkArchitecturesfor MatchingNaturalLanguageSentences(Huet al., NIPS’14)
-
LSTM-RNN:Deep Sentence Embedding Using the Long Short Term MemoryNetwork:Analysis and Application toInformation Retrieval (Palangietal.,TASLP’2016)
基于交互的方法是通过Interaction来对文本相似性建模,其模型基本的原理是。
有一篇非常有意思的文章Text Matching as Image Recognition. (Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. AAAI 2016)这也是庞亮学长在AAAI 2016上的工作,所以他们打这个比赛,完全就是把中科院的模型拉出来遛遛。这个模型也很直觉,就是把两个文本的相似性建模成一张图片,再用CNN做特征抽取器。
-
拿到每个词的embedding。 (embedding)
-
构建两个文本的相似矩阵。 (Interaction)
-
把相似矩阵放入两层CNN中。 (Feature extract)
-
把CNN的结果放入两层的全连接中。 (FC)
-
获得二分类的score。 (distribution)
后来的一些工作都大同小异,比如不直接使用词向量,利用RNN的隐层向量去构建交互等等。具体的文章如下,感兴趣的同学可以看一下。
-
DeepMatch: A Deep Architecture for Matching Short Texts (Lu and Li, NIPS’13)
ARC II: Convolutional Neural Network Architectures for Matching Natural Language Sentences (Hu et al., NIPS’14) -
MatchPyramid: Text Matching as Image Recognition. (Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. AAAI 2016)
-
Match-SRNN: Modeling the Recursive Matching Structure with Spatial RNN. (Shengxian Wan, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. IJCAI 2016)
下面回到这个比赛中,具体结合数据谈一谈。
在比赛中发现,训练集和测试集的正负样本比有明显差异,分布上的差异最后体现在logloss指标上的gap,在比赛中大家推导出一个后处理的公式,然后可以拉平分布带来的分数异动。使用贝叶斯公司能推导出这个后处理,前提是可以测出分布的情况下。有论文对这个做了详细的讲解。"Adjusting the Outputs of a Classifier to New a Priori Probabilities: A SimpleProcedure
https://pdfs.semanticscholar.org/d6d2/2681ee7e40a1817d03c730d5c2098ef031ae.pdf
比赛中一些预处理方法有
-
词元化/词干花
-
停止词删除
-
标点符号清洗
-
特殊符号替换
-
词向量扩充句子得到另一份句子(这个直觉的思路是,利用词向量找相关词的特性,增加传统特征方法的容错性。比如集合度量方法,开心和高兴虽然是一个意思,但是不扩充近义词的话,其容错性很低)
top1 -top 5 详细解决方案获取方式:
关注微信公众号 datayx 然后回复 文本相似性 即可获取。
不得不提的是,这个比赛中有一个非常关键的leak信息。一个问题如果出现频繁的话,就很可能是一个重复的问题。后来发现前几名在这个leak上做了很多文章,取得了非常好的效果。后来CPMP给的解释是:
A question that is asked often has more chances to be redundant. Thanks for sharing.
以第一名的解法为例,他的特征工程中含有大量的来自图的Structural features 。我感觉这部分也是最关键的。第一名的解法有300多个模型做了stacking。简直爆炸。
第四名HouJP学长的,亮点就是深度模型的分数很高,不愧是中科院IR大佬。
第五名的解法也是在图的建模上挖掘了大量的特征。
第七名亮点就是这个人比较懒,花了大量的时间在深度模型上。和第一名都用了一个叫 decomposable attention 的东西。
后来总结一下这个赛题,由于基于图的特征的存在,使得这部分的特征工程尤为重要,这也是我们做的不好的地方。前几名在图上都做了充分的挖掘,体现了强大的特征工程能力。不过这部分东西,单纯的文本相似性/相关性的工作没什么贡献,如果抱着研究目的的同学可以忽略这部分。
由于这是我参加的第一次比赛,所以印象十分深刻。学到了一些对比赛使用的流程性的东西,体会到pipeline的重要性,不过教训也很多,也算一种成长吧。
https://zhuanlan.zhihu.com/p/35093355
阅读过本文的人还看了以下:
《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码
【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类
如何利用全新的决策树集成级联结构gcForest做特征工程并打分?
Machine Learning Yearning 中文翻译稿
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx
长按图片,识别二维码,点关注