天天看點

文本相似度(小說去重)

之前寫了爬蟲爬取小說,總檔案大概70G。但如果換小說網站進行爬取會重複爬取同樣的小說,産生不必要的空間浪費。

由于不同網站對小說命名不同,例如:小說名 鬥羅大陸.txt,在小說網A命名為鬥羅大陸,小說B<鬥羅大陸>,小說C 鬥羅大陸全集什麼的。

如果從小說名來判斷會有很多麻煩,并且有的小說網站小說名和小說内容嚴重不符,是以根據小說名來判斷被否決。

随着研究的深入,發現一種可行方法。一篇文章由詞組成,那麼不同文章的詞有很大機率是不同的。如果以詞的分布來判斷兩篇文章是否相同是可行的。

第一步,首先将文章變為詞語,首先借助了分詞器。網上有開源代碼,功能是将字元串分為字元串數組,單個字元串就是一個詞。使用的分詞器為 mahonia,github位址為https://github.com/axgle/mahonia。使用簡單、易上手。

第二步,将字元串數組轉換為map[string]int結構,其記錄對應詞出現的次數。到了這一步基本已經弄完,隻需要選取合适的計算方法即可。

首先選擇了 修正餘弦相似度(Adjusted Cosine Similarity),經過微調對map中所有次數-5,提高準确率。不計微調數與權重,比如: 小說A中 我:5次 鬥羅:3次 武器:2次. 小說B: 我:6次,武器:3次, 長劍:2次,那麼其餘弦相似為83.428%

文本相似度(小說去重)
文本相似度(小說去重)
文本相似度(小說去重)

但是發現有時兩本大小相差1倍的小說相似度達到 90%,經過查詢發現餘弦相似度更加注重兩個向量在方向上的差異,而不是距離。是以可能兩本小說用詞相似都但數量相差巨大時,修正餘弦相似度較為不準确。

是以考慮第二種計算方法進行修正,最終選擇jaccard相似度。jaccard相似度用于比較有限樣本集之間的相似性和差異性,不知道合不合适先用在說。。

文本相似度(小說去重)

以剛才例子計算相似度,結果為:(|6+3+3+2| - |5+2|)/(6+3+3+2)=50%,其相似度降低了很多進行了很好的修正。兩者平均相似度為66.7%,其區分程度更大。

專門選取不同網站下載下傳小說來進行測試,權重為詞語長度,以下是對比結果:

酒神1.txt 酒神.txt a:0.967682 C:0.998191 j:0.937174

酒神1.txt 武動乾坤(天蠶).txt a:0.593385 C:0.845842 j:0.340929

酒神1.txt 啃星書庫kenxingw.com-武動乾坤.txt a:0.593031 C:0.845635 j:0.340427

酒神1.txt 莽荒紀.txt a:0.547015 C:0.763532 j:0.330498

酒神1.txt 莽荒紀1.txt a:0.544322 C:0.757338 j:0.331306

酒神1.txt 莽荒紀2.txt a:0.544320 C:0.757337 j:0.331302

酒神1.txt 《全職高手》(精校版全本)作者:蝴蝶藍.txt a:0.578364 C:0.866427 j:0.290301

酒神1.txt 鬥羅大陸III龍王傳說1.txt a:0.657501 C:0.899107 j:0.415895

酒神1.txt 全職高手(蝴蝶).txt a:0.577625 C:0.867506 j:0.287745

酒神1.txt 鬥羅大陸III龍王傳說.txt a:0.659314 C:0.899833 j:0.418796

酒神1.txt 啃星書庫kenxingw.com-全職高手.txt a:0.578506 C:0.866762 j:0.290249

酒神.txt 武動乾坤(天蠶).txt a:0.591176 C:0.843790 j:0.338562

酒神.txt 啃星書庫kenxingw.com-武動乾坤.txt a:0.590910 C:0.843591 j:0.338228

酒神.txt 莽荒紀.txt a:0.545312 C:0.763509 j:0.327114

