《Short Text Similarity With Word Embeddings》论文解释
一、概要
本文主要介绍基于词嵌入的短文本相似度计算方法。相比较于其他方法,这种方法的特点在于:
- 几乎不需要任何外部知识(例如不需要语法分析等)
- 不需要手工构造特征
- 此方法计算的是语义相似度,并不是语法或者词型相似度(另一篇文章中提高到LCS、编辑距离等)
- 能够利用多种方式、多种语料获得的词向量(多种方式:word2vec, GLOVE. 多种语料:Wiki等)
二、主要思想
本文的主要思想是利用获得的词向量提取特征,输入到支持向量机中进行分类。因此,文章的重点也集中在如何根据已有的词向量来获取句子的特征。
-
算法伪代码

算法解释:输入:句子对集合,(s1,s2)代表句子1和句子2输入:标签集合,li代表第i个句子对的相关程度(可以是离散的)输入:wordembeddings集合:WEi可以表示为一种词向量,例如通过word2vec在wikipidea数据上得到的向量输入:特征提取器,fei可以理解为一个函数,这个函数的输入是句子对及相应的词向量,输出提取的特征1−10行,对于每一种词向量(第四行),用所有的特征提取器提取特征(第五行),将得到的结果连接在一起。因此我们假设如果有m种词向量,n个特征提取器,那么每个句子对就会提取出m∗n个特征,然后连接在一起,放在F矩阵中。最后一行代表一个分类器,可以选择SVM等。 \begin{aligned} &算法解释:\\ &输入:句子对集合,(s_1,s_2)代表句子1和句子2\\ &输入:标签集合,l_i代表第i个句子对的相关程度(可以是离散的)\\ &输入:word embeddings集合:WE_i可以表示为一种词向量,例如通过word2vec在wikipidea数据上得到的向量\\ &输入:特征提取器,f_{ei}可以理解为一个函数,这个函数的输入是句子对及相应的词向量,输出提取的特征\\ &\quad\quad1-10行,对于每一种词向量(第四行),用所有的特征提取器提取特征(第五行),将得到的结果连接在一起。\\ &因此我们假设如果有m种词向量,n个特征提取器,那么每个句子对就会提取出m*n个特征,然后连接在一起,\\ &放在F矩阵中。\\ &\quad\quad最后一行代表一个分类器,可以选择SVM等。 \end{aligned} 算法解释:输入:句子对集合,(s1,s2)代表句子1和句子2输入:标签集合,li代表第i个句子对的相关程度(可以是离散的)输入:wordembeddings集合:WEi可以表示为一种词向量,例如通过word2vec在wikipidea数据上得到的向量输入:特征提取器,fei可以理解为一个函数,这个函数的输入是句子对及相应的词向量,输出提取的特征1−10行,对于每一种词向量(第四行),用所有的特征提取器提取特征(第五行),将得到的结果连接在一起。因此我们假设如果有m种词向量,n个特征提取器,那么每个句子对就会提取出m∗n个特征,然后连接在一起,放在F矩阵中。最后一行代表一个分类器,可以选择SVM等。 -
伪代码中的词向量
论文中提到可以选择word2vec、GLOVE等已经训练好的词向量,也可以选择这些方法在自己的数据上重新训练。
-
伪代码中的特征提取器
从代码中可以看出,整个算法的难点在于特征提取器(feif_{ei}fei)的构造之上。文章给出了三种特征提取器的构造方法,下面分别介绍。我们应该明确的一点是,特征提取器的目的是从句子对和词向量中提取出句子对的特征,然后用于后续的分类模型之中。
-
Saliency-weighted semantic network
文章首先提到有的论文将词向量的均值代表整个句子,既是Svector=1n∑word∈SwordembeddingS_{vector}=\frac{1}{n}\sum_{word\in S}word_{embedding}Svector=n1∑word∈Swordembedding,并且取得了不错的效果。但是这个方法显然并一定是符合真实情况的,以下图为例:

