文本挖掘中,主题模型。聚类算法关注于从样本特征的相似度方面将数据聚类。比如通过数据样本之间的欧式距离,曼哈顿距离的大小聚类等。
而主题模型,顾名思义,就是对文字中隐含主题的一种建模方法。比如从“人民的名义”和“达康书记”这两个词我们很容易发现对应的文本有很大的主题相关度,但是如果通过词特征来聚类的话则很难找出,因为聚类方法不能考虑到到隐含的主题这一块。
那么如何找到隐含的主题呢?
主要是统计方法与非统计方法,LDA是一种基于统计方法的主题建模,还有一些非统计方法潜在语义索引(LSI),又称为潜在语义分析(LSA)。
在文本挖掘中,主题模型是比较特殊的一块,它的思想不同于我们常用的机器学习算法,因此这里我们需要专门来总结文本主题模型的算法。本文关注于潜在语义索引算法(LSI)的原理。
潜在语义索引(Latent Semantic Indexing,以下简称LSI),有的文章也叫Latent Semantic Analysis(LSA)。其实是一个东西,后面我们统称LSI,它是一种简单实用的主题模型。LSI是基于奇异值分解(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得到的文本主题矩阵可以用于文本相似度计算。而计算方法一般是通过余弦相似度。
余弦距离也叫余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。
余弦公式:
c o s ( θ ) = a 2 + b 2 − c 2 2 a b cos(\theta)=\frac{a^2+b^2-c^2}{2ab} cos(θ)=2aba2+b2−c2
向量表达:
c o s ( θ ) = a ⋅ b ∣ ∣ a ∣ ∣ × ∣ ∣ b ∣ ∣ cos(\theta)=\frac{\bm{a·b}}{||\bm{a}||\times ||\bm{b}||} cos(θ)=∣∣a∣∣×∣∣b∣∣a⋅b
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+y22x1x2+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)2∑i=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.6492−0.6458−0.7194−0.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有很多不足,导致它在当前实际的主题模型中已基本不再使用。