利用word分詞來計算文本類似度

word分詞提供了多種文本類似度計算方式:java

方式一:餘弦類似度,經過計算兩個向量的夾角餘弦值來評估他們的類似度git

實現類:org.apdplat.word.analysis.CosineTextSimilaritygithub

用法以下:ide

String text1 = "我愛購物";
String text2 = "我愛讀書";
String text3 = "他是黑客";
TextSimilarity textSimilarity = new CosineTextSimilarity();
double score1pk1 = textSimilarity.similarScore(text1, text1);
double score1pk2 = textSimilarity.similarScore(text1, text2);
double score1pk3 = textSimilarity.similarScore(text1, text3);
double score2pk2 = textSimilarity.similarScore(text2, text2);
double score2pk3 = textSimilarity.similarScore(text2, text3);
double score3pk3 = textSimilarity.similarScore(text3, text3);
System.out.println(text1+" 和 "+text1+" 的類似度分值:"+score1pk1);
System.out.println(text1+" 和 "+text2+" 的類似度分值:"+score1pk2);
System.out.println(text1+" 和 "+text3+" 的類似度分值:"+score1pk3);
System.out.println(text2+" 和 "+text2+" 的類似度分值:"+score2pk2);
System.out.println(text2+" 和 "+text3+" 的類似度分值:"+score2pk3);
System.out.println(text3+" 和 "+text3+" 的類似度分值:"+score3pk3);

運行結果以下:idea

我愛購物 和 我愛購物 的類似度分值:1.0
我愛購物 和 我愛讀書 的類似度分值:0.67
我愛購物 和 他是黑客 的類似度分值:0.0
我愛讀書 和 我愛讀書 的類似度分值:1.0
我愛讀書 和 他是黑客 的類似度分值:0.0
他是黑客 和 他是黑客 的類似度分值:1.0


方式二:簡單共有詞,經過計算兩篇文檔共有的詞的總字符數除以最長文檔字符數來評估他們的類似度spa

實現類:org.apdplat.word.analysis.SimpleTextSimilaritycode

用法以下:orm

String text1 = "我愛購物";
String text2 = "我愛讀書";
String text3 = "他是黑客";
TextSimilarity textSimilarity = new SimpleTextSimilarity();
double score1pk1 = textSimilarity.similarScore(text1, text1);
double score1pk2 = textSimilarity.similarScore(text1, text2);
double score1pk3 = textSimilarity.similarScore(text1, text3);
double score2pk2 = textSimilarity.similarScore(text2, text2);
double score2pk3 = textSimilarity.similarScore(text2, text3);
double score3pk3 = textSimilarity.similarScore(text3, text3);
System.out.println(text1+" 和 "+text1+" 的類似度分值:"+score1pk1);
System.out.println(text1+" 和 "+text2+" 的類似度分值:"+score1pk2);
System.out.println(text1+" 和 "+text3+" 的類似度分值:"+score1pk3);
System.out.println(text2+" 和 "+text2+" 的類似度分值:"+score2pk2);
System.out.println(text2+" 和 "+text3+" 的類似度分值:"+score2pk3);
System.out.println(text3+" 和 "+text3+" 的類似度分值:"+score3pk3);

運行結果以下:文檔

我愛購物 和 我愛購物 的類似度分值:1.0
我愛購物 和 我愛讀書 的類似度分值:0.5
我愛購物 和 他是黑客 的類似度分值:0.0
我愛讀書 和 我愛讀書 的類似度分值:1.0
我愛讀書 和 他是黑客 的類似度分值:0.0
他是黑客 和 他是黑客 的類似度分值:1.0


方式三:編輯距離,經過計算兩個字串之間由一個轉成另外一個所需的最少編輯操做次數來評估他們的類似度get

實現類:org.apdplat.word.analysis.EditDistanceTextSimilarity

用法以下:

