目前我有两个较大的 50 多个字符串的向量
我希望能够比较这两个向量并计算出它们的相似程度。我想我需要使用余弦相似度?
有谁知道接受两个 Java 向量并给出 0 到 1 之间的值的任何方法,以了解它们的相似程度?
谢谢菲尔
目前我有两个较大的 50 多个字符串的向量
我希望能够比较这两个向量并计算出它们的相似程度。我想我需要使用余弦相似度?
有谁知道接受两个 Java 向量并给出 0 到 1 之间的值的任何方法,以了解它们的相似程度?
谢谢菲尔
有关余弦距离和相关方法的实现,请参阅Apache Mahout 库。还可以考虑查找 Locality Sensitive Hashing 以获得更快的替代方案。
请执行下列操作
package com.example;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/** Computes the similarity between two bags of words.
* 1.0 is most similar, 0.0 is most unsimilar.
*
*/
public class Cosine {
public static double cosine(Collection<String> a, Collection<String> b) {
Map<String,Integer> aa = asBag(a);
Map<String,Integer> bb = asBag(b);
double sum = 0;
for (String word: aa.keySet()) {
if (!bb.containsKey(word)) continue;
sum += aa.get(word) * bb.get(word);
}
return sum / (norm(aa) * norm(bb));
}
private static double norm(Map<String, Integer> bag) {
double sum = 0;
for (int each: bag.values()) sum += each * each;
return Math.sqrt(sum);
}
private static Map<String,Integer> asBag(Collection<String> vector) {
Map<String,Integer> bag = new HashMap<String,Integer>();
for (String word: vector) {
if (!bag.containsKey(word)) bag.put(word,0);
bag.put(word, bag.get(word) + 1);
}
return bag;
}
}
类型推断,有人吗?