酒神.txt 莽荒紀1.txt a:0.543690 C:0.757650 j:0.329730

酒神.txt 莽荒紀2.txt a:0.543684 C:0.757649 j:0.329718

酒神.txt 《全職高手》(精校版全本)作者:蝴蝶藍.txt a:0.575477 C:0.864308 j:0.286646

酒神.txt 鬥羅大陸III龍王傳說1.txt a:0.655554 C:0.897006 j:0.414102

酒神.txt 全職高手(蝴蝶).txt a:0.574086 C:0.865221 j:0.282951

酒神.txt 鬥羅大陸III龍王傳說.txt a:0.657704 C:0.897861 j:0.417546

酒神.txt 啃星書庫kenxingw.com-全職高手.txt a:0.575529 C:0.864626 j:0.286433

武動乾坤(天蠶).txt 啃星書庫kenxingw.com-武動乾坤.txt a:0.996710 C:0.999981 j:0.993440

武動乾坤(天蠶).txt 莽荒紀.txt a:0.555449 C:0.775417 j:0.335482

武動乾坤(天蠶).txt 莽荒紀1.txt a:0.555235 C:0.773260 j:0.337210

武動乾坤(天蠶).txt 莽荒紀2.txt a:0.555229 C:0.773260 j:0.337199

武動乾坤(天蠶).txt 《全職高手》(精校版全本)作者:蝴蝶藍.txt a:0.552836 C:0.821137 j:0.284534

武動乾坤(天蠶).txt 鬥羅大陸III龍王傳說1.txt a:0.580882 C:0.822520 j:0.339244

武動乾坤(天蠶).txt 全職高手(蝴蝶).txt a:0.552261 C:0.821915 j:0.282606

武動乾坤(天蠶).txt 鬥羅大陸III龍王傳說.txt a:0.582514 C:0.823738 j:0.341289

武動乾坤(天蠶).txt 啃星書庫kenxingw.com-全職高手.txt a:0.552997 C:0.821443 j:0.284551

啃星書庫kenxingw.com-武動乾坤.txt 莽荒紀.txt a:0.555231 C:0.775296 j:0.335166

啃星書庫kenxingw.com-武動乾坤.txt 莽荒紀1.txt a:0.555173 C:0.773218 j:0.337127

啃星書庫kenxingw.com-武動乾坤.txt 莽荒紀2.txt a:0.555170 C:0.773218 j:0.337122

啃星書庫kenxingw.com-武動乾坤.txt 《全職高手》(精校版全本)作者:蝴蝶藍.txt a:0.552470 C:0.820853 j:0.284087

啃星書庫kenxingw.com-武動乾坤.txt 鬥羅大陸III龍王傳說1.txt a:0.580593 C:0.822278 j:0.338908

啃星書庫kenxingw.com-武動乾坤.txt 全職高手(蝴蝶).txt a:0.551799 C:0.821627 j:0.281972

啃星書庫kenxingw.com-武動乾坤.txt 鬥羅大陸III龍王傳說.txt a:0.582252 C:0.823503 j:0.341001

啃星書庫kenxingw.com-武動乾坤.txt 啃星書庫kenxingw.com-全職高手.txt a:0.552594 C:0.821155 j:0.284033

莽荒紀.txt 莽荒紀1.txt a:0.984064 C:0.998058 j:0.970069

莽荒紀.txt 莽荒紀2.txt a:0.984045 C:0.998058 j:0.970032

莽荒紀.txt 《全職高手》(精校版全本)作者:蝴蝶藍.txt a:0.548221 C:0.804219 j:0.292224

莽荒紀.txt 鬥羅大陸III龍王傳說1.txt a:0.563255 C:0.782800 j:0.343709

莽荒紀.txt 全職高手(蝴蝶).txt a:0.548190 C:0.804971 j:0.291409

莽荒紀.txt 鬥羅大陸III龍王傳說.txt a:0.564059 C:0.783593 j:0.344525

