| 维度 i | vec1[i] (句子1) |
vec2[i] (句子2) |
vec1[i] × vec2[i] (点积分量) |
vec1[i]² (模长分量) |
vec2[i]² (模长分量) |
|---|
public static double cosineSimilarity(float[] vec1, float[] vec2) { // 初始化三个累加器 double dotProduct = 0.0; // 点积:A·B double norm1 = 0.0; // ||A||² double norm2 = 0.0; // ||B||² // 遍历所有维度(768维) for (int i = 0; i < vec1.length; i++) { dotProduct += vec1[i] * vec2[i]; // 累加点积 norm1 += vec1[i] * vec1[i]; // 累加A的平方和 norm2 += vec2[i] * vec2[i]; // 累加B的平方和 } // 返回余弦相似度 return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2)); }
| 夹角 θ | cos(θ) | 相似度判断 | 示例 |
|---|---|---|---|
| 0° | 1.000 | 完全相同 | 相同句子 |
| 15° | 0.966 | 非常相似 | 同义句 |
| 30° | 0.866 | 高度相似 | "Java编程" vs "Java教程" |
| 45° | 0.707 | 中等相似 | 相关主题 |
| 60° | 0.500 | 部分相关 | 有一定关联 |
| 85° | 0.087 | 几乎无关 | "Java" vs "天气" |
| 90° | 0.000 | 完全无关(正交) | 不同主题 |