没有成对的文本,如何计算语义相似度
1. bert方面的坑
bert计算出来句子之间的相似度很接近,在我的数据集上finetune之后稍微好一点点,用的是cls的输出直接作为句子的向量,然后计算cosine,结果有点翻车,主要问题在:
- 句子之间的距离都很近
- 句子的长短也会影响,相同长度的句子之间距离更接近。针对这个问题,我有尝试把每个字的字向量加起来处以字符数量,但是发现还是一样
后来,看了一个知乎的回答,原文:https://www.zhihu.com/question/354129879
用字向量的pool,效果确实比cls的输出好一些。
此外,cosine只是计算两个向量之间角度的距离大小,如果想换成欧式也行,但其实差距不大。
bert-flow和bert-whitening
2.cilin的坑
词林的效果也不好,还不如bert,不知道是不是方法有问题,我的方法是:计算句子A和句子B中每个词两两之间的距离,然后取距离最近的词,其实就是词移距离了,只不过词之间的距离是用cilin计算的。
这个翻车原因有两个:
- cilin里面的词语还是有限的。
- 只计算词语之间是否相似,词语的重要性。就算是乘上tfidf权重,结果也不好。分析原因有:分词会引入噪声,cilin词典里面也缺少重要的词语,tfidf还好,但整体来看,这个方法是不行的。
用tfidf过滤权重不重要的词,对于短文本来说,能过滤的很少