Jackcard相似度和余弦相似度(向量空间模型)的java实现
生活随笔
收集整理的這篇文章主要介紹了
Jackcard相似度和余弦相似度(向量空间模型)的java实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主原創文章,地址:http://blog.csdn.net/napoay,轉載請留言。
總結Jackcard相似度和余弦相似度。
一、集合的Jackcard相似度
1.1Jackcard相似度
Jaccard相似指數用來度量兩個集合之間的相似性,它被定義為兩個集合交集的元素個數除以并集的元素個數。
數學公式描述:
J(A,B)=|A∩B||A∪B|
這個看似簡單的算法有很大的用處,比如:
高明的抄襲者為了掩蓋自己抄襲的事實,會選擇性的抄襲文檔中的一些段落,或者對詞語或原始文本中的句序進行改變。jackcard相似度計算適合從字面上進行計算,如果是更高級的抄襲改變了語義jackcard相似度計算就無能為力了
多個主機上建立鏡像以共享加載內容,同一份內容有多個副本,這種情況實現jackcard相似度計算十分有效。
一個記者撰寫了一份新聞稿件投稿多家媒體,稿件經過少量修改后發布,使用這些同源新聞稿可以用jackcard相似度算法來檢測出來
1.2 Java實現
import java.util.HashSet; import java.util.Map; import java.util.Set;/*** Created by bee on 17/4/12.*/ public class JackcardSim {public static double calJackcardSim(Set<String> s1, Set<String> s2) {Set<String> all = new HashSet<>();all.addAll(s1);all.addAll(s2);System.out.println(all);Set<String> both = new HashSet<>();both.addAll(s1);both.retainAll(s2);System.out.println(both);return (double) both.size() / all.size();}public static void main(String[] args) {Set<String> s1 = new HashSet<String>();s1.add("互聯網");s1.add("金融");s1.add("房產");s1.add("融資");s1.add("科技");Set<String> s2 = new HashSet<String>();s2.add("互聯網");s2.add("開源");s2.add("人工智能");s2.add("軟件");s2.add("科技");System.out.println(calJackcardSim(s1, s2));} }運行結果
[科技, 房產, 軟件, 融資, 人工智能, 互聯網, 開源, 金融] [科技, 互聯網] 0.25二、向量空間模型
2.1簡介
向量空間模型是一個把文本文件表示為標識符(比如索引)向量的代數模型。它應用于信息過濾、信息檢索、索引以及相關排序。
文檔和查詢都用向量來表示。
dj=(w1,j,w2,j,...,wt,j)q=(w1,q,w2,q,...,wt,q)
cosθ=d2?q∥d2∥∥∥q∥∥=∑i=1Nwi,jwi,q∑i=1Nw2i,j ̄ ̄ ̄ ̄ ̄ ̄√∑i=1Nw2i,q ̄ ̄ ̄ ̄ ̄ ̄√
2.2、java實現
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set;/*** Created by bee on 17/4/10.*/ public class Vsm {public static double calCosSim(Map<String, Double> v1, Map<String, Double>v2) {double sclar = 0.0,norm1=0.0,norm2=0.0,similarity=0.0;Set<String> v1Keys = v1.keySet();Set<String> v2Keys = v2.keySet();Set<String> both= new HashSet<>();both.addAll(v1Keys);both.retainAll(v2Keys);System.out.println(both);for (String str1 : both) {sclar += v1.get(str1) * v2.get(str1);}for (String str1:v1.keySet()){norm1+=Math.pow(v1.get(str1),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("norm1:"+norm1);System.out.println("norm2:"+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);} }運行結果:
[css, Hello] sclar:5.0 norm1:14.0 norm2:35.0 similarity:0.22587697572631282三、參考資料
https://zh.wikipedia.org/wiki/%E5%90%91%E9%87%8F%E7%A9%BA%E9%96%93%E6%A8%A1%E5%9E%8B
http://baike.baidu.com/link?url=enqtEW1bEXe0iZvil1MBk8m2upnfmN118p4cgjNpYdoJYe2l-FC5_s_yYQAq_3GUtiQW0jgwfMMBBxM0U16JiRKeFToPQ0fj058H7P8mHlZ5RV7rERN9Je7jdrYdA3gI7SRMUNTDnNyGoGgBJZN7sq
總結
以上是生活随笔為你收集整理的Jackcard相似度和余弦相似度(向量空间模型)的java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从windows上传文件到linux,中
- 下一篇: 基于vuejs的移动端分页代码