基于潜在语义索引(LSI)的文本相似度计算算法详解
字数 3065 2025-12-07 12:04:34

基于潜在语义索引(LSI)的文本相似度计算算法详解

我将为您讲解潜在语义索引(Latent Semantic Indexing, LSI),也称潜在语义分析(LSA),用于文本相似度计算的核心算法。这个算法通过矩阵分解来捕捉文本中的潜在语义结构,解决传统词袋模型(如TF-IDF)中的词汇不匹配问题。


1. 问题定义与目标

问题:如何计算两篇文档的语义相似度?例如,文档A讲“苹果发布新款iPhone”,文档B讲“这家科技巨头推出了新智能手机”,两篇文档没有共享关键词,但语义高度相似。传统基于关键词匹配的方法会失败。

核心思想:LSI认为,词与文档之间存在着潜在的“语义结构”,这个结构可以通过对“词-文档”矩阵进行数学分解来发现。相似的文档在这个潜在的语义空间中距离会更近。


2. 算法输入:构建词-文档矩阵

这是第一步,将文本集合转化为可计算的数学对象。

步骤详解

  1. 文档预处理: 给定一个文档集合(语料库),对每个文档进行分词、去除停用词、词干化/词形还原。
  2. 构建词表: 统计所有文档中出现过的词,形成一个包含 m 个词的词表。
  3. 矩阵填充: 构建一个 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算法的核心数学步骤,目的是降维和发现潜在语义。

步骤详解

  1. SVD定义: 对 m x n 的矩阵 X,SVD将其分解为三个矩阵的乘积:
    X = T * S * D^T

    • T 是一个 m x k 的矩阵(k 是矩阵 X 的秩)。它的行代表新语义空间(k维)中的坐标。可以理解为“词-语义”矩阵。
    • S 是一个 k x k 的对角矩阵,对角线上的元素称为奇异值,且从大到小排列。奇异值的大小代表了对应维度(语义概念)的重要性。
    • D^TD 的转置,D 是一个 n x k 的矩阵。它的行代表文档同一个新语义空间(k维)中的坐标。可以理解为“文档-语义”矩阵。
  2. 降维(关键!): 我们并不使用完整的 k 维。我们只保留前 r 个最大的奇异值(r < k),以及 TD 中对应的前 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 维向量的相似度。

步骤详解

  1. 获取文档向量: 对于文档 i 和文档 j, 它们的低维表示为 D_r[i]D_r[j](这是两个 1 x r 的行向量)。
  2. 选择相似度度量: 最常用的是余弦相似度
    • 公式:similarity(i, j) = cos(θ) = (D_r[i] · D_r[j]) / (||D_r[i]|| * ||D_r[j]||)
    • “·” 表示点积,|| || 表示向量的模(长度)。
  3. 解释结果: 余弦相似度的值域是[-1, 1],在LSI中通常为[0, 1]。值越接近1,表示两篇文档在潜在语义空间中的方向越一致,语义越相似。

回到例子: 在原始的TF-IDF矩阵中,文档A(含“苹果”、“iPhone”)和文档B(含“科技”、“智能手机”)的向量可能正交(点积为0)。但经过SVD降维到“科技产品”这个语义维度后,它们的文档向量在这个维度上都有很高的值,因此余弦相似度会很高。


5. 处理新文档(查询)

一个实际系统需要计算新文档(查询语句)与已有文档集的相似度。

步骤详解

  1. 向量化新文档: 将新文档进行相同的预处理,并用已有的TF-IDF模型将其转化为一个 m 维的词权重向量 qm x 1)。
  2. 映射到语义空间: 不能直接放入 D_r,因为 D_r 是从训练集分解来的。我们需要将新文档向量 q 投影到已有的语义空间。
    • 投影公式:q_semantic = q^T * T_r * S_r^{-1}
    • q^Tq 的转置(1 x m)。
    • T_rS_r 是从训练集SVD得到的。
    • S_r^{-1}S_r 的逆矩阵(因为 S_r 是对角阵,逆矩阵就是每个对角线元素取倒数)。
    • 结果 q_semantic 是一个 1 x r 的向量,即新文档在r维语义空间中的坐标。
  3. 计算相似度: 用 q_semanticD_r 中的每一个文档向量计算余弦相似度,找出最相似的文档。

总结与回顾

LSI算法流程

  1. 建矩阵: 文档预处理,构建 m x n 的 TF-IDF 词-文档矩阵 X
  2. SVD分解: 对 X 进行奇异值分解,得到 X = T * S * D^T
  3. 降维: 选择保留前 r 个奇异值,得到降维后的词矩阵 T_r、文档矩阵 D_r 和奇异值矩阵 S_r
  4. 表示文档: 每个文档由 D_r 中的一个 r 维向量表示。
  5. 计算相似: 通过比较 D_r 中行向量的余弦相似度来衡量文档间语义相似性。
  6. 处理新查询: 将新文档向量投影到 T_rS_r 定义的语义空间,再与库中文档比较。

优点

  • 能够捕捉潜在的语义关联,克服同义词和多义词问题。
  • 是一种完全无监督的方法。

局限

  • SVD计算复杂度高,对大规模动态更新的文档集不友好。
  • r(潜在语义维度数)需要人为设定,是一个超参数。
  • 可解释性相对较差,我们无法精准命名每个潜在维度“是什么”。

通过以上步骤,LSI成功地将高维、稀疏、嘈杂的词-文档关系,映射到了一个低维、稠密、承载核心语义的向量空间,从而实现了基于语义而非关键词的文本相似度计算。它是现代主题模型(如LDA)和深度语义表示(如词向量、句向量)的重要思想先驱。

基于潜在语义索引(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^T T 是一个 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)和深度语义表示(如词向量、句向量)的重要思想先驱。