【NLP自然语言处理】LSI/LSA原理介绍

文本挖掘中,主题模型。聚类算法关注于从样本特征的相似度方面将数据聚类。比如通过数据样本之间的欧式距离,曼哈顿距离的大小聚类等。

而主题模型,顾名思义,就是对文字中隐含主题的一种建模方法。比如从“人民的名义”和“达康书记”这两个词我们很容易发现对应的文本有很大的主题相关度,但是如果通过词特征来聚类的话则很难找出,因为聚类方法不能考虑到到隐含的主题这一块。

那么如何找到隐含的主题呢?
主要是统计方法与非统计方法,LDA是一种基于统计方法的主题建模,还有一些非统计方法潜在语义索引(LSI),又称为潜在语义分析(LSA)。

LSI与LSA原理

在文本挖掘中,主题模型是比较特殊的一块,它的思想不同于我们常用的机器学习算法,因此这里我们需要专门来总结文本主题模型的算法。本文关注于潜在语义索引算法(LSI)的原理。
潜在语义索引(Latent Semantic Indexing,以下简称LSI),有的文章也叫Latent Semantic Analysis(LSA)。其实是一个东西,后面我们统称LSI,它是一种简单实用的主题模型。LSI是基于奇异值分解(SVD)的方法来得到文本的主题的。

SVD方法

SVD奇异值分解法:对于一个 m × n m×n m×n的矩阵 A A A,可以分解为下面三个矩阵:
C m × n = U m × m Σ m × n V n × n T C_{m×n}=U_{m×m}\Sigma_{m×n} V^{T}_{n×n} Cm×n=Um×mΣm×nVn×nT
有时为了降低矩阵的维度到 k k k,SVD的分解可以近似的写为

C m × n = U m × k Σ k × k V k × n T C_{m×n}=U_{m×k}\Sigma_{k×k}V^{T}_{k×n} Cm×n=Um×kΣk×kVk×nT

如果把上式用到我们的主题模型,则SVD可以这样解释:我们输入的有 m m m个文本,每个文本有 n n n个词。而 A i j A_{ij} Aij则对应第 i i i个文本的第 j j j个词的特征值,这里最常用的是基于预处理后的标准化TF-IDF值。 k k k是我们假设的主题数,一般要比文本数少。SVD分解后, U i l U_{il} Uil对应第 i i i个文本和第 l l l个主题的相关度。 V j m V_{jm} Vjm对应第 j j j个词和第 m m m个词义的相关度。 Σ l m \Sigma_{lm} Σlm对应第 l l l个主题和第 m m m个词义的相关度。

举个例子:

C C C为一个词项-文档矩阵,为方便,这里使用的是布尔矩阵。 m m m为词项数目, n n n为文档数目:

C C C d1 d2 d3 d4 d5 d6
ship 1 0 1 0 0 0
boat 0 1 0 0 0 0
ocean 1 1 0 0 0 0
wood 0 0 0 1 1 0
tree 0 0 0 1 0 1

U U U中每个词项对应一行,每个语义维度对应一列,矩阵中的元素 U i l U_{il} Uil给出的是词项 i i i和第 l l l个语义维度的关系强弱程度。可以想象这些列向量分别代表了不同的语义维度,比如:政治、体育、娱乐、财经等主题。 U U U是个正交矩阵。

U U U 1 2 3 4 5
ship 0.59 0 -0.74 0 0.33
boat 0.32 0 -0.59 0 0.74
ocean 0.74 0 0.33 0 0.59
wood 0 0.71 0 -0.71 0
tree 0 0.71 0 0.71 0

Σ \Sigma Σ中对角元素是矩阵 C C C的奇异值。奇异值的大小度量的事相应的语义维度的重要性。

Σ \Sigma Σ d1 d2 d3 d4 d5
1 1.80 0 0 0 0
0 0 1.73 0 0 0
3 0 0 1.25 0 0
4 0 0 0 1 0
5 0 0 0 0 0.45

V T V^T VT中每一列对应一篇文档,每一行对应一个语义维度, V j m V_{jm} Vjm代表的是文档 j j j与语义维度的关系强弱程度。矩阵 V T V^T VT是一个正定矩阵。

V T V^T VT d1 d2 d3 d4 d5 d6
1 0.74 0.59 0.33 0 0 0
2 0 0 0 0.82 0.41 0.41
3 0.33 0.74 0.59 0 0 0
4 0 0 0 0 -0.70 0.705
5 -0.59 0.33 0.74 0 0 0
6 0 0 0 -0.58 0.58 0.58

