要计算两个句子嵌入之间的余弦相似度,您可以使用 NumPy、PyTorch 或 TensorFlow 等库中的数学运算。 余弦相似度测量两个向量之间的角度,产生一个介于 -1(相反)和 1(相同)之间的值。 该公式是向量的点积除以其大小的乘积。 库提供内置函数或直接的方式来实现这一点。
例如,使用 NumPy,您可以手动计算它。 假设 embedding1
和 embedding2
是 NumPy 数组。 使用 np.dot()
计算点积,然后除以它们的 L2 范数的乘积(通过 np.linalg.norm()
计算)。 这是一个代码片段
import numpy as np
dot_product = np.dot(embedding1, embedding2)
norm_a = np.linalg.norm(embedding1)
norm_b = np.linalg.norm(embedding2)
similarity = dot_product / (norm_a * norm_b)
这适用于一维向量。 如果使用批量的嵌入,请确保数组是二维的,并调整 np.linalg.norm()
中的 axis
参数为 axis=1
。 像 PyTorch 这样的库进一步简化了这一点。 使用 PyTorch,使用 torch.nn.functional.cosine_similarity()
import torch
import torch.nn.functional as F
# Convert embeddings to tensors
tensor1 = torch.tensor(embedding1)
tensor2 = torch.tensor(embedding2)
similarity = F.cosine_similarity(tensor1, tensor2, dim=0)
dim
参数指定要减少的维度(对于批量处理,使用 dim=1
)。 PyTorch 在内部处理规范化,使其对于 GPU 计算非常有效。
关键的考虑因素包括确保嵌入已归一化(单位向量)以获得准确的结果。 某些库(例如 Hugging Face 的 sentence-transformers
)返回预归一化的嵌入,因此不需要额外的归一化。 对于自定义嵌入,请首先使用 sklearn.preprocessing.normalize()
或 torch.nn.functional.normalize()
对其进行归一化。 避免常见的错误,例如维度不匹配或使用非浮点数据。 如果性能至关重要,请优先选择特定于库的函数(例如,PyTorch 的 cosine_similarity
)而不是手动实现,因为它们优化了底层操作。 对于大规模应用程序,请考虑批量处理和 GPU 加速。