基于潜在语义索引(LSI)的文本相似度计算算法详解
我将为您讲解潜在语义索引(Latent Semantic Indexing, LSI),也称潜在语义分析(LSA),用于文本相似度计算的核心算法。这个算法通过矩阵分解来捕捉文本中的潜在语义结构,解决传统词袋模型(如TF-IDF)中的词汇不匹配问题。
1. 问题定义与目标
问题:如何计算两篇文档的语义相似度?例如,文档A讲“苹果发布新款iPhone”,文档B讲“这家科技巨头推出了新智能手机”,两篇文档没有共享关键词,但语义高度相似。传统基于关键词匹配的方法会失败。
核心思想:LSI认为,词与文档之间存在着潜在的“语义结构”,这个结构可以通过对“词-文档”矩阵进行数学分解来发现。相似的文档在这个潜在的语义空间中距离会更近。
2. 算法输入:构建词-文档矩阵
这是第一步,将文本集合转化为可计算的数学对象。
步骤详解:
- 文档预处理: 给定一个文档集合(语料库),对每个文档进行分词、去除停用词、词干化/词形还原。
- 构建词表: 统计所有文档中出现过的词,形成一个包含
m个词的词表。 - 矩阵填充: 构建一个
m x n的矩阵X,其中n是文档数量。- 矩阵的每一行代表一个词。
- 矩阵的每一列代表一个文档。
- 矩阵元素
X(i, j)的值,通常采用TF-IDF(词频-逆文档频率)权重,而不仅仅是词频。TF-IDF能更好地衡量一个词对一个文档的重要性。 - 例子:假设词表为 {苹果, 发布, iPhone, 科技, 巨头, 推出, 智能手机},有3篇文档。
X(“苹果”, Doc1) = TF-IDF(“苹果”在Doc1中的权重)X(“智能手机”, Doc3) = TF-IDF(“智能手机”在Doc3中的权重)
这个矩阵 X 非常大、非常稀疏(大部分元素为0),并且存在“一词多义”(如“苹果”是水果还是公司?)和“一义多词”(如“手机”和“智能手机”)的问题。
3. 核心操作:奇异值分解(SVD)
这是LSI算法的核心数学步骤,目的是降维和发现潜在语义。
步骤详解:
-
SVD定义: 对
m x n的矩阵X,SVD将其分解为三个矩阵的乘积:
X = T * S * D^TT是一个m x k的矩阵(k是矩阵X的秩)。它的行代表词在新语义空间(k维)中的坐标。可以理解为“词-语义”矩阵。S是一个k x k的对角矩阵,对角线上的元素称为奇异值,且从大到小排列。奇异值的大小代表了对应维度(语义概念)的重要性。D^T是D的转置,D是一个n x k的矩阵。它的行代表文档在同一个新语义空间(k维)中的坐标。可以理解为“文档-语义”矩阵。
-
降维(关键!): 我们并不使用完整的
k维。我们只保留前r个最大的奇异值(r < k),以及T和D中对应的前r列。- 新的近似矩阵:
X_r ≈ T_r * S_r * (D_r)^T T_r:m x r, 词的r维表示。D_r:n x r, 文档的r维表示。S_r:r x r, 前r个奇异值构成的对角矩阵。
- 新的近似矩阵:
为什么降维有效?
- 去噪: 较小的奇异值通常对应数据中的噪声或不重要的细节(如偶然的词语共现)。
- 归纳: 最大的几个奇异值对应的维度,代表了语料库中最核心、最普遍的“语义概念”或“主题”。例如,第一个维度可能对应“科技产品”,第二个可能对应“公司动态”。
- 解决词汇问题: 在低维语义空间中,“苹果”和“巨头”虽然词不同,但如果它们经常出现在相似主题的文档中,它们的向量表示(
T_r中的行向量)就会比较接近。同样,多义词的不同含义也会被映射到不同的语义方向。
4. 计算文本相似度
降维后,文档的语义表示就是 D_r 矩阵的行向量。比较两篇文档的相似度,就转化为比较这两个 r 维向量的相似度。
步骤详解:
- 获取文档向量: 对于文档
i和文档j, 它们的低维表示为D_r[i]和D_r[j](这是两个1 x r的行向量)。 - 选择相似度度量: 最常用的是余弦相似度。
- 公式:
similarity(i, j) = cos(θ) = (D_r[i] · D_r[j]) / (||D_r[i]|| * ||D_r[j]||) - “·” 表示点积,
|| ||表示向量的模(长度)。
- 公式:
- 解释结果: 余弦相似度的值域是[-1, 1],在LSI中通常为[0, 1]。值越接近1,表示两篇文档在潜在语义空间中的方向越一致,语义越相似。
回到例子: 在原始的TF-IDF矩阵中,文档A(含“苹果”、“iPhone”)和文档B(含“科技”、“智能手机”)的向量可能正交(点积为0)。但经过SVD降维到“科技产品”这个语义维度后,它们的文档向量在这个维度上都有很高的值,因此余弦相似度会很高。
5. 处理新文档(查询)
一个实际系统需要计算新文档(查询语句)与已有文档集的相似度。
步骤详解:
- 向量化新文档: 将新文档进行相同的预处理,并用已有的TF-IDF模型将其转化为一个
m维的词权重向量q(m x 1)。 - 映射到语义空间: 不能直接放入
D_r,因为D_r是从训练集分解来的。我们需要将新文档向量q投影到已有的语义空间。- 投影公式:
q_semantic = q^T * T_r * S_r^{-1} q^T是q的转置(1 x m)。T_r和S_r是从训练集SVD得到的。S_r^{-1}是S_r的逆矩阵(因为S_r是对角阵,逆矩阵就是每个对角线元素取倒数)。- 结果
q_semantic是一个1 x r的向量,即新文档在r维语义空间中的坐标。
- 投影公式:
- 计算相似度: 用
q_semantic与D_r中的每一个文档向量计算余弦相似度,找出最相似的文档。
总结与回顾
LSI算法流程:
- 建矩阵: 文档预处理,构建
m x n的 TF-IDF 词-文档矩阵X。 - SVD分解: 对
X进行奇异值分解,得到X = T * S * D^T。 - 降维: 选择保留前
r个奇异值,得到降维后的词矩阵T_r、文档矩阵D_r和奇异值矩阵S_r。 - 表示文档: 每个文档由
D_r中的一个r维向量表示。 - 计算相似: 通过比较
D_r中行向量的余弦相似度来衡量文档间语义相似性。 - 处理新查询: 将新文档向量投影到
T_r和S_r定义的语义空间,再与库中文档比较。
优点:
- 能够捕捉潜在的语义关联,克服同义词和多义词问题。
- 是一种完全无监督的方法。
局限:
- SVD计算复杂度高,对大规模动态更新的文档集不友好。
r(潜在语义维度数)需要人为设定,是一个超参数。- 可解释性相对较差,我们无法精准命名每个潜在维度“是什么”。
通过以上步骤,LSI成功地将高维、稀疏、嘈杂的词-文档关系,映射到了一个低维、稠密、承载核心语义的向量空间,从而实现了基于语义而非关键词的文本相似度计算。它是现代主题模型(如LDA)和深度语义表示(如词向量、句向量)的重要思想先驱。