问AI: 文本相似度上使用余弦相似度计算的原理是什么
下面从原理、步骤和直观理解三个方面详细说明:
一、基本原理
1. 文本 → 向量
计算机无法直接处理文字,因此需要将文本转换为数值向量。常用方法包括:
- 词袋模型(Bag of Words, BoW)
- TF-IDF(Term Frequency–Inverse Document Frequency)
- 词嵌入(Word Embedding) :如 Word2Vec、GloVe
- 句/文档嵌入(Sentence/Document Embedding) :如 BERT、Sentence-BERT、OpenAI Embedding
无论哪种方法,最终目标都是把一段文本映射到一个高维空间中的向量。
2. 向量方向 ≈ 语义方向
- 如果两段文本讨论的主题、用词、语义相近,它们的向量在高维空间中会指向相似的方向。
- 余弦相似度正好衡量的是两个向量方向的接近程度,而不受文本长度(即向量模长)影响。
例如:“我喜欢苹果” 和 “我爱吃苹果” 内容相似,但字数不同。余弦相似度能忽略长度差异,聚焦语义一致性。
二、计算步骤(以 TF-IDF 为例)
假设我们有两段文本:
- 文本 A: “猫 喜欢 吃 鱼”
- 文本 B: “狗 喜欢 吃 骨头”
步骤 1:构建词汇表(Vocabulary)
所有唯一词:{猫, 喜欢, 吃, 鱼, 狗, 骨头} → 共6维
步骤 2:将文本转为 TF-IDF 向量
(简化起见,这里用词频代替 TF-IDF)
- A 向量 = [1, 1, 1, 1, 0, 0]
- B 向量 = [0, 1, 1, 0, 1, 1]
步骤 3:计算余弦相似度
→ 相似度为 0.5,说明有一定重合(“喜欢”“吃”),但主题不同(猫 vs 狗,鱼 vs 骨头)。
三、为什么余弦相似度适合文本?
✅ 优势:
-
对文本长度不敏感
- 长文档和短文档只要用词分布相似,就能得到高相似度。
- 欧式距离会因长度差异而失真。
-
适用于高维稀疏向量
- 文本向量通常维度高(成千上万个词)、大部分为0(稀疏)。
- 余弦计算只关注非零维度的重叠,效率高。
-
与语义直觉一致
- 共享关键词越多、权重越匹配 → 方向越接近 → 余弦值越高。
📌 补充:现代嵌入模型中的使用
在 BERT 或 Sentence-BERT 中:
- 每个句子被编码为一个稠密向量(如 768 维)。
- 这些向量已经蕴含了上下文语义。
- 直接计算两个句子向量的余弦相似度,即可判断语义是否相近。
例如:“如何煮咖啡?” 和 “怎样冲泡咖啡?” 的 BERT 向量余弦相似度可能高达 0.9+。
四、总结一句话
文本余弦相似度的本质,是将语言问题转化为几何问题——用向量方向的夹角来量化语义的接近程度。
这种方法简洁、高效,且在实践中被广泛验证有效,是自然语言处理中最基础也最重要的相似度度量手段之一。