当前位置: 首页 > 如何判断两段文本说的是「同一件事情」?

话题:

如何判断两段文本说的是「同一件事情」?

【潘超的回答(78票)】:

刚刚被邱锡鹏大神赞了。。好激动。。这两天正好在看相关方向的论文,在原回答后面又补充回答一下attention based method, 怎样的siamese architecture, 不同的distance metrics,甚至怎样利用unsupervised pretraining在数据量有限的情况下尽量地generalize model达到最佳效果。欢迎吐嘈

----------------------

虽然问题放出来才七天,但感觉有种要歪楼的趋势,逼得不研究这个的工业狗来强答一波真的好吗。

首先先反对说这事做不了的,Paraphrase Identification即使是短文本的我感觉做的已经很不错了。微软的Microsoft Research Paraphrase Corpus (MSRP)数据集就是来搞这个事情的。这里贴一下地址Paraphrase Identification (State of the art) 所有引用这个数据集的最高的F score已经到85.9%了,还是在training data只有4000+句子的基础上啊。这么小的数据自然需要加很多额外的feature才能跑得好,所以dependency tree啊wordnet啊的方法表现都很不错。SRL (Semantic Role Labelling)的结果也可以加进来当作feature啊,但纯用information extraction来做的方法我是不支持的,能作用到的句子范围太窄了

而如果你的数据量本身比较大的话完全可以尝试end-to-end的方法啊,省时省力迁移性也好。Quora作为一个国外知乎前些时间放出了一个公共数据集,用于检测问题是否是duplicated (下载地址First Quora Dataset Release: Question Pairs).

这里面有很多干扰项,比如有些相关而非意思相同的问题。对这个问题Quora自家放出一个benchmark,是基于LSTM的,请看这里Semantic Question Matching with Deep Learning

结构非常简单,就是把一对问题Embedding了以后想办法用LSTM encode成representation再计算距离。端到端计算简直完美,然后他们好像并没有放code。但是不贴代码对初学者而言帮助并不大,于是我查了reddit,还真有人用类似的方法实现了,并将代码放在了github上,请移步这里 lampts/my_dl_solutions 据作者称其F1达到了79%,auc达到了92%。数据集本身比较大嘛,并不稀奇。

这显然并不是最优的解法,加了attention的做法效果至少要再好5个百分点,然而我本人并没有实验过,坐等大神们来答state of the art的方法。因为类似的方法拿来做information retrieval based Question Answering基本连代码都不用改,最近也是相当火啊。抱歉中文有没有类似的数据集我不清楚但是方法应该是类似的。

最后顶一下2PiR的答案,希望他能详细说说

---------------------

暂时还没有大神登陆,所以我再自力更生贡献一点干货。我在之前的答案里说了,paraphrase identification和information retrieval based QA很像,为什么呢?因为一个问题的答案(e.g. 天空是蓝色的)从某种角度来看,可以看作是这个问题的paraphrase (e.g.天空是什么颜色的?)然后,假设我有一堆备选答案,有一些干扰项是相关但并不准确的(e.g.天空下的大地是绿色的),这时搜索引擎如何能排除干扰选项而找到最准确的答案呢?用paraphrase identification的模型一个个去比对备选答案呗,比对相似度最高的那个作为答案(基本是这个思路,当然实际当中不可能遍历去比如)

大家试想如果这个模型训练的好,对于用户的每一个问题,你都能从维基百科里找出最符合答案的一句话来作为回答,这样的成果是不是很诱人?基本上一个问答机器人的雏形就浮出水面了呀。确实不错,所以这一块现在也非常的火。有两个数据集提一下,一个叫insuranceQA,一个叫wikiQA,大家都在这上面跑benchmark。

我前面说了,Quora这个模型显然不是最优的。我下面会列举一些文章,谈谈它们的架构为什么有良好的表现,有代码的也贴贴代码,造福一下大家。

