基于潜在语义索引(LSI)的文档相似度计算算法详解
1. 问题描述
潜在语义索引(Latent Semantic Indexing, LSI)是一种用于信息检索和自然语言处理的技术,旨在解决传统词袋模型(Bag-of-Words)中的词汇鸿沟问题。词汇鸿沟指的是不同词语可能表达相同含义(同义词),或同一词语在不同语境下有不同含义(多义词),这会导致仅基于词频的相似度计算不准确。LSI通过奇异值分解(SVD)对词-文档矩阵进行降维,捕捉词语和文档背后的潜在语义结构,从而更准确地计算文档之间的相似度。
2. 核心思想
LSI的核心假设是:文档中词语的使用存在某种潜在的语义结构,这种结构可以通过统计方法被揭示。通过将高维的词-文档关系映射到低维的潜在语义空间,LSI能够将语义上相关的文档和词语在低维空间中靠近,即使它们没有直接的词语重叠。
3. 算法步骤详解
步骤1:构建词-文档矩阵(Term-Document Matrix)
首先,我们需要一个文档集合(语料库)。假设有M篇文档,一个包含N个唯一词语的词典。
- 构建一个N×M的矩阵X,其中每一行代表一个词语,每一列代表一篇文档。
- 矩阵中的元素x_ij表示词语i在文档j中的权重。常见的权重计算方式有:
- 词频(TF):词语在文档中出现的次数。
- TF-IDF:更常用的权重,同时考虑词频和逆文档频率。
TF-IDF = TF * IDF,其中IDF = log(文档总数 / 包含该词的文档数)。TF-IDF可以降低常见词语(如“的”、“是”)的权重,提升重要词语的权重。
步骤2:对矩阵X进行奇异值分解(SVD)
奇异值分解是LSI算法的数学核心。它将矩阵X分解为三个矩阵的乘积:
X = T * S * D^T
- T(左奇异向量矩阵):一个N×R的矩阵(R是矩阵X的秩),每一行代表一个词语在潜在语义空间中的坐标。T中的列向量是正交的。
- S(奇异值矩阵):一个R×R的对角矩阵,对角线上的元素是奇异值,按从大到小排序。奇异值表示了每个潜在语义维度的重要性。
- D^T(右奇异向量矩阵的转置):一个R×M的矩阵,每一列代表一篇文档在潜在语义空间中的坐标。D中的列向量是正交的。
步骤3:选择降维维度K,进行低秩近似
为了降维和去噪,我们不会使用所有R个维度。而是选择一个较小的数K(K << R),只保留最重要的前K个潜在语义维度。
- 从T矩阵中取前K列,得到T_K(N×K矩阵)。
- 从S矩阵中取前K个奇异值,构成一个K×K的对角矩阵S_K。
- 从D^T矩阵中取前K行,得到D_K^T(K×M矩阵)。
- 原始矩阵X的最佳K秩近似矩阵为:
X_K = T_K * S_K * D_K^T
步骤4:将文档映射到K维潜在语义空间
降维后,每篇文档在潜在语义空间中的新表示(即新的向量)可以通过下式获得:
文档向量(在潜在空间中) = D_K^T 的对应列 ≈ (S_K^-1 * T_K^T * X) 的对应列
更常见且等价的做法是,直接使用S_K * D_K^T(一个K×M的矩阵)的每一列作为对应文档在K维潜在空间中的坐标表示。这个新的表示捕获了文档的核心语义。
步骤5:在潜在语义空间中计算文档相似度
现在,所有文档都被表示为K维空间中的向量。要计算两篇文档的相似度,只需计算它们对应向量之间的相似度。最常用的方法是计算余弦相似度:
相似度(Doc_i, Doc_j) = (Vec_i · Vec_j) / (||Vec_i|| * ||Vec_j||)
其中·表示点积,||Vec||表示向量的模(欧几里得范数)。余弦相似度的值域为[-1, 1],值越接近1,表示两篇文档在语义上越相似。
4. 举例说明
假设我们有3篇文档:
Doc1: “我喜欢机器学习”
Doc2: “我热爱人工智能”
Doc3: “今天的天气很好”
步骤1: 构建词-文档矩阵(使用TF-IDF简化示意),假设词典为[“我”, “喜欢”, “热爱”, “机器”, “学习”, “人工”, “智能”, “今天”, “天气”, “很好”]。
矩阵X的每一列是文档向量。
步骤2和3: 对X进行SVD,并选择K=2进行降维。降维后,Doc1和Doc2的向量在二维潜在语义空间中可能会很接近(因为它们都关于技术兴趣),而Doc3的向量会远离它们(因为关于天气)。
步骤4和5: 计算Doc1和Doc2向量的余弦相似度会很高,而它们与Doc3的相似度会很低。这准确地反映了语义相似性,尽管Doc1和Doc2没有共享任何相同的实词。
5. 总结
LSI通过线性代数方法(SVD)有效揭示了词语和文档之间的潜在语义关联。其主要优势在于能够克服同义词和多义词问题,实现更鲁棒的文档相似度计算。其主要参数是降维维度K,K的选择需要在保留信息和去除噪声之间取得平衡。LSI为后续的潜在语义分析模型(如LDA)奠定了基础。