莽荒紀.txt 啃星書庫kenxingw.com-全職高手.txt a:0.548498 C:0.804490 j:0.292506

莽荒紀1.txt 莽荒紀2.txt a:0.999967 C:1.000000 j:0.999934

莽荒紀1.txt 《全職高手》(精校版全本)作者:蝴蝶藍.txt a:0.545021 C:0.799901 j:0.290142

莽荒紀1.txt 鬥羅大陸III龍王傳說1.txt a:0.559142 C:0.776930 j:0.341353

莽荒紀1.txt 全職高手(蝴蝶).txt a:0.544549 C:0.800600 j:0.288497

莽荒紀1.txt 鬥羅大陸III龍王傳說.txt a:0.560434 C:0.777833 j:0.343034

莽荒紀1.txt 啃星書庫kenxingw.com-全職高手.txt a:0.545163 C:0.800136 j:0.290190

莽荒紀2.txt 《全職高手》(精校版全本)作者:蝴蝶藍.txt a:0.545019 C:0.799900 j:0.290137

莽荒紀2.txt 鬥羅大陸III龍王傳說1.txt a:0.559138 C:0.776930 j:0.341346

莽荒紀2.txt 全職高手(蝴蝶).txt a:0.544546 C:0.800600 j:0.288492

莽荒紀2.txt 鬥羅大陸III龍王傳說.txt a:0.560429 C:0.777833 j:0.343025

莽荒紀2.txt 啃星書庫kenxingw.com-全職高手.txt a:0.545161 C:0.800135 j:0.290186

《全職高手》(精校版全本)作者:蝴蝶藍.txt 鬥羅大陸III龍王傳說1.txt a:0.635169 C:0.884689 j:0.385649

《全職高手》(精校版全本)作者:蝴蝶藍.txt 全職高手(蝴蝶).txt a:0.980862 C:0.999105 j:0.962619

《全職高手》(精校版全本)作者:蝴蝶藍.txt 鬥羅大陸III龍王傳說.txt a:0.635735 C:0.885531 j:0.385940

《全職高手》(精校版全本)作者:蝴蝶藍.txt 啃星書庫kenxingw.com-全職高手.txt a:0.997628 C:0.999979 j:0.995277

鬥羅大陸III龍王傳說1.txt 全職高手(蝴蝶).txt a:0.635022 C:0.885465 j:0.384580

鬥羅大陸III龍王傳說1.txt 鬥羅大陸III龍王傳說.txt a:0.991381 C:0.998708 j:0.984054

鬥羅大陸III龍王傳說1.txt 啃星書庫kenxingw.com-全職高手.txt a:0.635297 C:0.884980 j:0.385613

全職高手(蝴蝶).txt 鬥羅大陸III龍王傳說.txt a:0.635432 C:0.886276 j:0.384588

全職高手(蝴蝶).txt 啃星書庫kenxingw.com-全職高手.txt a:0.982313 C:0.999223 j:0.965402

鬥羅大陸III龍王傳說.txt 啃星書庫kenxingw.com-全職高手.txt a:0.635872 C:0.885819 j:0.385924

開頭為小說名,a為平均相似度,c為餘弦相似度,j為jaccard相似度。

從測試結果看 jaccard相似度很好的修正了相似度。

鬥羅大陸III龍王傳說1.txt 全職高手(蝴蝶).txt a:0.635022 C:0.885465 j:0.384580

鬥羅大陸與全職高手為兩本不同小說,其字數都為500萬字左右,随着字數的上升所用到的詞語也基本相同,導緻餘弦相似度高達88.54%,但jaccard相似度對次數出現的頻率比較敏感,是以jaccard相似度隻為38.45%。其平均值為63.5是以可以判斷為兩本不同小說。

如果需要對幾萬本小說互相進行對比,按目前這個算法首先擷取所有小說的詞語頻率表儲存起來。這一階段需耗時95%以上的時間,然後再根據小說的大小進行排除,大小差距太大則跳過,然後進行相似度計算。