最近想要做一個查重程序,目的是檢測大學生提交的電子文檔的重復率。
最初的想法是是參考之王的論文查重,但是發現他有自己的弊端,也就是說知網論文查重的算法能對標准的論文進行有效的查重。但是對於學生提交的電子檔作業就不一定行了。
我們先來看一下知網論文查重原理:
1:知網論文查重由於是采用了最先進的模糊算法,如果整體結構和大綱被打亂,可能會引起同一處的文章檢測第一次和第二次標紅不一致或者第一次檢測沒有標紅的部分第二次檢測被標紅。因此在修改重復內容的時候盡量變換句式,不要打亂論文原來的整體大綱和結構。
2:整篇論文上傳后,系統會自動根據文章生成的目錄檢測該論文的章節信息,然后系統會將論文分章節檢測,可以獲得每一單章節的復制比同時目錄顯灰色不參與正文檢測;否則會自動分段按照1萬字符左右檢測,同時目錄有可能當成正文檢測,重復就會標紅。
post~~知網檢測目錄原理:
目錄一般放置在論文正文的前面,因而是論文的導讀圖。要使目錄真正起到導讀圖的作用,必須注意:
1. 有明顯的“目錄”標記,目錄兩個字獨占一行;
2. 目錄需用word自動生成,不要手工書寫;
3. 每個目錄需用有明顯的頁碼結尾,頁碼可以是阿拉伯數字或者是羅馬數字;
4. 圖目錄或者表目錄格式和正文目錄格式一樣;
5. 准確。目錄必須與全文的綱目相一致。也就是說,本文的標題、分標題與目錄存在着一一對應的關系。
6. 清楚無誤。目錄應逐一標注該行目錄在正文中的頁碼。標注頁碼必須清楚無誤。
7. 目錄既然是論文的導讀圖,因而必然要求具有完整性。也就是要求文章的各項內容,都應在目錄中反映出來,不得遺漏。
8. 知網目錄識別標准:
正確的按照知網識別標准自動生成的目錄如上圖所示,這樣的目錄用知網檢測系統生成的文本復制比報告單如下圖:
很明顯各個章節文本復制比一目了然,看起來更專業權威了。然而如果有絲毫的差錯,知網檢測系統都不會按照章節來進行檢測,他會自動分段檢測,一段大概1萬字左右。
3:中國知網對該套查重系統的靈敏度設置了一個閥值,該閥值為5%,以段落計,低於5%的抄襲或引用是檢測不出來的,這種情況常見於大段落中的小句或者小概念。舉個例子:假如檢測段落1有10000字,那么引用單篇文獻500字以下,是不會被檢測出來的。實際上這里也告訴同學們一個修改的方法,就是對段落抄襲千萬不要選一篇文章來引用,盡可能多的選擇多篇文獻,一篇截取幾句,這樣是不會被檢測出來的。
4:一篇論文的抄襲怎么才會被檢測出來?知網論文檢測的條件是連續13個字相似或抄襲都會被紅字標注,但是必須滿足3里面的前提條件:即你所引用或抄襲的A文獻文總字數和在你的各個檢測段落中要達到5%以上才能被檢測出來標紅。
5:知網檢測系統會自動識別參考文獻,參考文獻不參與正文檢測。並且進行剔除,在知網檢測報告中參考文獻顯示灰色字體,說明並沒有參與檢測。當然這是在參考文獻格式完全正確規范的情況下才會自動排除不會標紅。否則參考文獻會當成正文來進行檢測導致參考文獻全部標紅。結果增高!
post~~知網自動識別參考文獻原理:
6:知網論文查重為整篇上傳,PDF或者Word格式對檢測結果可能會造成影響。因為上傳PDF檢測,PDF會比Word多一個文本轉換的過程,這個過程有可能會將你原本正確的的目錄和參考文獻格式打亂,目錄和參考文獻等格式錯亂,就會導致系統識別不正確而被標紅。特別對於那些有英文目錄和大部分英文參考文獻的論文,其英文占字符數很高。英文被標紅就會導致總結果大大增高。
7:關於引用盡量引用整段話,如果引用單獨一句兩句,知網系統是根本識別不到具體你引用的是哪篇文章里面的句子。所以引用盡量大段引用。並且引用的內容必須完全一致。
如果你認真讀了以上內容應該就能感覺到,知網的論文查重算法就是針對標准論文來的,對於只想要做學生作業的查重是不合適的。
不過從另外一方面來講,知網的論文查重算法網上也沒有公開Demo,所及就選擇了另一種算法:SimHash算法
如果有興趣可以看看原論文:
https://www2007.cpsc.ucalgary.ca/papers/paper215.pdf
這是運行出來的效果:
I am very happy that day!產生的字符串是:1111001111110101001111111111010011000001001101011011010000000001
I am very happy the day!產生的字符串是:0111111111100101001111111100010011000011001110111011010010000001
海明距離是:11
下面來講解一下Simhash:
1:文本准備。
2:分詞(根據行業特定的需求可以為不同的詞定義不同的權值):
- 給定一段語句,進行分詞,得到有效的特征向量,可以自定義1-5等5個級別的權重(如果是給定一個文本,那么特征向量可以是文本中的詞,其權重可以是這個詞出現的次數)。例如給定一段語句:“CSDN博客結構之法算法之道的作者July”,分詞后為:“CSDN 博客 結構 之 法 算法 之 道 的 作者 July”,然后為每個特征向量賦予權值:CSDN(4) 博客(5) 結構(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括號里的數字代表這個單詞在整條語句中的重要程度,數字越大代表越重要。
3:對關鍵字進行hash形成簽名(向量),如 CSDN 的簽名是100101。
4:對向量加權:
- 在hash值的基礎上,給所有特征向量進行加權,即W = Hash * weight,且遇到1則hash值和權值正相乘,遇到0則hash值和權值負相乘。例如給“CSDN”的hash值“100101”加權得到:W(CSDN) = 100101_4 = 4 -4 -4 4 -4 4,給“博客”的hash值“101011”加權得到:W(博客)=101011_5 = 5 -5 5 -5 5 5,其余特征向量類似此般操作。
5:將各特征向量加權后的結果累加,得到一個向量。例如“CSDN”的“4 -4 -4 4 -4 4”和“博客”的“5 -5 5 -5 5 5”進行累加,得到“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,得到“9 -9 1 -1 1”。
6:對於n-bit簽名的累加結果,如果大於0則置1,否則置0,從而得到該語句的simhash值,最后我們便可以根據不同語句simhash的海明距離來判斷它們的相似度。例如把上面計算出來的“9 -9 1 -1 1 9”降維(某位大於0記為1,小於0記為0),得到的01串為:“1 0 1 0 1 1”,從而形成它們的simhash簽名。
應用:
每篇文檔得到SimHash簽名值后,接着計算兩個簽名的海明距離即可。根據經驗值,對64位的 SimHash值,海明距離在3以內的可認為相似度比較高。
- 海明距離的求法:異或時,只有在兩個比較的位不同時其結果是1 ,否則結果為0,兩個二進制“異或”后得到1的個數即為海明距離的大小。
舉個例子,上面我們計算到的“CSDN博客”的simhash簽名值為“1 0 1 0 1 1”,假定我們計算出另外一個短語的簽名值為“1 0 1 0 0 0”,那么根據異或規則,我們可以計算出這兩個簽名的海明距離為2,從而判定這兩個短語的相似度是比較高的。
換言之,現在問題轉換為:對於64位的SimHash值,我們只要找到海明距離在3以內的所有簽名,即可找出所有相似的短語。
但關鍵是,如何將其擴展到海量數據呢?譬如如何在海量的樣本庫中查詢與其海明距離在3以內的記錄呢?
- 一種方案是查找待查詢文本的64位simhash code的所有3位以內變化的組合
- 大約需要四萬多次的查詢。
- 另一種方案是預生成庫中所有樣本simhash code的3位變化以內的組合
- 大約需要占據4萬多倍的原始空間。
這兩種方案,要么時間復雜度高,要么空間復雜度復雜,能否有一種方案可以達到時空復雜度的絕佳平衡呢?答案是肯定的:
- 我們可以把 64 位的二進制simhash簽名均分成4塊,每塊16位。根據鴿巢原理(也稱抽屜原理),如果兩個簽名的海明距離在 3 以內,它們必有一塊完全相同。如下圖所示:
- 然后把分成的4 塊中的每一個塊分別作為前16位來進行查找,建倒排索引。
如此,如果樣本庫中存有2^34(差不多10億)的simhash簽名,則每個table返回2^(34-16)=262144個候選結果,大大減少了海明距離的計算成本。
- 假設數據是均勻分布,16位的數據,產生的像限為2^16個,則平均每個像限分布的文檔數則為2^34/2^16 = 2^(34-16)) ,四個塊返回的總結果數為 4* 262144 (大概 100 萬)。這樣,原本需要比較10億次,經過索引后,大概只需要處理100萬次。
周末會把Demo傳到GitHub上。
參考鏈接:
https://www.kancloud.cn/kancloud/the-art-of-programming/41614,by www.kancloud.cn
http://www.cnkis.net/html/1095371058.html ,http://www.cnkis.net/html/6389745413.html,http://www.cnkis.net/html/7096252235.html,by WWW.CNKIS.NET
https://www2007.cpsc.ucalgary.ca/papers/paper215.pdf by Gurmeet Singh Manku,Arvind Jain, Anish Das Sarma.