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
相关产品推荐
相关产品推荐

