LSA (Latent Semantic Analysis)潜在语义分析,是利用线性代数奇异值分解的方法来达到降维的目的。
有关奇异值分解,可以去参考线性代数的书籍。
使用奇异值如何达到降维?正常的情况下,奇异值的分解并不能降低向量空间的复杂度。比如语料库是1000个单词,200篇文档的情况下,矩阵M的维度是1000x200,该矩阵有20万个元素。通过奇异值分解,可以得到三个矩阵,分别是1000x1000,200,200x200,一共有1,200,200个元素。可以发现经过奇异值分解后的维度增加了,而不是减少了。
可以使用矩阵低秩近似的方法降低维度。首先将矩阵S中的n-k个最小的奇异值设为0,得到矩阵Sk(k要远远小于n)。再将矩阵U降维为Uk=m*k,矩阵V降维为Vk=k*n,令Mk=Uk*Sk*Vk,这样得到的矩阵就是矩阵M的低秩近似矩阵,并且低秩近似矩阵的维度远远低于M。
潜在语义分析(LSA)的原理以及实现方法如下:
(1)分析文档,建立词汇-文档矩阵
(2)对词汇-文档矩阵进行奇异值分解
(3)对奇异值分解后的矩阵进行降维
(4)使用降维后的矩阵构建潜在语义空间
下面通过一个具体的实例演示如何实现LSA。我们从网络是选取一些关于深度学习、神经网络以及语音识别的论文题目:
序号 | 文字名称 |
---|---|
1 | Recurrent neural network based language model |
2 | Statistical Language Model Based on Neural Network |
3 | On the Importance of Initialization and Momentum in Deep Learning |
4 | A guide to recurrent neural network and backpropagation |
5 | Making Deep Belief Network Effective for Large Vocabulary Continuous Speech Recognition |
6 | Application Of Pretrained Deep Neural Network To Large Vocabulary Speech Recognition |
7 | Deep Neural Network for Acoustic Modeling in Speech Recognition |
8 | Flexible, High Performance Convolutional Neural Network for Image Classification |
9 | Best Practices for Convolutional Neural Network Applied to Visual Document Analysis |
10 | Deep Learning For Signal And Information Processing |
实现步骤如下:
(1)建立待分析的论文题目数组documents
(2)去掉一些不需要分析的词,比如:'for a of from on with in the and to’等
(3)构建字典对象,遍历所有的分词,统计每个分词出现的频率
(4)使用gensim的corpora生成字典。该字典包含有语料库里面出现频度大于1的词:
0 based
1 language
2 model
3 network
4 neural
5 recurrent
6 deep
7 learning
8 large
9 recognition
10 speech
11 vocabulary
12 convolutional
(5)使用gensim的词袋功能doc2word生成词频统计矩阵,矩阵如下:
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)],
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1)],
[(6, 1), (7, 1)],
[(3, 1), (4, 1), (5, 1)],
[(3, 1), (6, 1), (8, 1), (9, 1), (10, 1), (11, 1)],
[(3, 1), (4, 1), (6, 1), (8, 1), (9, 1), (10, 1), (11, 1)],
[(3, 1), (4, 1), (6, 1), (9, 1), (10, 1)],
[(3, 1), (4, 1), (12, 1)],
[(3, 1), (4, 1), (12, 1)],
[(6, 1), (7, 1)]]
此矩阵由(词索引,频次)的二元数组组成。比如(0,1)表示索引为0的词(based)在第一个文章标题中出现了一次。(Recurrent neural network based language model)
(6)上面步骤生成的矩阵是无法直接给Numpy和Scipy使用的,需要使用共现矩阵。在共现矩阵中每一行代表一个词,而每一列是表示不同的上下文。矩阵中的元素表示相关词在上下文中出现的次数。
[[1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[1., 1., 0.