我想在我的 IR 项目中使用余弦相似度,但是因为向量的大小很大并且必须多次乘以浮点数,所以需要很长时间。
有什么方法可以更快地计算余弦相似度?
这是我的代码:
private double diffrence(HashMap<Integer, Float> hashMap,
HashMap<Integer, Float> hashMap2 ) {
Integer[] keys = new Integer[hashMap.size()];
hashMap.keySet().toArray(keys);
float ans = 0;
for (int i = 0; i < keys.length; i++) {
if (hashMap2.containsKey(keys[i])) {
ans += hashMap.get(keys[i]) * hashMap2.get(keys[i]);
}
}
float hashLength = 0;
for (int i = 0; i < keys.length; i++) {
hashLength += (hashMap.get(keys[i]) * hashMap.get(keys[i]));
}
hashLength = (float) Math.sqrt(hashLength);
Integer[] keys2 = new Integer[hashMap2.size()];
hashMap2.keySet().toArray(keys2);
float hash2Length = 0;
for (int i = 0; i < keys2.length; i++) {
hash2Length += hashMap2.get(keys2[i]) * hashMap2.get(keys2[i]);
}
hash2Length = (float) Math.sqrt(hash2Length);
return (float) (ans /(hash2Length*hashLength));
}