LSI(Latent semantic indexing, 潜语义索引)和LSA(Latent semantic analysis,潜语义分析)这两个名字实际上是一回事。咱们这里称为LSA。 app
LSA源自问题:如何从搜索query中找到相关的文档?当咱们试图经过比较词来找到相关的文本时,就很机械、存在必定的局限性。在搜索中,文档的类似性并不该该由两个文本包含的词直接决定,而是应该去比较隐藏在词以后的意义和概念。但传统向量空间模型使用精确的词匹配,即精确匹配用户输入的词与向量空间中存在的词。好比用户搜索“automobile”,即汽车,传统向量空间模型仅仅会返回包含“automobile”单词的页面,而实际上包含”car”单词的页面也多是用户所须要的。潜语义分析试图去解决这个问题,它把词和文档都映射到一个潜在语义空间,文档的类似性在这个空间内进行比较。潜语义空间的维度个数能够本身指定,每每比传统向量空间维度更少,因此LSA也是一种降维技术。 spa
LSA的整个过程以下: .net
1. 将文档集构形成Term-Document矩阵M,矩阵中的每一个位置的值能够是该行表明个词在该列表明的文档中的词频、TFIDF值或其余。 code
2. 对Term-Document矩阵进行SVD奇异值分解,此时M = U * S * VT。SVD奇异值分解的详细过程能够查看此文。 索引
3. 对SVD分解后的矩阵进行降维,只保留矩阵S前K个最大的奇异值获得S’。相应的U、V分别为U’、V’。 V’中的每行即为每一个文档在潜在语义空间上的K维表示。 token
4. 使用降维后的矩阵重建Term-Document矩阵M’ = U’ * S’ * V’T。 文档
5. 对于一个列向量表示的新文档Q,其在潜在语义空间上的K维表示为Q’ = QT*U’*S’-1。 get
6. 将新文档Q于文档集中的每一个文档在潜在语义空间进行类似度计算,获得与Q最类似的文档。 博客
下面是一个具体的例子,例子中能展示LSA的效果:M中human-C2值为0,由于文档C2中并不包含词human,可是重建后的M’中human-C2为0.40,代表human和C2有必定的关系,为何呢?由于C2中包含user单词,和human是近似词,所以human-C2的值被提升了。(U、S、V中阴影部分别降维后的U’、S’、V’)。 it
(1)从分类语料中选取了Computer、Agriculture、Sports三个类别的文章,每一个类别各取50篇左右。对每篇文章进行切词,停用词过滤后获得这里须要的的实验文档集。
(2) 使用Gensim对实验文档集进行LSA
1: from gensim import corpora, models, similarities
2:
3: textset = 'C:\\Users\\Administrator\\Desktop\\LSA\\textset.txt'
4: texts = [line.lower().split() for line in open(textset)]
5:
6: # Map word to wordid, delete word occur only once
7: dictionary = corpora.Dictionary(texts)
8: once_ids = [tokenid for tokenid, docfreq in dictionary.dfs.iteritems() if docfreq == 1]
9: dictionary.filter_tokens(once_ids)
10: dictionary.compactify()
11:
12: corpus = [dictionary.doc2bow(text) for text in texts]
13:
14: # Use TF-IDF
15: tfidf = models.TfidfModel(corpus)
16: corpus_tfidf = tfidf[corpus]
17:
18: # Use LSI
19: lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=3)
20: corpus_lsi = lsi[corpus_tfidf]
21:
22: for doc in corpus_lsi:
23: print doc
(3) 画出每一个文档在3维的潜语义空间上的对应坐标点,获得下图。能够看到整个文档集内的文档,朝3个方向分布,分别对应Computer、Agriculture、Sports三个类别。