String text1 = "我愛購物";
String text2 = "我愛讀書";
String text3 = "他是黑客";
Similarity textSimilarity = new EditDistanceTextSimilarity();
double score1pk1 = textSimilarity.similarScore(text1, text1);
double score1pk2 = textSimilarity.similarScore(text1, text2);
double score1pk3 = textSimilarity.similarScore(text1, text3);
double score2pk2 = textSimilarity.similarScore(text2, text2);
double score2pk3 = textSimilarity.similarScore(text2, text3);
double score3pk3 = textSimilarity.similarScore(text3, text3);
System.out.println(text1+" 和 "+text1+" 的類似度分值:"+score1pk1);
System.out.println(text1+" 和 "+text2+" 的類似度分值:"+score1pk2);
System.out.println(text1+" 和 "+text3+" 的類似度分值:"+score1pk3);
System.out.println(text2+" 和 "+text2+" 的類似度分值:"+score2pk2);
System.out.println(text2+" 和 "+text3+" 的類似度分值:"+score2pk3);
System.out.println(text3+" 和 "+text3+" 的類似度分值:"+score3pk3);

運行結果以下:

我愛購物 和 我愛購物 的類似度分值:1.0
我愛購物 和 我愛讀書 的類似度分值:0.5
我愛購物 和 他是黑客 的類似度分值:0.0
我愛讀書 和 我愛讀書 的類似度分值:1.0
我愛讀書 和 他是黑客 的類似度分值:0.0
他是黑客 和 他是黑客 的類似度分值:1.0


方式四:SimHash + 漢明距離,先使用SimHash把不一樣長度的文本映射爲等長文本,而後再計算等長文本的漢明距離

實現類:org.apdplat.word.analysis.SimHashPlusHammingDistanceTextSimilarity

用法以下:

String text1 = "我愛購物";
String text2 = "我愛讀書";
String text3 = "他是黑客";
TextSimilarity textSimilarity = new SimHashPlusHammingDistanceTextSimilarity();
double score1pk1 = textSimilarity.similarScore(text1, text1);
double score1pk2 = textSimilarity.similarScore(text1, text2);
double score1pk3 = textSimilarity.similarScore(text1, text3);
double score2pk2 = textSimilarity.similarScore(text2, text2);
double score2pk3 = textSimilarity.similarScore(text2, text3);
double score3pk3 = textSimilarity.similarScore(text3, text3);
System.out.println(text1+" 和 "+text1+" 的類似度分值:"+score1pk1);
System.out.println(text1+" 和 "+text2+" 的類似度分值:"+score1pk2);
System.out.println(text1+" 和 "+text3+" 的類似度分值:"+score1pk3);
System.out.println(text2+" 和 "+text2+" 的類似度分值:"+score2pk2);
System.out.println(text2+" 和 "+text3+" 的類似度分值:"+score2pk3);
System.out.println(text3+" 和 "+text3+" 的類似度分值:"+score3pk3);

運行結果以下:

我愛購物 和 我愛購物 的類似度分值:1.0
我愛購物 和 我愛讀書 的類似度分值:0.95
我愛購物 和 他是黑客 的類似度分值:0.83
我愛讀書 和 我愛讀書 的類似度分值:1.0
我愛讀書 和 他是黑客 的類似度分值:0.86
他是黑客 和 他是黑客 的類似度分值:1.0


方式五:Jaccard類似性係數,經過計算兩個集合交集的大小除以並集的大小來評估他們的類似度

實現類:org.apdplat.word.analysis.JaccardTextSimilarity

用法以下:

String text1 = "我愛購物";
String text2 = "我愛讀書";
String text3 = "他是黑客";
TextSimilarity textSimilarity = new JaccardTextSimilarity();
double score1pk1 = textSimilarity.similarScore(text1, text1);
double score1pk2 = textSimilarity.similarScore(text1, text2);
double score1pk3 = textSimilarity.similarScore(text1, text3);
double score2pk2 = textSimilarity.similarScore(text2, text2);
double score2pk3 = textSimilarity.similarScore(text2, text3);
double score3pk3 = textSimilarity.similarScore(text3, text3);
System.out.println(text1+" 和 "+text1+" 的類似度分值:"+score1pk1);
System.out.println(text1+" 和 "+text2+" 的類似度分值:"+score1pk2);
System.out.println(text1+" 和 "+text3+" 的類似度分值:"+score1pk3);
System.out.println(text2+" 和 "+text2+" 的類似度分值:"+score2pk2);
System.out.println(text2+" 和 "+text3+" 的類似度分值:"+score2pk3);
System.out.println(text3+" 和 "+text3+" 的類似度分值:"+score3pk3);

