tf-idf
TF-IDF(term frequency–inverse document frequency)
词频-逆文档频率。
从感性的角度看,一个词在一篇文档中出现的频率越高,则相关性越高,词频(tf)就越高,相关性也越高。 但是,如果该词在所有文档中出现的频率也很高,则说明该词很普遍,区分度没那么高,文档频率高,逆文档频率(idf)低,相关性就低。
最终已 tf * idf 综合起来评估相关性。
空间向量模型
余弦相似性理论,两个空间向量越相似,夹角越小。
public class VSM {
/**
* 计算两个向量之间的余弦相似度
* @param vl
* @param v2
* @return
*/
public static double calCosSim(Map<String, Double> vl,
Map<String, Double> v2) {
double sclar = 0.0, norm1 = 0.0, norm2 = 0.0, similarity = 0.0;
Set<String> vlKeys = vl.keySet();
Set<String> v2Keys = v2.keySet();
Set<String> both = new HashSet<>();
both.addAll(vlKeys);
both.retainAll(v2Keys);
System.out.println(both);
for (String strl : both) {
sclar += vl.get(strl) * v2.get(strl);
}
for (String strl : vl.keySet()) {
norm1 += Math.pow(vl.get(strl), 2);
}
for (String str2 : v2.keySet()) {
norm2 += Math.pow(v2.get(str2), 2);
}
similarity = sclar / Math.sqrt(norm1 * norm2);
System.out.println("sclar:" + sclar);
System.out.println("norrnl :" + norm1);
System.out.println("norrn2 :"+ norm2);
System.out.println("similarity :" + similarity);
return similarity;
}
public static void main(String[] args) {
Map<String, Double> m1= new HashMap<>();
m1.put ("Hello", 1.0);
m1 .put ("css", 2.0) ;
m1.put ("Lucene", 3.0) ;
Map<String, Double> m2= new HashMap<>();
m2.put ("Hello", 1.0);
m2.put ("Word", 2.0) ;
m2.put ("Hadoop", 3.0);
m2.put ("java", 4.0) ;
m2 .put ("html", 1.0) ;
m2.put ("css", 2.0);
calCosSim(m1, m2);
}
}