先介绍一下这一篇,APPLYING DEEP LEARNING TO ANSWER SELECTION: A STUDY AND AN OPEN TASK,真是业界良心。说它有良心倒真不是因为它的模型好,而是因为它做了很多实验,把我能想到的结构都试了一遍,这样我就不需要自己去试了,很费时间的。

它最终表示这个框架最好,全连接层和CNN层用的是共享权重(Siamese 结构),而这个P+T是指pooling和tanh层是Q和A分开的,说是这样的结构效果最佳。至于最终他们模型建议用的是GESD距离,而不是cosine similarity距离,CNN的filter加到4000之后模型在insuranceQA上表现最好能到0.65它最终表示这个框架最好,全连接层和CNN层用的是共享权重(Siamese 结构),而这个P+T是指pooling和tanh层是Q和A分开的,说是这样的结构效果最佳。至于最终他们模型建议用的是GESD距离,而不是cosine similarity距离,CNN的filter加到4000之后模型在insuranceQA上表现最好能到0.65

然后下一篇是Attentive Pooling Networks,创新点在于用Q和A的representation构造了一个矩阵G,分别对这个G的row和column做max pooling, 这样就能分别能得到Q和A的attention vector。作为比较简单的attention实现,在wikiQA上表现大概是0.68几

说到这里要吐槽一下不用attention的模型,比如说Quora的模型,单凭一个cosine distance想把error BP传回去,这个也太理想了吧。真正句子之前相似度的比较是多个维度的比较,有word level, syntax level, semantic level,每个level都很微妙而难以捕捉,这时要通过attention机制把能匹配上的先匹配上再来看high-level层面的相似度,这样的模型才make sense不是吗。

还有三篇我想讲,但今天讲不动了。分别是Attentive CNN (Yin and Schütze, 2015) , L.D.C. (Wang et al., 2016) 和 Key-Value Memory Networks for Directly Reading Documents, 他们中间最好的在wikiQA上达到了0.70几,虽然就那么两个百分点,但是启示性是不一样的。所以等我有机会还要好好说说。

接下来要放代码了,这个博客用了keras的实现,是比较简单的Siamese结构用于insuranceQA的,也配有代码Deep Language Modeling for Question Answering using Keras 但是该博主的代码效果并不理想,我觉得有几个原因,一来它Embedding用了fixed的word2vec,大家都知道fixed embedding会挺伤的,二来它cnn filter设太少,三来它Q和A的pooling并没有分开,所以效果真的还好。另外一个github, 效果是不错基本实现了论文中宣称的准确率,但是注释比较少,新手学习曲线有点小高,在这里也贴一下white127/insuranceQA-cnn-lstm

key-value memory network的实现也很多啦,这里贴两个github.com/facebook/Memgithub.com/siyuanzhao/kTensorflow

这里留了一个悬念,怎么用pretrained rnnlm来克服小数据不够用的问题还没说,过两天再来。。。

【KevinXU的回答(7票)】:

谢@Epic Composer邀。现有的答案没答到点子上,还是局限于最简单的word-level文本表示的范畴。

解决这个问题的一个比较简单的思路是语义角色标注(SRL, semantic role labelling)。直观来看,两句话如果指同一件事情(在这里“同一件事情”没有严格的被定义,暂且这么粗略的表述),其predicate-argument的相似性会极高。

SRL是NLP中一个很经典的任务。SRL建立在Frame Semantics的基础上,目的在于figure out who did what do whom. 在信息抽取和对话系统中用的比较多,下面的图很直观了:

现在比较常用的PropBank规定的标准argument如下(比起Frame Semantics粒度更粗一些):

基于传统机器学习模型的SRL多是从上层的句法层面抽取比较复杂的语言学特征。基于深度学习的系统可以以非常简单特征的embedding作为输入,深层网络处理后最后加一层CRF做inference。贴个论文链接End-to-end Learning of Semantic Role Labeling Using Recurrent Neural Networks: aclweb.org/anthology/P/

