Javaコード実装コサイン類似度アルゴリズム2文字列類似度比較
2748 ワード
2つの文字列の類似度を比較する必要があるため、最短編集距離アルゴリズムが需要に合わないため、他のアルゴリズムを探して、ネット上でもう一つのアルゴリズム:余弦類似度アルゴリズムを見た.そこで勉強して、ブログを書いて保存して、勉強と後で使うようにしました.コードは次のとおりです.
原理はネット上にすべてあって、このコードもネット上のコードで、私はただ勉強して、自分の理解する注釈を加えました.不足があれば、よろしくお愿いします.
import java.util.HashMap
import java.util.Map;
import java.util.Set;
/*
* ( ) , ,
*/
public class AnotherCompare {
Map vectorMap = new HashMap();
int[] tempArray = null;
public AnotherCompare(String string1, String string2) {
for (Character character1 : string1.toCharArray()) { //
if (vectorMap.containsKey(character1)) { // map
vectorMap.get(character1)[0]++; //key ,
} else {
tempArray = new int[2];
tempArray[0] = 1; // , map , 1
tempArray[1] = 0;
vectorMap.put(character1, tempArray);
}
}
for (Character character2 : string2.toCharArray()) { //
if (vectorMap.containsKey(character2)) {
vectorMap.get(character2)[1]++;
} else {
tempArray = new int[2];
tempArray[0] = 0;
tempArray[1] = 1; //
vectorMap.put(character2, tempArray);
}
}
/*
* ,map key , , 。
*/
}
//
public double sim() { //
double result = 0;
result = pointMulti(vectorMap) / sqrtMulti(vectorMap);
return result; // , , , , ,
}
//
private double sqrtMulti(Map paramMap) {
double result = 0;
result = squares(paramMap); //
result = Math.sqrt(result); // ,
return result;
}
// , ,
private double squares(Map paramMap) {
double result1 = 0;
double result2 = 0;
Set keySet = paramMap.keySet();
for (Character character : keySet) {
int temp[] = paramMap.get(character); // key --
result1 += (temp[0] * temp[0]); //temp[0]
result2 += (temp[1] * temp[1]); //temp[1]
}
return result1 * result2;
}
// , ,
private double pointMulti(Map paramMap) {
double result = 0;
Set keySet = paramMap.keySet(); // map key , set, list
for (Character character : keySet) { // key
int temp[] = paramMap.get(character); // key
result += (temp[0] * temp[1]);
}
return resul
}
原理はネット上にすべてあって、このコードもネット上のコードで、私はただ勉強して、自分の理解する注釈を加えました.不足があれば、よろしくお愿いします.