k-shingle
文檔的k-shingle算法
本文主要是講解以Java實現(xiàn)。首先得出兩篇文檔的k-shingle,然后計算他們的Jaccard相似度:
集合的Jaccard相似度
集合S和T的Jaccard相似度為|S∩T|/|S∩T|,也就是集合S和T的交集的集合和集合并集大小之間的比率。一般將和T的相似度記作SIM(S,T)。
k-shingle
一篇文檔就是一個字符串。文檔的k-shingle定義為其中任意長度為k的子串。
假設(shè)文檔D為字符串a(chǎn)bcdabd,選擇k = 2, 則文檔中的所有2-shingle組成的集合為{ab,bc,cd,da,bd}。
計算 str1 = “ABCDE” 和 str2 = “ABCDF” 的 2-shingle 的jaccard相似度
- 當(dāng) k = 2時, str1 的 2-shingle 為集合A = {AB,BC,CD,DE},而str2的 2-shingle為集合B={AB,BC,CD,DF}。
- 因為A∪B = {AB,BC,CD,DE,DF},并且A∩B={AB,BC,CD},所以 SIM(A,B) = 3/5;
java代碼實現(xiàn)
import java.util.*;public class ShingleBased {public static void main(String args[]){ShingleBased j2 = new ShingleBased(2);// AB BC CD DE DF// 1 1 1 1 0// 1 1 1 0 1// => 3 / 5 = 0.6System.out.println(j2.similarity("ABCDE", "ABCDF"));}private int k;ShingleBased(final int k) {this.k = k;}public int getK() {return k;}public final Map<String, Integer> getProfile(String string) {HashMap<String, Integer> shingles = new HashMap<String, Integer>();for (int i = 0; i < (string.length() - k + 1); i++) {String shingle = string.substring(i, i + k);Integer old = shingles.get(shingle);if (old != null) {shingles.put(shingle, old + 1);} else {shingles.put(shingle, 1);}}return shingles;}public final double similarity(final String s1, final String s2) {if (s1.equals(s2)) {return 1;}Map<String, Integer> profile1 = getProfile(s1);Map<String, Integer> profile2 = getProfile(s2);Set<String> union = new HashSet<String>();union.addAll(profile1.keySet());union.addAll(profile2.keySet());int inter = profile1.keySet().size() + profile2.keySet().size()- union.size();return 1.0 * inter / union.size();}}- 文檔的k-shingle算法
- k-shingle
-
- 計算 str1 ABCDE 和 str2 ABCDF 的 2-shingle 的jaccard相似度
- java代碼實現(xiàn)
參考
- 大數(shù)據(jù)互聯(lián)網(wǎng)大規(guī)模數(shù)據(jù)挖掘與分布式處理
- github.
總結(jié)
- 上一篇: 大学四年的总结与感受
- 下一篇: You have enabled che