潜在语义分析
单词向量空间模型通过单词的向量表示文本的语义内容。以单词-文本矩阵XXX为输入,其中每一行对应一个单词,每一列对应一个文本,每一个元素表示单词在文本中的频数或权值(如TF-IDF)
X=[x11x12⋯x1nx21x22⋯x2n⋮⋮⋮xm1xm2⋯xmn]X = \left[ \begin{array} { c c c c } { x _ { 11 } } & { x _ { 12 } } & { \cdots } & { x _ { 1 n } } \\\\ { x _ { 21 } } & { x _ { 22 } } & { \cdots } & { x _ { 2 n } } \\\\ { \vdots } & { \vdots } & { } & { \vdots } \\\\ { x _ { m 1 } } & { x _ { m 2 } } & { \cdots } & { x _ { m n } } \end{array} \right]X=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2⋯⋯⋯x1nx2n⋮xmn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
单词向量空间模型认为,这个矩阵的每一列向量是单词向量,表示一个文本,两个单词向量的内积或标准化内积表示文本之间的语义相似度
话题向量空间模型通过话题的向量表示文本的语义内容
假设有话题文本矩阵Y=[y11y12⋯y1ny21y22⋯y2n⋮⋮⋮yk1yk2⋯ykn]Y = \left[ \begin{array} { c c c c } { y _ { 11 } } & { y _ { 12 } } & { \cdots } & { y _ { 1 n } } \\\\ { y _ { 21 } } & { y _ { 22 } } & { \cdots } & { y _ { 2 n } } \\\\ { \vdots } & { \vdots } & { } & { \vdots } \\\\ { y _ { k 1 } } & { y _ { k 2 } } & { \cdots } & { y _ { k n } } \end{array} \right]Y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡y11y21⋮yk1y12y22⋮yk2⋯⋯⋯y1ny2n⋮ykn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
其中每一行对应一个话题,每一列对应一个文本每一个元素表示话题在文本中的权值
话题向量空间模型认为,这个矩阵的每一列向量是话题向量,表示一个文本,两个话题向量的内积或标准化内积表示文本之间的语义相似度
假设有单词话题矩阵TTT
T=[t11t12⋯t1kt21t22⋯t2k⋮⋮⋮tm1tm2⋯tmk]T = \left[ \begin{array} { c c c c } { t _ { 11 } } & { t _ { 12 } } & { \cdots } & { t _ { 1 k } } \\\\ { t _ { 21 } } & { t _ { 22 } } & { \cdots } & { t _ { 2 k } } \\\\ { \vdots } & { \vdots } & { } & { \vdots } \\\\ { t _ { m 1 } } & { t _ { m 2 } } & { \cdots } & { t _ { m k } } \end{array} \right]T=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡t11t21⋮tm1t12t22⋮tm2⋯⋯⋯t1kt2k⋮tmk⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
其中每一行对应一个单词,每一列对应一个话题,每一个元素表示单词在话题中的权值。
给定一个单词文本矩阵XXX
X=[x11x12⋯x1nx21x22⋯x2n⋮⋮⋮xm1xm2⋯xmn]X = \left[ \begin{array} { c c c c } { x _ { 11 } } & { x _ { 12 } } & { \cdots } & { x _ { 1 n } } \\\\ { x _ { 21 } } & { x _ { 22 } } & { \cdots } & { x _ { 2 n } } \\\\ { \vdots } & { \vdots } & { } & { \vdots } \\\\ { x _ { m 1 } } & { x _ { m 2 } } & { \cdots } & { x _ { m n } } \end{array} \right]X=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2⋯⋯⋯x1nx2n⋮xmn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
潜在语义分析的目标是,找到合适的单词-话题矩阵TTT与话题文本矩阵YYY,将单词文本矩阵XXX近似的表示为TTT与YYY的乘积形式。
X≈TYX \approx T YX≈TY
等价地,潜在语义分析将文本在单词向量空间的表示X通过线性变换TTT转换为话题向量空间中的表示YYY。
潜在语义分析的关键是对单词-文本矩阵进行以上的矩阵因子分解(话题分析)
潜在语义分析的算法是奇异值分解。通过对单词文本矩阵进行截断奇异值分解,得到
X≈UkΣkVkT=Uk(ΣkVkT)X \approx U _ { k } \Sigma _ { k } V _ { k } ^ { T } = U _ { k } ( \Sigma _ { k } V _ { k } ^ { T } )X≈UkΣkVkT=Uk(ΣkVkT)
矩阵UkU_kUk表示话题空间,矩阵(ΣkVkT)( \Sigma _ { k } V _ { k } ^ { T } )(ΣkVkT)是文本在话题空间的表示。
非负矩阵分解也可以用于话题分析。非负矩阵分解将非负的单词文本矩阵近似分解成两个非负矩阵WWW和HHH的乘积,得到
X≈WHX \approx W HX≈WH
矩阵WWW表示话题空间,矩阵HHH是文本在话题空间的表示。
非负矩阵分解可以表为以下的最优化问题:
minW,H∥X−WH∥2s.t. W,H≥0\left. \begin{array} { l } { \operatorname { min } _ { W , H } \| X - W H \| ^ { 2 } } \\\\ { \text { s.t. } W , H \geq 0 } \end{array} \right.minW,H∥X−WH∥2 s.t. W,H≥0
非负矩阵分解的算法是迭代算法。乘法更新规则的迭代算法,交替地对WWW和HHH进行更新。本质是梯度下降法,通过定义特殊的步长和非负的初始值,保证迭代过程及结果的矩阵WWW和HHH均为非负。\n
LSA
LSA是一种无监督学习方法,主要用于文本的话题分析,其特点是通过矩阵分解发现文本与单词之间的基于话题的语义关系。也称为潜在语义索引(Latent semantic indexing, LSI)。
LSA 使用的是非概率的话题分析模型。将文本集合表示为单词-文本矩阵,对单词-文本矩阵进行奇异值分解,从而得到话题向量空间,以及文本在话题向量空间的表示。
非负矩阵分解
非负矩阵分解 (non-negative matrix factorization, NMF)是另一种矩阵的因子分解方法,其特点是分解的矩阵非负
单词向量空间
给定一个文本,用一个向量表示该文本的”语义“, 向量的每一维对应一个单词,其数值为该单词在该文本中出现的频数或权值
基本假设是文本中所有单词的出现情况表示了文本的语义内容,文本集合中的每个文本都表示为一个向量,存在于一个向量空间
向量空间的度量,如内积或标准化内积表示文本之间的相似度
给定一个含有nnn个文本的集合D=(d1,d2,...,dn)D=({d_{1}, d_{2},...,d_{n}})D=(d1,d2,...,dn)
以及在所有文本中出现的mmm个单词的集合W=(w1,w2,...,wm)W=({w_{1},w_{2},...,w_{m}})W=(w1,w2,...,wm)
将单词在文本的出现的数据用一个单词-文本矩阵(word-document matrix)表示,记作XXX
X=[x11x12x1nx21x22x2n⋮⋮⋮xm1xm2xmn]X = \begin{bmatrix} x_{11} & x_{12}& x_{1n}& \\\\ x_{21}& x_{22}& x_{2n}& \\\\ \vdots & \vdots & \vdots & \\\\ x_{m1}& x_{m2}& x_{mn}& \end{bmatrix} X=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2x1nx2n⋮xmn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
这是一个m∗nm*nm∗n矩阵,元素xijx_{ij}xij表示单词wiw_{i}wi在文本djd_{j}dj中出现的频数或权值。由于单词的种类很多,而每个文本中出现单词的种类通常较少,所有单词-文本矩阵是一个稀疏矩阵
权值通常用单词频率-逆文本率(term frequency-inverse document frequency, TF-IDF)表示
TF−IDF(t,d)=TF(t,d)∗IDF(t)TF-IDF(t, d ) = TF(t, d) * IDF(t)TF−IDF(t,d)=TF(t,d)∗IDF(t)
其中,TF(t,d)TF(t,d)TF(t,d)为单词ttt在文本ddd中出现的概率,IDF(t)IDF(t)IDF(t)是逆文本率,用来衡量单词ttt对表示语义所起的重要性
IDF(t)=log(len(D)len(t∈D)+1)IDF(t) = log(\frac{len(D)}{len(t \in D) + 1})IDF(t)=log(len(t∈D)+1len(D))
单词向量空间模型的优点是模型简单,计算效率高
因为单词向量通常是稀疏的,单词向量空间模型也有一定的局限性,体现在内积相似度未必能够准确表达两个文本的语义相似度上
因为自然语言的单词具有一词多义性(polysemy)及多词一义性(synonymy)
话题向量空间
给定一个含有nnn个文本的集合D=(d1,d2,...,dn)D=({d_{1}, d_{2},...,d_{n}})D=(d1,d2,...,dn),以及在所有文本中出现的mmm个单词的集合W=(w1,w2,...,wm)W=({w_{1},w_{2},...,w_{m}})W=(w1,w2,...,wm). 可以获得其单词-文本矩阵XXX:
X=[x11x12x1nx21x22x2n⋮⋮⋮xm1xm2xmn]X = \begin{bmatrix} x_{11} & x_{12}& x_{1n}& \\\\ x_{21}& x_{22}& x_{2n}& \\\\ \vdots & \vdots & \vdots & \\\\ x_{m1}& x_{m2}& x_{mn}& \end{bmatrix} X=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2x1nx2n⋮xmn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
假设所有文本共含有kkk个话题。假设每个话题由一个定义在单词集合WWW上的mmm维向量表示,称为话题向量,即:
tl=[t1lt2l⋮tml],l=1,2,...,kt_{l} = \begin{bmatrix} t_{1l}\\\\ t_{2l}\\\\ \vdots \\\\ t_{ml}\end{bmatrix}, l=1,2,...,k tl=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡t1lt2l⋮tml⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤,l=1,2,...,k
其中tilt_{il}til单词wiw_{i}wi在话题tlt_{l}tl的权值,i=1,2,...,mi=1,2,...,mi=1,2,...,m, 权值越大,该单词在该话题中的重要程度就越高
这kkk个话题向量 t1,t2,...,tkt_{1},t_{2},...,t_{k}t1,t2,...,tk张成一个话题向量空间(topic vector space), 维数为kkk.话题向量空间是单词向量空间的一个子空间
话题向量空间TTT
T=[t11t12t1kt21t22t2k⋮⋮⋮tm1tm2tmk]T = \begin{bmatrix} t_{11} & t_{12}& t_{1k}& \\\\ t_{21}& t_{22}& t_{2k}& \\\\ \vdots & \vdots & \vdots & \\\\ t_{m1}& t_{m2}& t_{mk}& \end{bmatrix} T=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡t11t21⋮tm1t12t22⋮tm2t1kt2k⋮tmk⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
矩阵TTT,称为单词-话题矩阵。 T=[t1,t2,...,tk]T = [t_{1}, t_{2}, ..., t_{k}]T=[t1,t2,...,tk]
文本在话题向量空间中的表示
考虑文本集合DDD的文本djd_{j}dj, 在单词向量空间中由一个向量xjx_{j}xj表示,将xjx_{j}xj投影到话题向量空间TTT中,得到话题向量空间的一个向量yjy_{j}yj, yjy_{j}yj是一个kkk维向量:
yj=[y1jy2j⋮ykj],j=1,2,...,ny_{j} = \begin{bmatrix} y_{1j}\\\\ y_{2j}\\\\ \vdots \\\\ y_{kj}\end{bmatrix}, j=1,2,...,nyj=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡y1jy2j⋮ykj⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤,j=1,2,...,n
其中,yljy_{lj}ylj是文本djd_{j}dj在话题tlt_{l}tl中的权值, l=1,2,...,kl = 1,2,..., kl=1,2,...,k, 权值越大,该话题在该文本中的重要程度就越高。
矩阵YYY 表示话题在文本中出现的情况,称为话题-文本矩阵(topic-document matrix),记作:
Y=[y11y12y1ny21y22y2n⋮⋮⋮yk1yk2ykn]Y = \begin{bmatrix} y_{11} & y_{12}& y_{1n}& \\\\ y_{21}& y_{22}& y_{2n}& \\\\ \vdots & \vdots & \vdots & \\\\ y_{k1}& y_{k2}& y_{kn}& \end{bmatrix} Y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡y11y21⋮yk1y12y22⋮yk2y1ny2n⋮ykn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
也可写成: Y=[y1,y2...,yn]Y = [y_{1}, y_{2} ..., y_{n}]Y=[y1,y2...,yn]
从单词向量空间到话题向量空间的线性变换
如此,单词向量空间的文本向量xjx_{j}xj可以通过他在话题空间中的向量yjy_{j}yj近似表示,具体地由kkk个话题向量以yjy_{j}yj为系数的线性组合近似表示:
xj=y1jt1+y2jt2+...+yyjtk,j=1,2,...,nx_{j} = y_{1j}t_{1} + y_{2j}t_{2} + ... + y_{yj}t_{k}, j = 1,2,..., nxj=y1jt1+y2jt2+...+yyjtk,j=1,2,...,n
所以,单词-文本矩阵XXX可以近似的表示为单词-话题矩阵TTT与话题-文本矩阵YYY的乘积形式。
X≈TYX \approx TYX≈TY
直观上,潜在语义分析是将单词向量空间的表示通过线性变换转换为在话题向量空间中的表示。这个线性变换由矩阵因子分解式的形式体现。
潜在语义分析算法
潜在语义分析利用矩阵奇异值分解,具体地,对单词-文本矩阵进行奇异值分解,将其左矩阵作为话题向量空间,将其对角矩阵与右矩阵的乘积作为文本在话题向量空间的表示
给定一个含有nnn个文本的集合D=(d1,d2,...,dn)D=({d_{1}, d_{2},...,d_{n}})D=(d1,d2,...,dn),以及在所有文本中出现的mmm个单词的集合W=(w1,w2,...,wm)W=({w_{1},w_{2},...,w_{m}})W=(w1,w2,...,wm). 可以获得其单词-文本矩阵XXX
X=[x11x12x1nx21x22x2n⋮⋮⋮xm1xm2xmn]X = \begin{bmatrix} x_{11} & x_{12}& x_{1n}& \\\\ x_{21}& x_{22}& x_{2n}& \\\\ \vdots & \vdots & \vdots & \\\\ x_{m1}& x_{m2}& x_{mn}& \end{bmatrix} X=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2x1nx2n⋮xmn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
截断奇异值分解:
潜在语义分析根据确定的话题数kkk对单词-文本矩阵XXX进行截断奇异值分解:
X≈UkΣkVkT=[μ1μ2⋯μk][σ10000σ20000⋱0000σk][v1Tv2T⋮vkT]X \approx U_{k}\Sigma _{k}V_{k}^{T} = \begin{bmatrix} \mu _{1} & \mu _{2}& \cdots & \mu _{k} \end{bmatrix}\begin{bmatrix} \sigma_{1} & 0& 0& 0\\\\ 0& \sigma_{2}& 0& 0\\\\ 0& 0& \ddots & 0\\\\ 0& 0& 0& \sigma_{k} \end{bmatrix}\begin{bmatrix} v_{1}^{T}\\\\ v_{2}^{T}\\\\ \vdots \\\\ v_{k}^{T}\end{bmatrix} X≈UkΣkVkT=[μ1μ2⋯μk]⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡σ10000σ20000⋱0000σk⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡v1Tv2T⋮vkT⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
矩阵UkU_{k}Uk的每一个列向量 u1,u2,...,uku_{1}, u_{2},..., u_{k}u1,u2,...,uk 表示一个话题,称为话题向量
由这 kkk 个话题向量张成一个子空间:
Uk=[u1u2⋯uk]U_{k} = \begin{bmatrix} u_{1} & u_{2}& \cdots & u_{k} \end{bmatrix} Uk=[u1u2⋯uk]
称为话题向量空间。
综上, 可以通过对单词-文本矩阵的奇异值分解进行潜在语义分析:
X≈UkΣkVkT=Uk(ΣkVkT)X \approx U_{k} \Sigma_{k} V_{k}^{T} = U_{k}(\Sigma_{k}V_{k}^{T})X≈UkΣkVkT=Uk(ΣkVkT)
得到话题空间 UkU_{k}Uk , 以及文本在话题空间的表示(ΣkVkT\Sigma_{k}V_{k}^{T}ΣkVkT).
非负矩阵分解算法
非负矩阵分解也可以用于话题分析。对单词-文本矩阵进行非负矩阵分解,将其左矩阵作为话题向量空间,将其右矩阵作为文本在话题向量空间的表示。
非负矩阵分解
若一个矩阵的索引元素非负,则该矩阵为非负矩阵。若XXX是非负矩阵,则: X>=0X >= 0X>=0.
给定一个非负矩阵XXX, 找到两个非负矩阵W>=0W >= 0W>=0 和 H>=0H>= 0H>=0, 使得:
X≈WHX \approx WHX≈WH
即非负矩阵XXX分解为两个非负矩阵WWW和HHH的乘积形式,成为非负矩阵分解。因为WHWHWH与XXX完全相等很难实现,所以只要求近似相等。
假设非负矩阵XXX是m×nm\times nm×n矩阵,非负矩阵WWW和HHH分别为 m×km\times km×k 矩阵和 k×nk\times nk×n 矩阵。假设 k 称 WWW 为基矩阵, HHH 为系数矩阵。非负矩阵分解旨在用较少的基向量,系数向量来表示为较大的数据矩阵。 令 W=[w1w2⋯wk]W = \begin{bmatrix} w_{1} & w_{2}& \cdots& w_{k} \end{bmatrix}W=[w1w2⋯wk] 为话题向量空间, w1,w2,...,wkw_{1}, w_{2}, ..., w_{k}w1,w2,...,wk 表示文本集合的 kkk 个话题, 令 H=[h1h2⋯hn]H = \begin{bmatrix} h_{1} & h_{2}& \cdots& h_{n} \end{bmatrix}H=[h1h2⋯hn] 为文本在话题向量空间的表示, h1,h2,...,hnh_{1}, h_{2},..., h_{n}h1,h2,...,hn 表示文本集合的 nnn 个文本。 非负矩阵分解可以形式化为最优化问题求解。可以利用平方损失或散度来作为损失函数。 目标函数 ∣∣X−WH∣∣2|| X - WH ||^{2}∣∣X−WH∣∣2 关于 WWW 和 HHH 的最小化,满足约束条件 W,H>=0W, H >= 0W,H>=0, 即: minW,H∣∣X−WH∣∣2\underset{W,H}{min} || X - WH ||^{2}W,Hmin∣∣X−WH∣∣2 s.t.W,H>=0s.t. W, H >= 0s.t.W,H>=0 乘法更新规则 Wil←Wil(XHT)il(WHHT)ilW_{il} \leftarrow W_{il}\frac{(XH^{T})_{il}}{(WHH^{T})_{il}}Wil←Wil(WHHT)il(XHT)il Hlj←Hlj(WTX)lj(WTWH)ljH_{lj} \leftarrow H_{lj}\frac{(W^{T}X)_{lj}}{(W^{T}WH)_{lj}}Hlj←Hlj(WTWH)lj(WTX)lj 选择初始矩阵 WWW 和 HHH 为非负矩阵,可以保证迭代过程及结果的矩阵 WWW 和 HHH 非负。 代码
import numpy as np
from sklearn.decomposition import TruncatedSVDX = [[2, 0, 0, 0], [0, 2, 0, 0], [0, 0, 1, 0], [0, 0, 2, 3], [0, 0, 0, 1], [1, 2, 2, 1]]
X = np.asarray(X)# 奇异值分解
U,sigma,VT=np.linalg.svd(X)# 截断奇异值分解
svd = TruncatedSVD(n_components=3, n_iter=7, random_state=42)
svd.fit(X) # 非负矩阵分解
class MyNMF:def fit(self, X, k, t):m, n = X.shapeW = np.random.rand(m, k)W = W/W.sum(axis=0)H = np.random.rand(k, n)i = 1while i < t:W = W * X.dot(H.T) / W.dot(H).dot(H.T)H = H * (W.T).dot(X) / (W.T).dot(W).dot(H)i += 1return W, H
上一篇:计算机网络-传输层:TCP协议