纯属个人理解,有什么问题,欢迎指正,一起谈论。
应用和困难:
求解句子(短文本)相似在现实场景中有很多的应用,如信息检索方面;新闻推荐方面,根据用户浏览的新闻标题,推荐相似标题的新闻,或者其它方面的推荐;智能客服,根据用户输入的问题,自动为用户寻找相似的问题或者答案等。但计算句子相似性面临很大的挑战,使用有监督方法,中文语料非常少。至于无监督方法,不能像word2vector那样,没有一个理想的方法去建模句向量。其次,不好定义similarity,到底是评估两句话表达一个meaning,还是说的表达的topic一致。
方法探索:
求句子相似性,一般将句子表示成句向量,然后用cos值或者欧式等距离来评估两个句子的相似性。所以主要核心问题还是怎样将一个句子表示成具有语义信息的句向量。基本上分两个大方面。
第一:直接学习句向量模型sentence modeling,由于有标签的语料很少,多数从无监督方法出发。实验过两篇论文方法,A Hierarchical NeuralAutoencoder for Paragraphs and Documents以及Skip-Thought Vectors。两篇papers基本思路都是通过一个LSTM做encode对句子进行编码,得到句向量,然后用一个LSTM做为decode,对句子向量进行解码,不同在于softmax分类层,前一篇paper是解码自身的每个词,
后一篇paper是解码该句子上下文中句子的每个词。
都是End-to-End的学习方式,中间表示结果为句子向量。计算句子相似性的效果不理想。觉得主要原因在于,两种方法通过在解码阶段对句子中的每个词进行还原,还是从句子中词的Label训练模型,另一个原因是,模型构造没有从计算句子相似性目的出发,不像词向量的学习,相同上下文对应的中心词在语义上是相似的,两种方法仅是通过解码自身的句子或者上下文句子,所以学到的词向量不具有很好的语义信息。
第二:从词word level出发,通过组合句子中的词向量来表达句子向量。但是中文一词多用,所以相同的词不同组合构成的句子可能完全是两个不同的意思,这也导致了直接从word level出发,难免会存在问题。但是词向量的学习具有语义信息,用句子的词向量表达句向量,虽然存在缺陷,但目前来看,相对稳定些。
最简单的方法是,对句子中的词向量相加求平均,作为句子的句向量。可以作为一个baseline方法。后面有不少paper都是针对这baseline做的改进,因为句子中的每个词在句子中重要性是有差异的。有通过计算词频的tf-idf权重,也有自学习权重。
论文一:Sentence similarityMeasures for Fine-Grained Estimation of Topical Relevance in Learner Essays论文通过学习的方式,去学习每个词的权重。认为句向量u与相邻的句向量v在语义上更加相似,与它较远的句向量z语义不相似,其中的句向量也是通过词向量的加权和求得,通过最小化代价函数max(uz-uv, 0),来优化每个词的权重。
论文二:A simple but tought-to-beat baseline for sentenceembeddings也是通过将句子中的词向量加权求和得到,其中每个词的权重为:weights = a / (a + p(w)),a是一个定值,p(w)是每个词在语料库中出现的概率值。得到句向量后,再pca。
论文三:From word Embeddings to Document Distances最小化两个句子中词向量的全局距离之后,用emd来计算两个句子的相似性。
样本测试案例:
论文一自学习权重方法(auto) ,论文二sif权重+pca方法(sif_pca)论文三emd方法(emd),平均词向量方法(aver)以及调用百度(baidu)求解句子相似性的测试效果
|
小儿腹泻偏方 |
大家都爱看喜剧 |
红米更新出错 |
auto |
宝宝拉肚子偏方 0.744 |
很多人喜欢看幽默的电影 0.842 |
红米升级系统出错 0.921 |
小儿感冒偏方 0.969 |
电影分很多类型 0.388 |
红米账户出错 0.751 |
|
腹泻偏方 0.952 |
他是一个幽默的人 0.322 |
如何买到小米手机 0.723 |
|
sif-pca |
宝宝拉肚子偏方 0.721 |
很多人喜欢看幽默的电影 0.842 |
红米升级系统出错 0.937 |
小儿感冒偏方 0.939 |
电影分很多类型 0.370 |
红米账户出错 0.844 |
|
腹泻偏方 0.964 |
他是一个幽默的人 0.791 |
如何买到小米手机 0.700 |
|
emd |
宝宝拉肚子偏方 0.619 |
很多人喜欢看幽默的电影 0.378 |
红米升级系统出错 0.907 |
小儿感冒偏方 0.917 |
电影分很多类型 0.221 |
红米账户出错 0.993 |
|
腹泻偏方 0.916 |
他是一个幽默的人 0.266 |
如何买到小米手机 0.260 |
|
aver |
宝宝拉肚子偏方 0.389 |
很多人喜欢看幽默的电影 0.892 |
红米升级系统出错 0.925 |
小儿感冒偏方 0.937 |
电影分很多类型 0.744 |
红米账户出错 0.917 |
|
腹泻偏方 0.965 |
他是一个幽默的人 0.819 |
如何买到小米手机 0.711 |
|
baidu |
宝宝拉肚子偏方 0.90 |
很多人喜欢看幽默的电影 0.630 |
红米升级系统出错 0.90 |
小儿感冒偏方 0.740 |
电影分很多类型 0.501 |
红米账户出错 0.778 |
|
腹泻偏方 0.810 |
他是一个幽默的人 0.501 |
如何买到小米手机 0.263 |
总结:
对于短文本如query,基于从world level方面建模句向量虽然过于粗暴,但不是特别难理解的句子,基本还work
对于长句,在绝大部分词语相同时,整句话的意思也很有可能南辕北辙,基于词向量构建句向量,不能捕捉句子语法结构信息,利用词法分析,能够model到语法结构对句子相似度的影响或许可能改进效果。