余弦相似度揭秘:如何用数学丈量文本之间的“距离”
余弦相似度是自然语言处理(NLP)中用于语义搜索、文档比较等任务的常用度量方法。尽管许多入门级NLP课程会提到使用余弦相似度而非欧几里得距离,但往往缺乏对其数学原理的深入解释,导致数据科学家对其理解停留在表面。本文旨在揭示余弦相似度背后的数学直觉,并通过Python实践案例帮助理解其在实际中的应用。 余弦相似度基于三角函数中的余弦函数。在0到2π的范围内,余弦函数在0和2π处取得最大值1,在π处取得最小值-1,在π/2和3π/2处为0。这一特性恰好对应向量之间的方向关系:当两个向量方向一致时,余弦值为1;方向相反时为-1;相互垂直时为0。这正体现了NLP中的两个核心概念——语义重叠(如“电影”与“影片”)和语义极性(如“好”与“坏”)。因此,余弦相似度能有效捕捉词语或句子在语义上的相似性与对立性。 数学上,两个向量U和V之间的余弦相似度定义为它们的点积除以各自模长的乘积: cos(θ) = (U·V) / (||U|| × ||V||) 该公式可由余弦定理推导而来。在实际应用中,我们通常无法直接获得角度,而需通过向量本身计算。 与之相对,欧几里得距离衡量的是向量间的直线距离,其值始终非负,且受向量长度影响。这意味着即使两个文本语义相似但长度不同,其欧氏距离也可能较大,导致误判。而余弦相似度仅关注方向,对向量大小不敏感,因此在NLP中更受青睐。 为验证这一理论,我们使用两个不同预训练模型对“movie”“film”“good”“bad”“spoon”“car”等词进行嵌入。第一个模型all-MiniLM-L6-v2不编码极性,第二个distilbert-base-uncased-finetuned-sst-2-english则专门优化了情感极性表达。 结果显示: - “movie”与“film”的余弦相似度接近1,体现高度语义重叠; - “good”与“bad”在第二个模型中相似度为负值(约-0.34),反映出语义对立; - “spoon”与“car”相似度较低(约0.23或0.54),表明语义无关。 由此可见,余弦相似度的解释高度依赖于所用嵌入模型是否包含极性信息。若模型能同时捕捉语义重叠与极性,则余弦相似度可更全面地反映文本间的关系。 总之,余弦相似度的核心在于方向而非大小,是衡量语义相似性的理想工具,尤其适用于语义搜索、聚类和推荐系统等场景。理解其数学本质,有助于更准确地解读模型输出结果。
