文章目录
潜在语义分析(latent semantic analysis, LSA)是一种无监督方法,主要用于文本的话题分析。其特点是通过对 单词-文本矩阵进行进行奇异值分解,从而得到 话题向量空间和 文本在话题向量空间中的表示。
单词-文本矩阵
给定
n
n
n 个文本集合
D
=
{
d
1
,
d
2
,
…
d
n
}
D = \{d_1,d_2,\ldots d_n\}
D={d1,d2,…dn},以及在所有文本中出现的
m
m
m 个单词的集合
W
=
{
w
1
,
w
2
,
…
,
w
m
}
W = \{w_1,w_2,\ldots,w_m\}
W={w1,w2,…,wm} 。单词-文本矩阵如下:
X
=
[
x
11
x
12
⋯
x
1
n
x
21
x
22
⋯
x
2
n
⋮
⋮
⋮
x
m
1
x
m
2
⋯
x
m
n
]
X= \left[ \begin{matrix} x_{11}&x_{12}&\cdots&x_{1n}\\ x_{21}&x_{22}&\cdots&x_{2n}\\ \vdots&\vdots&&\vdots\\ x_{m1}&x_{m2}&\cdots&x_{mn} \end{matrix} \right]
X=⎣⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2⋯⋯⋯x1nx2n⋮xmn⎦⎥⎥⎥⎤
每个列向量
x
⋅
j
x_{ \cdot j}
x⋅j对应文本 j 的不同单词,
x
i
,
j
x_{i,j}
xi,j表示第 j 个文本中第 i 个单词
w
i
w_i
wi的权值。权值可以是单词的在文本的出现次数,也可以是其他的数值,例如TD-IDF值:
T
F
I
D
F
i
j
=
t
f
i
j
t
f
⋅
j
log
d
f
d
f
i
i
=
1
,
2
,
⋯
,
m
;
j
=
1
,
2
,
⋯
,
n
TFIDF_{ij}=\frac{tf_{ij}}{tf_{\cdot j}}\log\frac{\mathrm{d}f}{\mathrm{d}f_i}\\ i=1,2,\cdots,m;\\ j=1,2,\cdots,n
TFIDFij=tf⋅jtfijlogdfidfi=1,2,⋯,m;j=1,2,⋯,n
t
f
i
j
tf_{ij}
tfij 是单词
w
i
w_i
wi 出现在文本
d
j
d_j
dj 中的频数,
t
f
.
j
tf_{.j}
tf.j 是文本
d
j
d_j
dj 中出现所有单词的频数之和,所以
t
f
i
j
t
f
⋅
j
\frac{tf_{ij}}{tf_{\cdot j}}
tf⋅jtfij可以表示单词
w
i
w_i
wi在当前文本的出现次数的占比。一个单词在一个文本中出现的频数越高,这个单词在这个文本中的重要度就越高,即
t
f
i
j
t
f
⋅
j
\frac{tf_{ij}}{tf_{\cdot j}}
tf⋅jtfij 越大 ;
d f df df 是文本集合D的全部文本集, d f i df_i dfi 是含有单词 w i w_i wi 的文本数。一个单词在整个文本集合中出现的文本数越少,这个单词就越能表示其所在文本的特点,重要度就越高,即 log d f d f i \log\frac{\mathrm{d}f}{\mathrm{d}f_i} logdfidf 越大;
一个单词在一个文本的TF-IDF是两种重要度的积,表示综合重要度。
单词-文本矩阵的每个列向量对应一个文本,两个列向量之间的的余弦相似度表示对应文本之间的语义相似度。
缺点:单词向量通常是稀疏的。没有考虑到在自然语言处理中的一词多义以及多词一义,所以基于词向量的相似度计算不精确。
话题向量空间
两个文本的相似度可以体现在话题的相似度上。一个文本一般包含若干个话题,如果两个文本相似,那么这两个应该有相似的话题。
可以设想定义一种话题向量空间模型,进而可以用话题向量来表示文本。这个向量的每一个分量都对应一个话题,分量的数值大小为该话题在文本中的权值。实际上,潜在语义分析正是构建话题向量空间的方法。
给定 单词-文本矩阵 如下:
X
=
[
x
11
x
12
⋯
x
1
n
x
21
x
22
⋯
x
2
n
⋮
⋮
⋮
x
m
1
x
m
2
⋯
x
m
n
]
X=\left[\begin{matrix}x_{11}&x_{12}&\cdots&x_{1n}\\x_{21}&x_{22}&\cdots&x_{2n}\\\vdots&\vdots&&\vdots\\x_{m1}&x_{m2}&\cdots&x_{mn}\end{matrix}\right]
X=⎣⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2⋯⋯⋯x1nx2n⋮xmn⎦⎥⎥⎥⎤
X 也可以写作:
X
=
[
x
1
x
2
⋅
⋅
⋅
x
n
]
X=[x_1 \;\; x_2 \;\; ··· \;\; x_n]
X=[x1x2⋅⋅⋅xn]。
假设所有文本共含有
k
k
k 个话题,每个话题由定义在单词集合W的m维向量表示,称为话题向量,即:
t
l
=
[
t
1
l
t
2
l
⋮
t
m
l
]
,
l
=
1
,
2
,
.
.
.
k
t_l = \left[ \begin{matrix} &t_{1l} \\ &t_{2l} \\ &\vdots \\ &t_{ml} \\ \end{matrix} \right], l=1,2,...k
tl=⎣⎢⎢⎢⎡t1lt2l⋮tml⎦⎥⎥⎥⎤,l=1,2,...k
其中,
t
i
l
t_{il}
til是单词
w
i
w_i
wi在话题
t
l
t_l
tl的权重,权重越大,则该单词在话题中的重要程度越高。k个话题向量
t
l
t_l
tl张成话题向量空间,维度为k。
话题向量空间 T 也可以表示为一个矩阵,称之为单词—话题矩阵 如下:
T
=
[
t
11
t
12
⋯
t
1
k
t
21
t
22
⋯
t
2
k
⋮
⋮
⋮
t
m
1
t
12
⋯
t
m
k
]
T=\left[ \begin{matrix} &t_{11} &t_{12} &\cdots &t_{1k} \\ &t_{21} &t_{22} &\cdots &t_{2k} \\ &\vdots &\vdots & &\vdots \\ &t_{m1} &t_{12} &\cdots &t_{mk} \\ \end{matrix} \right]
T=⎣⎢⎢⎢⎡t11t21⋮tm1t12t22⋮t12⋯⋯⋯t1kt2k⋮tmk⎦⎥⎥⎥⎤
总共有k列,每个列向量
t
l
t_l
tl对应一个话题,每一行的元素
t
i
l
t_{il}
til代表单词
w
i
w_i
wi在话题
t
l
t_l
tl中的权值。
文本在话题向量空间中的表示
现在考虑将文本
d
j
d_j
dj在单词向量空间的向量投影到话题向量空间,用话题向量空间中的向量
y
j
y_j
yj表示,
y
j
y_j
yj是个k维的列向量,表达式为:
y
j
=
[
y
1
j
y
2
j
⋮
y
k
j
]
,
j
=
1
,
2
,
.
.
.
,
n
y_j =\left[ \begin{matrix} &y_{1j} \\ &y_{2j} \\ &\vdots \\ &y_{kj} \\ \end{matrix} \right],j=1,2,...,n
yj=⎣⎢⎢⎢⎡y1jy2j⋮ykj⎦⎥⎥⎥⎤,j=1,2,...,n
元素
y
l
j
y_{lj}
ylj表示文本
d
j
d_j
dj在话题
t
l
t_l
tl的权重,权重越大,说明该话题的重要程度越高。
由n个文本在话题向量空间向量
y
j
y_{j}
yj构成的矩阵,称之为话题—文本矩阵:
Y
=
[
y
11
y
12
⋯
y
1
n
y
21
y
22
⋯
y
2
n
⋮
⋮
⋮
y
k
1
y
k
2
⋯
y
k
n
]
Y=\left[ \begin{matrix} &y_{11} &y_{12} &\cdots &y_{1n} \\ &y_{21} &y_{22} &\cdots &y_{2n} \\ &\vdots &\vdots & &\vdots \\ &y_{k1} &y_{k2} &\cdots &y_{kn} \\ \end{matrix} \right]
Y=⎣⎢⎢⎢⎡y11y21⋮yk1y12y22⋮yk2⋯⋯⋯y1ny2n⋮ykn⎦⎥⎥⎥⎤
每个列向量对应一个文本,每一行对应话题
t
l
t_l
tl ,元素
y
l
j
y_{lj}
ylj代表文本
d
j
d_j
dj 在话题
t
l
t_l
tl中出现的权值。也可以记作
Y
=
[
y
1
y
2
⋅
⋅
⋅
y
n
]
Y=[y_1 \;\; y_2 \;\; ··· \;\; y_n]
Y=[y1y2⋅⋅⋅yn]。
从单词向量空间到话题向量空间的线性变换
潜在语义分析的思想,就是单词向量空间变换到话题向量空间,通过矩阵的因子分解,将单词—文本矩阵X近似的用单词—话题矩阵
T
T
T 与话题—文本矩阵
Y
Y
Y 的乘积表示,即:
X
≈
T
Y
X \approx TY
X≈TY
如下图所示:
在原始的单词向量空间中,两个文本 d i d_i di与 d j d_j dj的相似度可以由对应的向量的内积表示,即 d i ⋅ d j d_i \cdot d_j di⋅dj。经过潜在语义分析之后,在话题向量空间中,两个文本 d 1 d_1 d1与 d 2 d_2 d2的相似度可以由对应的向量的内积即 y i ⋅ y j y_i \cdot y_j yi⋅yj表示。简单来说就是从文本单词的相似度的计算,转换为文本主题的相似度的计算。
潜在语义分析算法
矩阵奇异值(SVD)分解算法
给定文本集合
D
=
{
d
1
,
d
2
,
⋯
,
d
n
}
D=\{d_1, d_2,\cdots,d_n\}
D={d1,d2,⋯,dn},单词集合
W
=
{
w
1
,
w
2
,
⋯
,
w
m
}
W=\{w_1,w_2,\cdots,w_m\}
W={w1,w2,⋯,wm},则单词-文本矩阵
X
m
×
n
X_{m\times n}
Xm×n:
X
=
[
x
11
x
12
⋯
x
1
n
x
21
x
22
⋯
x
2
n
⋮
⋮
⋮
x
m
1
x
m
2
⋯
x
m
n
]
X=\left[ \begin{matrix} &x_{11} &x_{12} &\cdots &x_{1n} \\ &x_{21} &x_{22} &\cdots &x_{2n} \\ &\vdots &\vdots & &\vdots\\ &x_{m1} &x_{m2} &\cdots &x_{mn} \\ \end{matrix} \right]
X=⎣⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2⋯⋯⋯x1nx2n⋮xmn⎦⎥⎥⎥⎤
潜在语义分析根据确定的话题个数k对单词-文本矩阵进行截断奇异值分解:
X
≈
U
k
Σ
k
V
k
T
=
[
u
1
u
2
⋯
u
k
]
[
σ
1
0
0
0
0
σ
2
0
0
0
0
⋱
0
0
0
0
σ
k
]
[
v
1
T
v
2
T
⋮
v
k
T
]
X\thickapprox U_k{\Sigma_k}V_k^\mathrm{T} \bf =\left[ \begin{matrix} u_1 &u_2 &\cdots &u_k \end{matrix} \right] \left[ \begin{matrix} \sigma_1 &0 &0 &0\\ 0 &\sigma_2 &0 &0 \\ 0 &0 &\ddots &0\\ 0 &0 &0 &\sigma_k \end{matrix} \right] \left[ \begin{matrix} v_1^\mathrm{T}\\ v_2^\mathrm{T}\\ \vdots\\ v_k^\mathrm{T} \end{matrix} \right]
X≈UkΣkVkT=[u1u2⋯uk]⎣⎢⎢⎡σ10000σ20000⋱0000σk⎦⎥⎥⎤⎣⎢⎢⎢⎡v1Tv2T⋮vkT⎦⎥⎥⎥⎤
这中间
k
≤
n
≤
m
k\le n \le m
k≤n≤m 这里假设了文档数量要比单词数量少。
其中:
(1)
U
k
U_k
Uk是
m
×
k
m\times k
m×k 矩阵,由X的前
k
k
k个相互正交的左奇异向量组成,
U
k
U_k
Uk 每一列
u
l
u_l
ul表示一个话题,
k
k
k个话题张成一个子空间,称为话题向量空间:
U
k
=
[
u
1
u
2
⋯
u
k
]
U_k=\left[\begin{matrix}u_1&u_2&\cdots&u_k\end{matrix}\right]
Uk=[u1u2⋯uk]
(2)
Σ
k
\Sigma_k
Σk是
k
k
k阶方阵,由X的前
k
k
k个最大奇异值组成;
(3) V k V_k Vk是 n × k n\times k n×k矩阵,由X的前 k k k个相互正交的右奇异向量组成。
Σ
k
V
k
T
{\Sigma_k}V_k^\mathrm{T}
ΣkVkT两个矩阵的乘积,则对应了话题-文本矩阵(文本在话题空间的向量表示)。所以,矩阵
X
X
X 的第
j
j
j列向量
x
j
x_j
xj 满足:
x
j
≈
U
k
(
Σ
k
V
k
T
)
j
=
[
u
1
u
2
⋯
u
k
]
[
σ
1
v
j
1
σ
2
v
j
2
⋮
σ
k
v
j
k
]
=
∑
l
=
1
k
σ
l
v
j
l
u
l
,
j
=
1
,
2
,
⋯
,
n
\begin{aligned} x_j&\thickapprox U_k(\Sigma_k V_k^\mathrm{T})_j\\ &= \left[ \begin{matrix} u_1& u_2& \cdots& u_k \end{matrix} \right] \left[ \begin{matrix} \sigma_1v_{j1}\\ \sigma_2v_{j2}\\ \vdots\\ \sigma_kv_{jk} \end{matrix} \right] \\ &=\sum_{l=1}^k\sigma_lv_{jl}u_l,j=1,2,\cdots,n \end{aligned}
xj≈Uk(ΣkVkT)j=[u1u2⋯uk]⎣⎢⎢⎢⎡σ1vj1σ2vj2⋮σkvjk⎦⎥⎥⎥⎤=l=1∑kσlvjlul,j=1,2,⋯,n
式中:
(
Σ
k
V
k
T
)
j
(\Sigma_k V_k^\mathrm{T})_j
(ΣkVkT)j 是矩阵
(
Σ
k
V
k
T
)
(\Sigma_k V_k^\mathrm{T})
(ΣkVkT) 的第
j
j
j 列向量。矩阵
(
Σ
k
V
k
T
)
j
(\Sigma_k V_k^\mathrm{T})_j
(ΣkVkT)j的每一个列向量:
[
σ
1
v
11
σ
2
v
12
⋮
σ
k
v
1
k
]
,
[
σ
1
v
21
σ
2
v
22
⋮
σ
k
v
2
k
]
,
…
,
[
σ
1
v
n
1
σ
2
v
n
2
⋮
σ
k
v
n
k
]
\left[ \begin{matrix} \sigma_1v_{11}\\ \sigma_2v_{12}\\ \vdots\\ \sigma_kv_{1k} \end{matrix} \right] , \left[ \begin{matrix} \sigma_1v_{21}\\ \sigma_2v_{22}\\ \vdots\\ \sigma_kv_{2k} \end{matrix} \right], \ldots, \left[ \begin{matrix} \sigma_1v_{n1}\\ \sigma_2v_{n2}\\ \vdots\\ \sigma_kv_{nk} \end{matrix} \right]
⎣⎢⎢⎢⎡σ1v11σ2v12⋮σkv1k⎦⎥⎥⎥⎤,⎣⎢⎢⎢⎡σ1v21σ2v22⋮σkv2k⎦⎥⎥⎥⎤,…,⎣⎢⎢⎢⎡σ1vn1σ2vn2⋮σkvnk⎦⎥⎥⎥⎤
是n个文本在话题向量空间的表示。
所以,通过矩阵的SVD分解进行潜在语义分析:
X
≈
U
k
Σ
k
V
k
T
=
U
k
(
Σ
k
V
k
T
)
X\approx U_k{\Sigma_k}V_k^\mathrm{T} =U_k({\Sigma_k}V_k^\mathrm{T})
X≈UkΣkVkT=Uk(ΣkVkT)
从而得到了话题空间
U
k
U_k
Uk,以及文本在话题空间的表示
(
Σ
k
V
k
T
)
({\Sigma_k}V_k^\mathrm{T})
(ΣkVkT) 。
非负矩阵(NMF)分解算法
除了可以使用SVD分解,还可以使用非负矩阵分解算法。
基本思想
对单词—文本矩阵进行非负矩阵分解,将其左矩阵作为话题向量空间,将其右矩阵作为文本在话题向量空间的表示。
设单词—文本矩阵是
m
×
n
m\times n
m×n的非负矩阵
X
X
X,文本集合包含
k
k
k个话题,对
X
X
X进行非负矩阵分解。即求
m
×
k
m\times k
m×k的非负矩阵和
k
×
n
k\times n
k×n的非负矩阵满足
X
≈
W
H
X\thickapprox WH
X≈WH
其中:
W
=
[
w
1
w
2
⋯
w
k
]
W=\left[\begin{matrix}w_1& w_2& \cdots& w_k\end{matrix}\right]
W=[w1w2⋯wk]表示话题向量空间,
w
1
,
w
2
,
⋯
,
w
k
w_1, w_2, \cdots, w_k
w1,w2,⋯,wk表示文本集合的
k
k
k个话题。
H
=
[
h
1
h
2
⋯
h
k
]
H=\left[\begin{matrix}h_1& h_2& \cdots& h_k\end{matrix}\right]
H=[h1h2⋯hk]表示文本在话题向量空间的表示,
h
1
,
h
2
,
⋯
,
h
k
h_1, h_2, \cdots, h_k
h1,h2,⋯,hk表示文本集合的
n
n
n个文本。
损失函数
使用迭代的方法进行学习,则可以使用的损失函数有:
(1)平方损失
目标函数:
min
W
,
H
∣
∣
X
−
W
H
∣
∣
2
s
.
t
.
W
,
H
≥
0
\min\limits_{W,H}||X - WH||^2 \\ s.t. \quad W,H \ge 0
W,Hmin∣∣X−WH∣∣2s.t.W,H≥0
(2)散度损失函数
首先看看散度的定义:
D
(
A
∣
∣
B
)
=
∑
i
,
j
(
a
i
j
log
a
i
j
b
i
j
−
a
i
j
+
b
i
j
)
D(A||B) = \sum_{i,j} \left(a_{ij}\log\frac{a_{ij}}{b_{ij}} - a_{ij} + b_{ij}\right)
D(A∣∣B)=i,j∑(aijlogbijaij−aij+bij)
称为非负矩阵A和B的散度损失函数。其下界时0,当且仅当A=B时达到下届。
当 ∑ i j a i j = ∑ i j b i j = 1 \sum_{ij}a_{ij} = \sum_{ij}b_{ij}=1 ∑ijaij=∑ijbij=1 时,散度损失函数退化为KL散度或相对熵。
所以右散度损失函数为:
min
W
,
H
D
(
X
∣
∣
W
H
)
s
.
t
.
W
,
H
≥
0
\min \limits_{W,H} D\left(X||WH\right) \\ s.t. \quad W,H \ge 0
W,HminD(X∣∣WH)s.t.W,H≥0
迭代学习算法
(1)平方损失函数更新法则
J ( W , H ) = 1 2 ∥ X − W H ∥ 2 = 1 2 ∑ i , j [ X i j − ( W H ) i j ] 2 J(W,H)=\frac{1}{2}\|X-WH\|^2=\frac{1}{2}\sum_{i,j}[X_{ij}-(WH)_{ij}]^2 J(W,H)=21∥X−WH∥2=21i,j∑[Xij−(WH)ij]2
采用梯度下降法求解,这里用到了矩阵求导
∂
J
(
W
,
H
)
∂
W
i
l
=
−
∑
j
[
X
i
j
−
(
W
H
)
i
j
]
H
l
j
=
−
[
(
X
H
T
)
i
l
−
(
W
H
H
T
)
i
l
]
∂
J
(
W
,
H
)
∂
H
l
j
=
−
[
(
W
T
X
)
l
j
−
(
W
T
W
H
)
l
j
]
\begin{aligned} \frac{\partial J(W,H)}{\partial W_{il}}&=-\sum_j[X_{ij}-(WH)_{ij}]H_{lj}=-[(XH^\mathrm{T})_{il}-(WHH^\mathrm{T})_{il}]\\ \frac{\partial J(W,H)}{\partial H_{lj}}&=-[(W^\mathrm{T}X)_{lj}-(W^\mathrm{T}WH)_{lj}] \end{aligned}
∂Wil∂J(W,H)∂Hlj∂J(W,H)=−j∑[Xij−(WH)ij]Hlj=−[(XHT)il−(WHHT)il]=−[(WTX)lj−(WTWH)lj]
根据更新规则有
W
i
l
=
W
i
l
+
λ
i
l
[
(
X
H
T
)
i
l
−
(
W
H
H
T
)
i
l
]
H
l
j
=
H
l
j
+
μ
l
j
[
(
W
T
X
)
l
j
−
(
W
T
W
H
)
l
j
]
λ
i
l
=
W
i
l
(
W
H
H
T
)
i
l
μ
l
j
=
H
l
j
(
W
T
W
H
)
l
j
W_{il}=W_{il}+\lambda_{il}[(XH^\mathrm{T})_{il}-(WHH^\mathrm{T})_{il}]\\ H_{lj}=H_{lj}+\mu_{lj}[(W^\mathrm{T}X)_{lj}-(W^\mathrm{T}WH)_{lj}]\\ \lambda_{il}=\frac{W_{il}}{(WHH^\mathrm{T})_{il}}\\ \mu_{lj}=\frac{H_{lj}}{(W^\mathrm{T}WH)_{lj}}
Wil=Wil+λil[(XHT)il−(WHHT)il]Hlj=Hlj+μlj[(WTX)lj−(WTWH)lj]λil=(WHHT)ilWilμlj=(WTWH)ljHlj
得到最终的乘法更新法则:
H
l
j
←
H
l
j
(
W
T
X
)
l
j
(
W
T
W
H
)
l
j
W
i
l
←
W
i
l
(
X
H
T
)
i
l
(
W
H
H
T
)
i
l
H_{lj}\leftarrow H_{lj}\frac{(W^\mathrm{T}X)_{lj}}{(W^\mathrm{T}WH)_{lj}}\\ W_{il}\leftarrow W_{il}\frac{(XH^\mathrm{T})_{il}}{(WHH^\mathrm{T})_{il}}
Hlj←Hlj(WTWH)lj(WTX)ljWil←Wil(WHHT)il(XHT)il
(2)散度损失函数的更新法则
散度乘法更新法则如下:
H
l
j
←
H
l
j
∑
i
[
W
i
l
X
i
j
/
(
W
H
)
i
j
]
∑
i
W
i
l
W
i
l
←
W
i
l
∑
j
[
H
l
j
X
i
j
/
(
W
H
)
i
j
]
∑
j
H
l
j
H_{lj}\leftarrow H_{lj}\frac{\sum\limits_i[W_{il}X_{ij}/(WH)_{ij}]}{\sum\limits_iW_{il}}\\ W_{il}\leftarrow W_{il}\frac{\sum\limits_j[H_{lj}X_{ij}/(WH)_{ij}]}{\sum\limits_jH_{lj}}
Hlj←Hlji∑Wili∑[WilXij/(WH)ij]Wil←Wilj∑Hljj∑[HljXij/(WH)ij]
算法实现
具体算法如下:
输入:单词-文本矩阵 X ≥ 0 X\ge 0 X≥0,文本集合的话题个数 k k k,最大迭代次数 t t t;
输出:话题矩阵 W W W,文本表示矩阵 H H H
- 初始化
W ≥ 0 W\ge 0 W≥0,并对 W W W的每一列数据归一化
H ≥ 0 H\ge 0 H≥0- 迭代
对迭代次数从 1 1 1到 t t t执行下列步骤:
a. 更新 W W W的元素,每次迭代对 W W W的列向量归一化,使基向量为单位向量。
b. 更新 H H H的元素。
参考文章:
《统计学习方法 第二版》