運行結果以下:

我愛購物 和 我愛購物 的類似度分值:1.0
我愛購物 和 我愛讀書 的類似度分值:0.5
我愛購物 和 他是黑客 的類似度分值:0.0
我愛讀書 和 我愛讀書 的類似度分值:1.0
我愛讀書 和 他是黑客 的類似度分值:0.0
他是黑客 和 他是黑客 的類似度分值:1.0


方式六:歐幾里得距離(Euclidean Distance),經過計算兩點間的距離來評估他們的類似度

實現類:org.apdplat.word.analysis.EuclideanDistanceTextSimilarity

用法以下:

String text1 = "我愛購物";
String text2 = "我愛讀書";
String text3 = "他是黑客";
TextSimilarity textSimilarity = new EuclideanDistanceTextSimilarity();
double score1pk1 = textSimilarity.similarScore(text1, text1);
double score1pk2 = textSimilarity.similarScore(text1, text2);
double score1pk3 = textSimilarity.similarScore(text1, text3);
double score2pk2 = textSimilarity.similarScore(text2, text2);
double score2pk3 = textSimilarity.similarScore(text2, text3);
double score3pk3 = textSimilarity.similarScore(text3, text3);
System.out.println(text1+" 和 "+text1+" 的類似度分值:"+score1pk1);
System.out.println(text1+" 和 "+text2+" 的類似度分值:"+score1pk2);
System.out.println(text1+" 和 "+text3+" 的類似度分值:"+score1pk3);
System.out.println(text2+" 和 "+text2+" 的類似度分值:"+score2pk2);
System.out.println(text2+" 和 "+text3+" 的類似度分值:"+score2pk3);
System.out.println(text3+" 和 "+text3+" 的類似度分值:"+score3pk3);

運行結果以下:

我愛購物 和 我愛購物 的類似度分值:1.0
我愛購物 和 我愛讀書 的類似度分值:0.41
我愛購物 和 他是黑客 的類似度分值:0.29
我愛讀書 和 我愛讀書 的類似度分值:1.0
我愛讀書 和 他是黑客 的類似度分值:0.29
他是黑客 和 他是黑客 的類似度分值:1.0


方式七:曼哈頓距離(Manhattan Distance),經過計算兩個點在標準座標系上的絕對軸距總和來評估他們的類似度

實現類:org.apdplat.word.analysis.ManhattanDistanceTextSimilarity

用法以下:

String text1 = "我愛購物";
String text2 = "我愛讀書";
String text3 = "他是黑客";
TextSimilarity textSimilarity = new ManhattanDistanceTextSimilarity();
double score1pk1 = textSimilarity.similarScore(text1, text1);
double score1pk2 = textSimilarity.similarScore(text1, text2);
double score1pk3 = textSimilarity.similarScore(text1, text3);
double score2pk2 = textSimilarity.similarScore(text2, text2);
double score2pk3 = textSimilarity.similarScore(text2, text3);
double score3pk3 = textSimilarity.similarScore(text3, text3);
System.out.println(text1+" 和 "+text1+" 的類似度分值:"+score1pk1);
System.out.println(text1+" 和 "+text2+" 的類似度分值:"+score1pk2);
System.out.println(text1+" 和 "+text3+" 的類似度分值:"+score1pk3);
System.out.println(text2+" 和 "+text2+" 的類似度分值:"+score2pk2);
System.out.println(text2+" 和 "+text3+" 的類似度分值:"+score2pk3);
System.out.println(text3+" 和 "+text3+" 的類似度分值:"+score3pk3);

運行結果以下:

我愛購物 和 我愛購物 的類似度分值:1.0
我愛購物 和 我愛讀書 的類似度分值:0.33
我愛購物 和 他是黑客 的類似度分值:0.14
我愛讀書 和 我愛讀書 的類似度分值:1.0
我愛讀書 和 他是黑客 的類似度分值:0.14
他是黑客 和 他是黑客 的類似度分值:1.0
相關文章
相關標籤/搜索