对这个问题来说,做paraphrase或者text entailment的学习推断也是很好的选择,但可能会相对复杂一些。

最近due太多不详细介绍了,有人看再展开说。

【zpeng的回答(2票)】:

1,分词

2,删除不重要的词和字符

3,分析语句结构,构造相应语义函数

4,文章支持特征进行相似性分析

最后根据相似词语和语句结构分析文章相似性

【HanYang的回答(1票)】:

算是Textural Entailment的应用,可以参见The Stanford Natural Language Inference (SNLI) Corpus:The Stanford Natural Language Processing Group

这个语料库包含了Text、Hypothesis,和一个Judgement标注了Text和Hypothesis的语义是相同的(entailment)/相反的(contradiction)/无法判断的(neutral):

一些模型和准确率:

【santino的回答(1票)】:

不太可能,如果能做到语义识别,那就和人工智能不远了。

但是你试试这些:

1.冬天:能穿多少穿多少;夏天:能穿多少穿多少。

2.剩女产生的原因:一是谁都看不上,二是谁都看不上。

3.单身人的来由:原来是喜欢一个人,现在是喜欢一个人。

4.女致电男友:我到西直门了,你快往地铁站走。如果你到了,我还没到,你就等着吧。如果我到了,你还没到,你就等着吧!

5.两种人容易被甩:一种不知道什么叫做爱,一种不知道什么叫做爱。

6.想和某个人在一起的两种原因:

一种是喜欢上人家,另一种是喜欢上人家。

其他评论里的算法都差得远了,不信你用他们提到的任何一种算法去计算“能穿多少穿多少”和“能穿多少穿多少”是否说的是「同一件事情」,保证程序一脸槽逼。

一模一样的句子意思都不一样,更别提不一样的句子了。

【刘江的回答(0票)】:

article ReID?

【邹二的回答(0票)】:

目前还做不到这么智能,之前这么做过:直接查表得到向量后,经过autoencoder然后算马氏距离,准确率85左右。这种判断是不是一个事实的,还可以用句法+消歧的方式来做,有机会会尝试一下。

【平何的回答(0票)】:

可以用知识图谱相关的技术来解决。

最近正好在做特定领域的多语言短文本相似度判断工作,用到了NLP、知识图谱相关的一些技术,结合题主的问题,说一下大概的思路:

1. 先针对大量的领域语料通过分词、NCR、关键词抽取的方式抽出实体(有条件可以再抽出属性和属性值),然后纠错、去重、消歧等,建立起领域知识图谱。

2. 接下来是建立实体之间的关系,比如苹果手机和iPhone是等价关系,iPhone 8和苹果手机是属于关系,iPhone和iPad分别与苹果公司是从属关系,川普和特朗普是Trump的不同音译名,也是等价关系,中亚五国和哈萨克斯坦是组合关系。

这块工作最难且没有特别系统全面的方法,需要根据不同的情况使用不同的方案,比如音译词可以通过词典先导入一批,然后通过双语语料的训练提高准确性和发现新词;国家这种可以提取地域相关概念库来填充,等等。

3. 定义实体边关系的权重,简单点就是绝对权重,比如等价关系xx分,包含关系xx分;复杂点的话需要考虑到不同实体类别的不同关系的权重,以及关系强弱也设定不同权重。

4. 对短文本分词,抽取并对应到实体、属性和值,然后根据边关系权重计算距离;注意到实体的多义性,需要用到CRF的方法来判断最可能的情况,比如:

“苹果好吃吗”“苹果好看吗”“苹果好用吗”,在三种属性“吃”“看”“用”的情况下,“苹果”是水果的概率还是手机的概率是不一样的,那么三者之间的距离也会有很大差别。

本质来说,是用统计得出规则,人工完善规则,然后应用在具体的场景上。

原文地址:知乎