Latent Semantic Analysis(LSA/ LSI)原理简介
LSA的工作原理: How Latent Semantic Analysis Works
LSA被广泛用于文献检索,文本分类,垃圾邮件过滤,语言识别,模式检索以及文章评估自动化等场景。
LSA其中一个目的是解决如通过搜索词/关键词(search words)定位出相关文章。如何通过对比单词来定位文章是一个难点,因为我们正在要做的是对比单词背后的语义。潜在语义分析的基本原理是将文章和单词懂映射到语义空间( “concept” space )上,并在该空间进行对比分析。
当单词-标题(或文章)矩阵创建完成,我们将使用强大的SVD算法进行矩阵分析。关于SVD的详细介绍可以阅读 “Singular Value Decomposition Tutorial”。
SVD的强大在于,其通过强调强的相关关系并过滤掉噪声来实现矩阵降维(it finds a reduced dimensional representation of our matrix that emphasizes the strongest relationships and throws away the noise)。换句话说,SVD使用尽可能少的信息来对原矩阵进行尽可能好的重构(这里的好应该是指重构矩阵失真少,且噪声少)。其实现手段是减低噪声,同时增强强模式和趋势(o do this, it throws out noise, which does not help, and emphasizes strong patterns and trends, which do help)。在LSA中使用SVD时为了确定单词-标题(或文章)矩阵有效维度数或包含“语义”数。经过压缩后,之后少量用于有用的维度或语义模式被留下,大量噪声将被过滤掉。这些噪声是由于作者的随机选择找出。
SVD算法的实现有点复杂,幸运的是python有现成的的函数完成该工作。通过加装python的SVD函数,我们将矩阵分解成3个矩阵。矩阵UU提供了每个单词在语义空间的坐标。而VTVT提供了每篇文章在语义空间的坐标。奇异值矩阵SS告诉我们有词-标题(或文章)矩阵包含了多少语义或语义空间的有效维度是多少。
def calc(self):
self.U, self.S, self.Vt = svd(self.A)
参考文档1:https://www.cnblogs.com/kemaswill/archive/2013/04/17/3022100.html
参考文档2:https://en.wikipedia.org/wiki/Latent_semantic_analysis
参考文档3:https://blog.csdn.net/zhzhji440/article/details/47193731(重要)
1. 总而言之,在基于单词的检索方法中,同义词会降低检索算法的召回率(Recall),而多义词的存在会降低检索系统的准确率(Precision)。
2. Latent Semantic Analysis (Latent Semantic Indexing)
我们希望找到一种模型,能够捕获到单词之间的相关性。如果两个单词之间有很强的相关性,那么当一个单词出现时,往往意味着另一个单词也应该出现(同义词);反之,如果查询语句或者文档中的某个单词和其他单词的相关性都不大,那么这个词很可能表示的是另外一个意思(比如在讨论互联网的文章中,Apple更可能指的是Apple公司,而不是水果) 。
LSA(LSI)使用SVD来对单词-文档矩阵进行分解。SVD可以看作是从单词-文档矩阵中发现不相关的索引变量(因子),将原来的数据映射到语义空间内。在单词-文档矩阵中不相似的两个文档,可能在语义空间内比较相似。
SVD,亦即奇异值分解,是对矩阵进行分解的一种方法,一个t*d维的矩阵(单词-文档矩阵)X,可以分解为T*S*DT,其中T为t*m维矩阵,T中的每一列称为左奇异向量(left singular bector),S为m*m维对角矩阵,每个值称为奇异值(singular value),D为d*m维矩阵,D中的每一列称为右奇异向量。在对单词文档矩阵X做SVD分解之后,我们只保存S中最大的K个奇异值,以及T和D中对应的K个奇异向量,K个奇异值构成新的对角矩阵S’,K个左奇异向量和右奇异向量构成新的矩阵T’和D’:X’=T’*S’*D’T形成了一个新的t*d矩阵。