使用Python中的余弦相似度测量两个句子之间的相似度

2025 年 1 月 4 日 | 阅读 6 分钟

句子相似性介绍

句子相似性是自然语言处理 (NLP) 中的一个关键概念,它衡量两个句子在意义或内容上的相似程度。这种衡量对于各种应用至关重要,包括:

  1. 信息检索
  2. 文本摘要
  3. 问答系统
  4. 抄袭检测
  5. 推荐系统

处理句子相似性的一种流行技术是余弦相似度,我们将在本次解释中重点关注它。

理解余弦相似度

余弦相似度是一种测量工具,用于确定两个向量的相似程度,而不考虑它们的幅度。它计算两个向量之间夹角的余弦值。在文本分析的上下文中,这些向量在多维空间中代表句子。

余弦相似度的公式为:

其中

  • A · B 是向量 A 和 B 的点积
  • ||A|| 和 ||B|| 是向量 A 和 B 的幅度(欧几里得范数)

结果值的范围从 -1 到 1,其中:

  1. 1 表示完全相似
  2. 0 表示没有相似性
  3. -1 表示完全不相似(尽管由于非负值,这在文本分析中很少见)

文本预处理

在计算相似性之前,预处理文本通常很有用。常见的预处理步骤包括:

  1. 转换为小写
  2. 去除标点符号
  3. 去除停用词
  4. 词干提取或词形还原

让我们来实现这些预处理步骤。

示例

输出

 
Original sentence 1: The quick brown fox jumps over the lazy dog
Preprocessed sentence 1: quick brown fox jump lazi dog
Original sentence 2: The lazy dog is jumped over by the quick brown fox
Preprocessed sentence 2: lazi dog jump quick brown fox   

向量化技术

要应用余弦相似度,我们需要将文本转换为数学向量。有几种方法可以做到这一点:

  1. 计数向量化
  2. TF-IDF(词频-逆文档频率)
  3. 词嵌入(例如 Word2Vec、GloVe)

让我们同时实现计数向量化和 TF-IDF。

示例

输出

 
Count Vectorization:
[[1 1 1 1 1 1]
 [1 1 1 1 1 1]]
TF-IDF Vectorization:
[[0.44943642 0.44943642 0.44943642 0.44943642 0.44943642 0.44943642]
 [0.44943642 0.44943642 0.44943642 0.44943642 0.44943642 0.44943642]]   

在 Python 中实现余弦相似度

既然我们有了向量化后的句子,我们如何实现余弦相似度函数呢?

示例

输出

 
Cosine Similarity (Count Vectorization): 1.0
Cosine Similarity (TF-IDF Vectorization): 1.0   

在这种情况下,两种技术都产生了完美的相似度分数 1.0,因为在预处理之后,我们的句子以相同的顺序包含相同的词。

高级技术和注意事项

虽然基本实现对于简单情况效果很好,但有一些高级技术和注意事项需要牢记:

a) N-grams:不单独使用单词,我们可以使用连续单词的组合(n-grams)来捕获更多上下文。

示例

输出

 
TF-IDF Vectorization with n-grams:
[[0.27735010 0.27735010 0.27735010 0.27735010 0.27735010 0.27735010
  0.27735010 0.27735010 0.27735010 0.27735010 0.27735010]
 [0.27735010 0.27735010 0.27735010 0.27735010 0.27735010 0.27735010
  0.27735010 0.27735010 0.27735010 0.27735010 0.27735010]]
Cosine Similarity (TF-IDF with n-grams): 1.0   

b) 词嵌入:而不是使用像计数向量化或 TF-IDF 这样的词袋模型,我们可以使用预训练的词嵌入,如 Word2Vec 或 GloVe。

示例

输出

 
Cosine Similarity (Word2Vec): 0.9789562821388245   

c) 加权词嵌入:我们可以将词嵌入与 TF-IDF 权重结合起来以获得更好的表示。

示例

输出

 
Cosine Similarity (Weighted Word2Vec): 0.9789562821388245   

余弦相似度的应用

  1. 信息检索和搜索引擎
    1. 文档相似性:余弦相似度有助于估算两个文档的相似程度,这对于搜索引擎和信息检索系统至关重要。它允许这些系统根据与用户查询的相关性对文档进行排序。
    2. 查询匹配:当用户输入查询时,搜索引擎会将查询和文档转换为向量形式,并使用余弦相似度来检索与查询最相似的文档。
  2. 推荐系统
    1. 基于内容的推荐:在电子商务和流媒体平台中,余弦相似度用于根据描述和用户画像推荐产品或内容。例如,如果用户喜欢某种类型的书籍,系统就可以推荐相似的书籍。
    2. 用户相似性:通过找到用户偏好或行为之间的相似性,协同过滤方法可以提供个性化推荐。
  3. 文本挖掘和自然语言处理 (NLP)
    1. 文本分类:使用余弦相似度将文本向量与预定义的分类向量进行比较,可以改进电子邮件分类(如垃圾邮件检测)、情感分析和主题分类。
    2. 抄袭检测:通过比较文档或段落,余弦相似度可以通过查找高度相似的文本部分来帮助识别重复内容。
  4. 社交网络分析
    1. 社区检测:余弦相似度有助于根据用户行为、交互或画像在社交网络中识别群组或社区。
    2. 好友推荐:Facebook 或 LinkedIn 等社交网络通过比较用户画像和活动,使用余弦相似度来推荐好友或联系人。
  5. 生物信息学
    1. 基因表达分析:在生物信息学中,余弦相似度用于比较基因表达谱,以识别具有相似表达模式的基因,这对于理解基因功能和疾病机制至关重要。
    2. 蛋白质序列分析:相似性度量有助于比较蛋白质序列以预测其结构和功能,从而支持药物发现和开发。
  6. 图像处理
    1. 图像检索:基于内容的图像检索系统使用余弦相似度来查找与查询图像相似的图像,这是基于从图像中提取的特征向量。
    2. 面部识别:在安全和身份验证系统中,余弦相似度有助于比较面部特征向量以识别或验证个人。

结论

余弦相似度是一种强大而灵活的工具,用于测量向量之间的相似性,尤其是在文本和数据分析中。其应用范围涵盖信息检索、搜索引擎、推荐系统、文本挖掘、社交网络分析、生物信息学、图像处理和购物篮分析。在信息检索和搜索引擎中,余弦相似度通过比较文档和查询向量来增强搜索结果的相关性。推荐系统利用它通过比较用户偏好和商品描述来提供个性化推荐。在文本挖掘和 NLP 中,它通过衡量文本相似性来辅助文本分类、情感分析和抄袭检测。社交网络分析利用它来识别社区并根据用户相似性推荐联系人。在生物信息学中,它分析基因表达谱和蛋白质序列以推进生物学研究。图像处理通过比较图像特征向量,从基于内容的图像检索和面部识别中受益。购物篮分析使用余弦相似度来识别经常一起购买的商品,并细分客户以进行定向营销。诸如根据用户查询推荐商品或在语料库中查找相似文档等实际应用,展示了余弦相似度在不同领域中的有效性和多功能性。