黑色圈代表一个句子的三个词向量,白色圈代表另一个句子的三个词向量。两个句子中,有一对词语的差别较大(最左边的白圈和最右边的黑圈)。但是两个句子的均值却非常相近,也就是说均值的作用忽略了句子中个别词向量的极大差异。因此文章提出了一种考虑词语分布的计算方法:在这种方法中,常见词的贡献较少,稀有词的贡献较多(和tfidf方法类似)。具体的计算公式如下:
fsts=∑w∈slIDF(w)sem(w,ss)(k1+1)sem(w,ss)+k1(1−b+b∣ss∣avgsl)sem(w,s)=maxw′∈sfsem(w,w′)符号介绍fsts:句子对的相似度,也就是提取到的特征w:词语sl:句子对中比较长的句子ss:句子对中比较短的句子IDF(w):w的文档频率的倒数(参考tfidf的计算方法)sem(w,ss):w词语和ss句子的相似度,采用的计算公式是取w和ss中各个词语相似度的最大值,至于词语和词语之间的相似度,可以利用cos相似度计算(既是fsem)k1,b:超参数 \begin{aligned} &f_{sts}=\sum_{w\in s_l}IDF(w)\frac{sem(w,s_s)(k_1+1)}{sem(w,s_s)+k_1(1-b+b\frac{|s_s|}{avgsl})}\\ &sem(w,s)=\max_{w^{'}\in s}f_{sem}(w,w^{'})\\ &符号介绍\\ &f_{sts}:句子对的相似度,也就是提取到的特征\\ &w: 词语\\ &s_l:句子对中比较长的句子\\ &s_s:句子对中比较短的句子\\ &IDF(w):w的文档频率的倒数(参考tfidf的计算方法)\\ &sem(w,s_s):w词语和s_s句子的相似度,采用的计算公式\\&是取w和s_s中各个词语相似度的最大值,至于词语和词语之间的\\&相似度,可以利用cos相似度计算(既是f_{sem})\\ &k_1,b:超参数 \end{aligned} fsts=w∈sl∑IDF(w)sem(w,ss)+k1(1−b+bavgsl∣ss∣)sem(w,ss)(k1+1)sem(w,s)=w′∈smaxfsem(w,w′)符号介绍fsts:句子对的相似度,也就是提取到的特征w:词语sl:句子对中比较长的句子ss:句子对中比较短的句子IDF(w):w的文档频率的倒数(参考tfidf的计算方法)sem(w,ss):w词语和ss句子的相似度,采用的计算公式是取w和ss中各个词语相似度的最大值,至于词语和词语之间的相似度,可以利用cos相似度计算(既是fsem)k1,b:超参数
这个参考自BM25公式,可以类比一下。关于公式的解释-
为什么遍历长句子,而不是短句子
主要是出于下面考虑。(1)为了保证计算的对称性。计算的对称性,是指句子对中无论第一个是长句子还是短句子,我们都选择以长句子为基准进行遍历,这样(s1,s2)(s_1,s_2)(s1,s2)和(s2,s1)(s_2,s_1)(s2,s1)计算得到的特征就会是相同的。(2)不想有的单词被忽略。以短句为基准进行遍历,有些词语可能不会被遍历到。
-
和BM25的不同
BM25的tfidf矩阵主要考虑的是query中词语和document中词语的匹配,而我们则考虑的是语义之间的匹配。sem(w,s)sem(w,s)sem(w,s)采用的是w和s的最大相似度,而不仅仅是词语的匹配。
可以看出,最后的结果是各个值的和。但实际应用的时候,我们并不是选择和值,而是选择向量形式如下:
fsts[i]=IDF(wi)sem(wi,ss)(k1+1)sem(wi,ss)+k1(1−b+b∣ss∣avgsl) f_{sts}\left[i\right]=IDF(w_i)\frac{sem(w_i,s_s)(k_1+1)}{sem(w_i,s_s)+k_1(1-b+b\frac{|s_s|}{avgsl})} fsts[i]=IDF(wi)sem(wi,ss)+k1(1−b+bavgsl∣ss∣)sem(wi,ss)(k1+1)
假设长句子有n个单词,那么fstsf_{sts}fsts就是一个长度为n的向量。得到这个向量之后,我们再进行bin操作。所谓bin操作,就是划分一个区间,比如[a,b,c],然后统计fstsf_{sts}fsts中位于负无穷到a、a到b、b到c、c到正无穷的数量。例如
fsts=[2,3,1,4,6,3],区间为[2,4]。则位于负无穷到2(包括2)之间的数有2,1,总共有2个。位于2到4之间(包括4)的数有3,3,4,总共有3个位于4到正无穷之间的数有6,总共有1个.因此最后返回[2,3,1] \begin{aligned} &f_{sts}=[2,3,1,4,6,3],区间为[2,4]。\\ &则位于负无穷到2(包括2)之间的数有2,1,总共有2个。\\ &位于2到4之间(包括4)的数有3,3,4,总共有3个\\ &位于4到正无穷之间的数有6,总共有1个.\\ &因此最后返回[2,3,1] \end{aligned} fsts=[2,3,1,4,6,3],区间为[2,4]。则位于负无穷到2(包括2)之间的数有2,1,总共有2个。位于2到4之间(包括4)的数有3,3,4,总共有3个位于4到正无穷之间的数有6,总共有1个.因此最后返回[2,3,1]
这样起到了减少特征数目的作用,区间是超参数,需要事先指定。 -
-
Unweighted semantic network
这是第二种提取特征的方法,对于句子对(s1,s2)(s_1,s_2)(s1,s2),我们计算句子对中每个词语之间的cos相似度,这样就会得到一个n∗mn*mn∗m的矩阵(其中n=∣s1∣,m=∣s2∣n=|s_1|,m=|s_2|n=∣s1∣,m=∣s2∣)。得到这个矩阵之后,我们又构造出两种方法:
- 考虑所有的n∗mn*mn∗m个元素,然后bin操作,操作方法同上,区间不同而已
- 矩阵的每一行取最大值,然后得到的最大值进行bin操作
以上就是算法的全部内容,难点在于特征提取器的构造上。得到特征之后,输入SVM进行分类训练就可以了。
-
三、实验结果

数据集:MSROoB:指的是out−of−the−box−set,也就是训练好的两个word2vec和两个Glove向量。
\begin{aligned}&数据集:MSR\\&OoB:指的是out-of-the-box-set ,也就是训练好的两个word2vec和两个Glove向量。\\\end{aligned}
数据集:MSROoB:指的是out−of−the−box−set,也就是训练好的两个word2vec和两个Glove向量。
4604

被折叠的 条评论
为什么被折叠?



