You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:查询词与文档间的夹角相似度计算方法咨询

嘿,我来帮你把这个夹角计算的逻辑掰碎了讲清楚——其实本质就是用余弦相似度来衡量查询和文档的相关性,咱们拿你给的例子一步步走,你肯定能懂~

第一步:把文档和查询转换成统一维度的向量

首先得先确定一个词汇表——也就是所有出现在文档和查询里的唯一单词集合。你的例子里:

  • 文档内容:"This world is fake"
  • 查询内容:"fake"
    所以咱们的词汇表就是:["This", "world", "is", "fake"]

接下来,每个文本(不管是文档还是查询)都要转换成这个词汇表维度的向量,向量的每个分量对应词汇表中单词的出现次数(也就是词频TF):

  • 文档向量:[1, 1, 1, 1](每个单词各出现一次)
  • 查询向量:[0, 0, 0, 1](只有"fake"出现了一次)
第二步:计算余弦相似度(对应夹角的余弦值)

两个向量之间的夹角θ的余弦值,就是衡量它们相似度的核心指标,公式是:

cosθ = (向量A · 向量B) / (||向量A|| * ||向量B||)

咱们拆解一下这个公式的各个部分:

  • 向量点积:把两个向量对应位置的分量相乘,再把结果加起来。你的例子里就是:(1*0) + (1*0) + (1*0) + (1*1) = 1
  • 向量的模长:把向量每个分量的平方加起来,再开根号。
    • 文档向量的模长:√(1² + 1² + 1² + 1²) = √4 = 2
    • 查询向量的模长:√(0² + 0² + 0² + 1²) = √1 = 1

把数值代入公式,得到:cosθ = 1 / (2*1) = 0.5

第三步:从余弦值反推具体夹角(可选)

如果你需要得到具体的角度值,用反余弦函数计算就行:
θ = arccos(0.5) = 60°(或者用弧度表示的π/3)

扩展到多文档的情况

如果有一堆文档,逻辑也是完全一样的:

  • 先收集所有文档和查询里的单词,构建一个统一的大词汇表
  • 把每个文档都转换成这个词汇表维度的词频向量
  • 把查询也转换成同样维度的向量
  • 逐个对文档向量和查询向量计算余弦相似度(也就是夹角的余弦值)
  • 余弦值越接近1,说明两个向量的夹角越小,文档和查询的相关性就越高
补充:关于向量分量的进阶选择

你提到“将文档表示为向量时,每个向量分量代表t...”,其实除了简单的词频,还可以用**TF-IDF(词频-逆文档频率)**来计算向量分量——它会给那些只在少数文档里出现的词更高的权重,比如你的例子里"fake"如果只在这个文档出现,TF-IDF权重会比其他词高,这样计算出来的相似度会更精准,但核心的夹角计算逻辑是完全一致的,只是向量里的数值变了而已。

内容的提问来源于stack exchange,提问作者unwound clock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:58:33