brightmart / nlp_chinese_corpus

大规模中文自然语言处理语料 Large Scale Chinese Corpus for NLP
MIT License
9.41k stars 1.54k forks source link

怎么从问答数据中创建相似语句从而训练语义相似性模型? #15

Closed leolle closed 5 years ago

leolle commented 5 years ago

请问有人知道怎么通过百科问答来构建语义相似训练数据吗? 目标:语句1 语句2 相似/不相似 谢谢!

yaleimeng commented 5 years ago

没有人力介入的情况下,通过你的输入,应该是无法得到你想要的输出吧。两者没有显而易见的联系

leolle commented 5 years ago

想到一个方法,通过已有的问题对相似的模型,找出相同的问题,然后把这些问题的答案标为相近语句。不知道有没有有人尝试过?

Linusp commented 5 years ago

通过已有的问题对相似的模型,找出相同的问题,然后把这些问题的答案标为相近语句。不知道有没有有人尝试过?

试过把相同答案的问题找出来作为相似问题,效果不好。从几年做问答的经验来看

  1. 问题相同的时候,答案不一定会是表达同样的语义(上下文、用户信息会不一样)
  2. 答案相同的时候,问题不一定会是表达同样的语义

当然也不是不能做,如果你的问答语料是封闭领域的、没有多轮交互的那种,也许能做一下。不过我觉得和直接用模型计算两个句子的相似度然后再交由人工标注来进一步筛选的方法相比,性价比未必更好。

或者这么说吧,我理解你其实是想用已有的模型,从无标注数据里得到一份伪标注数据,希望尽量没有人工标注的过程(如果我理解错了请指出)

  1. 如果你要处理的无标注数据量很少,那么完全没有必要,最后交给人工来标注一下,代价并不会那么高
  2. 如果你要处理的标注数据量很大,这个方法一定是会产生噪声数据的,那么你能接受多大程度的噪声?

一个经验,我试过从日志中挖掘相似句对,出来的结果,可用率差不多是 30%,也就是说,自动挖掘出来的 1000 个相似句对里,实际上只有 300 条是真的相似句对。当然我用的是很简单的办法,就是随机抽两个句子,算相似度,相似度超过一定阈值的就留下来,同时有一些前置、后置规则去除一些垃圾数据。

brightmart commented 5 years ago

不错。办法应该是有的,可以尝试并比较效果的方式:

1、在这些问答语料上上训练的词向量,然后用word2vec得到句子的表示(直接词向量求平均,或word2vec结合tfidf的权重);

2、在这些问答语料上做模型的语言模型的预训练,如用bert做预训练。然后输入一个句子,得到一个向量。对于两个句子,计算余弦相似度。

3、使用这些问答语料上自带的问题类型信息。先训练一个从问题预测问题类型的模型,然后一个问题输入后,得到模型预测类别前的向量(隐藏向量),用这个向量做相似度计算。

4、基于这些问答语料,构建一个搜索引擎(如es),输入一批问题(q1),得到搜索引擎提供的一批问题(q_candidate1, q_candidate2, q_candidate3)。人工标注一部分相似的句子对(q1, q_candidate1,1);做负采样,得到一批(q1, q_other,0)

5、训练一个相关性模型,用来做相似性。如问题和问答对应的答案为1 (question1,answer1,1),问题和其他答案为0(question1,answer_other,1)。那么训练完后给定两个句子,也能给出一个相关性或相似性的概率,取值在0到1直接。