可以将数据降维,对于小数据集不用降维,对于大数据集需要降维。
再计算 C = U ∗ Σ ∗ V T C=U*\Sigma*V^{T} C=UΣVT,在上面我们通过LSI得到的文本主题矩阵( C C C)可以用于文本相似度计算。而计算方法一般是通过余弦相似度。

LSI用于文本相似度计算

通过LSI得到的文本主题矩阵可以用于文本相似度计算。而计算方法一般是通过余弦相似度

余弦相似度

余弦距离也叫余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。

余弦公式:
c o s ( θ ) = a 2 + b 2 − c 2 2 a b cos(\theta)=\frac{a^2+b^2-c^2}{2ab} cos(θ)=2aba2+b2c2

向量表达:
c o s ( θ ) = a ⋅ b ∣ ∣ a ∣ ∣ × ∣ ∣ b ∣ ∣ cos(\theta)=\frac{\bm{a·b}}{||\bm{a}||\times ||\bm{b}||} cos(θ)=∣∣a∣∣×∣∣b∣∣ab
c o s ( θ ) = x 1 x 2 + y 1 y 2 x 1 2 + y 1 2 × x 2 2 + y 2 2 cos(\theta)=\frac{x_1x_2+y_1y_2}{\sqrt{x_1^2+y_1^2}\times \sqrt{x_2^2+y_2^2}} cos(θ)=x12+y12 ×x22+y22 x1x2+y1y2

当然一般的数据也不会是二维的,拓展到 n n n维,假定 a , b a,b a,b是两个 n n n纬向量,有如下公式:
c o s ( θ ) = ∑ i = 1 n ( x i × y i ) ∑ i = 1 n ( x i ) 2 × ∑ i = 1 n ( y i ) 2 cos(\theta)=\frac{\sum_{i=1}^n(x_i\times y_i)}{\sqrt{\sum_{i=1}^n(x_i)^2}\times \sqrt{\sum_{i=1}^n}(y_i)^2} cos(θ)=i=1n(xi)2 ×i=1n (yi)2i=1n(xi×yi)

余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,夹角等于0,即两个向量相等,这就叫"余弦相似性"。

对于下面的三文档两主题的例子。矩阵 V V V如下所示:
[ − 0.4945 − 0.6458 − 0.5817 0.6492 − 0.7194 0.2469 ] \begin{bmatrix} -0.4945 & -0.6458 & -0.5817 \\ 0.6492 & -0.7194 & 0.2469 \\ \end{bmatrix} [0.49450.64920.64580.71940.58170.2469]
计算第一个文本和第二个文本的余弦相似度如下 :

s i m ( d 1 , d 2 ) = ( − 0.4945 ) ∗ ( − 0.6458 ) + ( 0.6492 ) ∗ ( − 0.7194 ) ( − 0.4945 ) 2 + ( 0.6492 ) 2 ( − 0.6458 ) 2 + ( − 0.7194 ) 2 sim(d_1,d_2)=\frac{(-0.4945)*(-0.6458)+(0.6492)*(-0.7194)}{\sqrt{(-0.4945)^2+(0.6492)^2}\sqrt{(-0.6458)^2+(-0.7194)^2}} sim(d1,d2)=(0.4945)2+(0.6492)2 (0.6458)2+(0.7194)2 (0.4945)(0.6458)+(0.6492)(0.7194)

LSI是最早出现的主题模型了,它的算法原理很简单,一次奇异值分解就可以得到主题模型,同时解决词义的问题,非常漂亮。但是LSI有很多不足,导致它在当前实际的主题模型中已基本不再使用。

LSI的不足

  1. SVD计算非常的耗时,尤其是我们的文本处理,词和文本数都是非常大的,对于这样的高维度矩阵做奇异值分解是非常难的。
  2. 主题值的选取对结果的影响非常大,很难选择合适的k值。
  3. LSI得到的不是一个概率模型,缺乏统计基础,结果难以直观的解释。
  • 对于问题1,主题模型非负矩阵分解(NMF)可以解决矩阵分解的速度问题。
  • 对于问题2,这是老大难了,大部分主题模型的主题的个数选取一般都是凭经验的,较新的层次狄利克雷过程(HDP)可以自动选择主题个数。
  • 对于问题3,牛人们整出了pLSI(也叫pLSA)和隐含狄利克雷分布(LDA)这类基于概率分布的主题模型来替代基于矩阵分解的主题模型。
        
    回到LSI本身,对于一些规模较小的问题,如果想快速粗粒度的找出一些主题分布的关系,则LSI是比较好的一个选择,其他时候,如果需要使用主题模型,推荐使用LDA和HDP。

你可能感兴趣的:(NLP自然语言处理,自然语言处理,机器学习,聚类)