前言
最近在重刷李航老师的《统计机器学习方法》尝试将其与NLP结合,通过具体的NLP应用场景,强化对书中公式的理解,最终形成「统计机器学习方法 for NLP」的系列。这篇将介绍潜在语义分析LSA(绝对给你一次讲明白)并基于LSA完成一个主题模型提取的任务。
潜在语义分析是什么
潜在语义分析(Latent Semantic Analysis, LSA)是一种无监督的机器学习方来,通过分析文本内容来获取文本「隐藏主题」,也就是文章的「表示」,一旦能获取文本的「表示」就可以进行文本之间的相似度的计算,进而实现文本聚类等应用。
单词向量空间模型
在统计机器学习里面获取一个文章的「表示」最基础的方法就是单词向量空间模型。基本的想法是用一个向量来表示文章的语义,向量的每一个维度表示词表中的一个单词,这个维度的数值就表示该单词在文本中出现的频次或者权重(例如tf-idf)。这样通过计算两个向量的相似度(例如余弦相似度)就可以来获得两个文本之间的相似度。这种模型非常简单而且计算效率很高,至今在信息检索等场景广泛应用。

但也会存在两个问题:(1) 无法解决一词多义或者多词一义的问题,因为是最简单的「字面匹配」。例如“很开心”和“好快乐” 这两句其实是一个意思,但是没有一个字是一样的,按照上面的方法这两句话的语义相似度就是0 (2) 存储开销较大,因为词表的大小一般是非常大的(例如几万维),所以存一个N*V的矩阵会是很大的开销,这里N表示文章个数,V表示词表大小。(其实现在来看这点不算什么问题)
正是因为最基础的「单词向量空间模型」存在上述的问题,所以潜在语义分析LSA就被提出了。
话题向量空间模型
我们认为一个文本一般包含多个话题,两个文本语义的相似可以等价于两个文本话题的相似。这里的话题就可以用一组相似的单词构成,比如{开心,快乐,高兴}等。所以我们可以构建一个话题向量来对一个文本进行表示,向量的每一个维度表示一个话题,这个维度的数值就表示文本在这个话题上的权重,并且一般话题的个数是远小于词表的个数,存储空间大幅降低。所以通过这种方式就可以解决「单词向量空间模型」遇到了两个问题。

如上图所示,LSA就是通过将「单词-文本矩阵」(单词向量空间)转化成 「单词-话题矩阵」和 「话题-文本矩阵」(话题向量空间模型)乘积的形式,从而挖掘出文章中潜在的语义。
训练阶段:首先基于单词向量空间模型从训练文本中构建出「单词-文本」矩阵,然后通过矩阵的奇异值分解对「单词-文本矩阵」进行分解,将分解结果的左矩阵作为话题的表示,右矩阵作为文本的表示(在话题维度下)。
预测阶段:给定一个文本,先获取单词向量空间(1*m),然后与空间表示(m*k)相乘,就获得了话题空间向量(1*k),作为这个文本的表示。