先考虑这样一个问题,给定若干篇文档集合,怎么从中找出最相似的两篇?
相似性可以由余弦距离衡量。余弦距离公式:
c
o
s
(
a
→
,
b
→
)
=
a
→
∗
b
→
∣
a
∣
∗
∣
b
∣
cos(\overrightarrow{a}, \overrightarrow{b}) = { \overrightarrow{a}*\overrightarrow{b} \over |a|*|b| }
cos(a
,b
)=∣a∣∗∣b∣a
∗b
因此只要把文档表示成向量就可以用余弦距离来衡量了。
在介绍LSA之前,先了解一下向量空间模型。
向量空间模型
假设有
M
M
M篇文档,词表长度为
N
N
N,
向量空间模型把一篇文档表示成M维的向量,若某个单词没有出现在文档中,向量中的对应位置为0, 若单词出现在文档中,向量中对应位置是单词的tf-idf值。这样一篇文档就对应了一个长度为M的向量,就可以用余弦距离计算相似度。
从上面可以看出,向量空间模型具有这样的特点:
- 词与词之间是独立的,没有考虑词的顺序。
比如: 小明喜欢小红和小红喜欢小明的文档向量是一样的。 - 文档向量长度取决于词表大小,大词表得到的文档向量比较稀疏。
- 无法处理一词多义和一义多词的情况
一词多义比如:apple和华为出现在一起很可能表示手机,和香蕉出现在一起很可能表示水果。
一义多词比如:用户搜索"automobile"一词,向量空间模型仅仅会返回包含“automobile”单词的页面,而实际含有“car”的页面也是用户需要的。
LSA
LSA对于一篇文档的初始表示也是和向量空间模型一样,使用词表维度的向量来表示,不过向量内的元素是单词在文档中出现的次数。
假设有
N
N
N篇文档,词表长度为
M
M
M,那么可以得到一个
M
∗
N
M*N
M∗N的矩阵。
奇异值分解,也就是SVD,有一个重要的性质。在奇异值矩阵中按照从大到小排列,奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的
K
K
K个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是
A
M
∗
N
=
U
M
∗
M
Σ
M
∗
N
V
N
∗
N
≈
U
M
∗
K
Σ
K
∗
K
V
K
∗
N
A_{M*N} = U_{M*M}\Sigma_{M*N}V_{N*N} \approx U_{M*K}\Sigma_{K*K}V_{K*N}
AM∗N=UM∗MΣM∗NVN∗N≈UM∗KΣK∗KVK∗N
把上面的SVD应用到主题模型,可以这么解释:k是主题数,经过SVD分解后,
U
i
,
l
U_{i, l}
Ui,l对应第i个单词档和第l个词义类的相关性,矩阵
U
U
U就是词-词义类矩阵,
V
l
,
j
V_{l, j}
Vl,j表示第j篇文档与第l个主题的相关性,矩阵
V
V
V是主题-文档矩阵。
Σ
l
,
l
\Sigma_{l,l}
Σl,l表示第l个词义类与第l个主题之间的相关性。
这样通过一次SVD,就可以得到文档和主题的相关度,词和词义的相关度以及词义和主题的相关度。
下图是一个简单的例子。
从矩阵
U
k
U_k
Uk我们可以看到词和词义之间的相关性。而从
V
k
V_k
Vk可以看到3个文本和两个主题的相关性。大家可以看到里面有负数,所以这样得到的相关度比较难解释。
将原始的向量转化到一个低维的隐含语义空间中,而保留下来的维度(根据奇异值大小决定)所对应的奇异值就对应了每个“隐含语义”的权重,去掉的那些维度就相当于把那些不重要的“隐含语义”的权重赋值为0。
可以看到,LSA相比向量空间模型有一些优点,
- LSI可以捕获一些基础语言方面的信息,比如同义,解决了一义多词的问题,同义词对应相同或相似的主题。
- 降维可去除部分噪声,使特征更鲁棒,向量空间模型中,文档向量长度为词表长度,而这里文档向量长度为k。
但LSA也有很多不足之处:
- 没能解决一词多义
- LSA得到的不是一个概率模型,比如出现了负数等,所以对结果难以解释。
- 具有词袋模型的缺点,忽略了词序
- SVD分解复制度高
- 主题数k的选取对结果影响较大
参考:https://www.jianshu.com/p/9fe0a7004560
https://www.cnblogs.com/pinard/p/6805861.html