IR プロジェクトでコサイン類似度を使用したいのですが、ベクトルのサイズが大きく、float を何度も乗算する必要があるため、時間がかかります。
コサイン類似度をより速く計算する方法はありますか?
ここに私のコードがあります:
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));
}