之前寫了爬蟲爬取小說,總檔案大概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%以上的時間,然後再根據小說的大小進行排除,大小差距太大則跳過,然後進行相似度計算。