成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用Python寫了個(gè)檢測(cè)文章抄襲,詳談去重算法原理

blair / 2440人閱讀

摘要:中文網(wǎng)頁(yè)的一大特點(diǎn)就是天下文章一大抄,各種博文新聞幾乎一字不改或稍作修改就被網(wǎng)站發(fā)表了。這個(gè)特點(diǎn),很適合這個(gè)百度算法。但是,實(shí)際中個(gè)別字的修改,會(huì)導(dǎo)致被轉(zhuǎn)載的最長(zhǎng)的那句話不一樣,從而其值也不一樣了,最終結(jié)果是,準(zhǔn)確率很高,召回率較低。

在互聯(lián)網(wǎng)出現(xiàn)之前,“抄”很不方便,一是“源”少,而是發(fā)布渠道少;而在互聯(lián)網(wǎng)出現(xiàn)之后,“抄”變得很簡(jiǎn)單,鋪天蓋地的“源”源源不斷,發(fā)布渠道也數(shù)不勝數(shù),博客論壇甚至是自建網(wǎng)站,而爬蟲還可以讓“抄”完全自動(dòng)化不費(fèi)勁。這就導(dǎo)致了互聯(lián)網(wǎng)上的“文章”重復(fù)性很高。這里的“文章”只新聞、博客等文字占據(jù)絕大部分內(nèi)容的網(wǎng)頁(yè)。

中文新聞網(wǎng)站的“轉(zhuǎn)載”(其實(shí)就是抄)現(xiàn)象非常嚴(yán)重,這種“轉(zhuǎn)載”幾乎是全文照抄,或改下標(biāo)題,或是改下編輯姓名,或是文字個(gè)別字修改。所以,對(duì)新聞網(wǎng)頁(yè)的去重很有必要。

一、去重算法原理

文章去重(或叫網(wǎng)頁(yè)去重)是根據(jù)文章(或網(wǎng)頁(yè))的文字內(nèi)容來判斷多個(gè)文章之間是否重復(fù)。這是爬蟲爬取大量的文本行網(wǎng)頁(yè)(新聞網(wǎng)頁(yè)、博客網(wǎng)頁(yè)等)后要進(jìn)行的非常重要的一項(xiàng)操作,也是搜索引擎非常關(guān)心的一個(gè)問題。搜索引擎中抓取的網(wǎng)頁(yè)是海量的,海量文本的去重算法也出現(xiàn)了很多,比如minihash, simhash等等。

在工程實(shí)踐中,對(duì)simhash使用了很長(zhǎng)一段時(shí)間,有些缺點(diǎn),一是算法比較復(fù)雜、效率較差;二是準(zhǔn)確率一般。

網(wǎng)上也流傳著百度采用的一種方法,用文章最長(zhǎng)句子的hash值作為文章的標(biāo)識(shí),hash相同的文章(網(wǎng)頁(yè))就認(rèn)為其內(nèi)容一樣,是重復(fù)的文章(網(wǎng)頁(yè))。

這個(gè)所謂的“百度算法”對(duì)工程很友好,但是實(shí)際中還是會(huì)有很多問題。中文網(wǎng)頁(yè)的一大特點(diǎn)就是“天下文章一大抄”,各種博文、新聞幾乎一字不改或稍作修改就被網(wǎng)站發(fā)表了。這個(gè)特點(diǎn),很適合這個(gè)“百度算法”。但是,實(shí)際中個(gè)別字的修改,會(huì)導(dǎo)致被轉(zhuǎn)載的最長(zhǎng)的那句話不一樣,從而其hash值也不一樣了,最終結(jié)果是,準(zhǔn)確率很高,召回率較低。

為了解決這個(gè)問題,我提出了nshash(top-n longest sentences hash)算法,即:取文章的最長(zhǎng)n句話(實(shí)踐下來,n=5效果不錯(cuò))分別做hash值,這n個(gè)hash值作為文章的指紋,就像是人的5個(gè)手指的指紋,每個(gè)指紋都可以唯一確認(rèn)文章的唯一性。這是對(duì)“百度算法”的延伸,準(zhǔn)確率還是很高,但是召回率大大提高,原先一個(gè)指紋來確定,現(xiàn)在有n個(gè)指紋來招回了。

二、算法實(shí)現(xiàn)

該算法的原理簡(jiǎn)單,實(shí)現(xiàn)起來也不難。比較復(fù)雜一點(diǎn)的是對(duì)于一篇文章(網(wǎng)頁(yè))返回一個(gè)similar_id,只要該ID相同則文章相似,通過groupby similar_id即可達(dá)到去重目的。

為了記錄文章指紋和similar_id的關(guān)系,我們需要一個(gè)key-value數(shù)據(jù)庫(kù),本算法實(shí)現(xiàn)了內(nèi)存和硬盤兩種key-value數(shù)據(jù)庫(kù)類來記錄這種關(guān)系:

HashDBLeveldb 類:基于leveldb實(shí)現(xiàn), 可用于海量文本的去重;

HashDBMemory 類:基于Python的dict實(shí)現(xiàn),可用于中等數(shù)量(只要Python的dict不報(bào)內(nèi)存錯(cuò)誤)的文本去重。

這兩個(gè)類都具有g(shù)et()和put()兩個(gè)方法,如果你想用Redis或MySQL等其它數(shù)據(jù)庫(kù)來實(shí)現(xiàn)HashDB,可以參照這兩個(gè)類的實(shí)現(xiàn)進(jìn)行實(shí)現(xiàn)。

HashDBLeveldb類的實(shí)現(xiàn)

HashDBMemory類的實(shí)現(xiàn)

從效率上看,肯定是HashDBMemory速度更快。利用nshash對(duì)17400篇新聞網(wǎng)頁(yè)內(nèi)容的測(cè)試結(jié)果如下:

HashDBLeveldb: 耗時(shí)2.47秒;

HashDBMemory: 耗時(shí)1.6秒;

具體測(cè)試代碼請(qǐng)看 example/test.py。

有了這兩個(gè)類,就可以實(shí)現(xiàn)nshash的核心算法了。

首先,對(duì)文本進(jìn)行分句,以句號(hào)、感嘆號(hào)、問號(hào)、換行符作為句子的結(jié)尾標(biāo)識(shí),一個(gè)正在表達(dá)式就可以分好句了。

其次,挑選最長(zhǎng)的n句話,分別進(jìn)行hash計(jì)算。hash函數(shù)可以用Python自帶模塊hashlib中的md5, sha等等,也可以用我在爬蟲教程中多次提到的farmhash。

最后,我們需要根據(jù)這n個(gè)hash值給文本內(nèi)容一個(gè)similar_id,通過上面兩種HashDB的類的任意一種都可以比較容易實(shí)現(xiàn)。其原理就是,similar_id從0開始,從HashDB中查找這n個(gè)hash值是否有對(duì)應(yīng)的similar_id,如果有就返回這個(gè)對(duì)應(yīng)的similar_id;如果沒有,就讓當(dāng)前similar_id加1作為這n個(gè)hash值對(duì)應(yīng)的similar_id,將這種對(duì)應(yīng)關(guān)系存入HashDB,并返回該similar_id即可。

這個(gè)算法實(shí)現(xiàn)為NSHash類:

NSHash類的實(shí)現(xiàn)

三、使用方法
import nshash

nsh = nshash.NSHash(name="test", hashfunc="farmhash", hashdb="memory")

similar_id = nsh.get_similar(doc_text)

NSHash類有三個(gè)參數(shù):

name: 用于hashdb保存到硬盤的文件名,如果hashdb是HashDBMemory, 則用pickle序列化到硬盤;如果是HashDBLeveldb,則leveldb目錄名為:name+’.hashdb’。name按需隨便起即可。

hashfunc: 計(jì)算hash值的具體函數(shù)類別,目前實(shí)現(xiàn)兩種類型:md5farmhash。默認(rèn)是md5,方便Windows上安裝farmhash不方便。

hashdb:默認(rèn)是memory即選擇HashDBMemory,否則是HashDBLeveldb。

至于如何利用similar_id進(jìn)行海量文本的去重,這要結(jié)合你如何存儲(chǔ)、索引這些海量文本。可參考example/test.py文件。這個(gè)test是對(duì)excel中保存的新聞網(wǎng)頁(yè)進(jìn)行去重的例子。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43999.html

相關(guān)文章

  • 咋做長(zhǎng)文本去重

    摘要:新問題拋出有沒有一種簽名算法,如果文本非常相似,簽名值也非常相似呢二文本相似性的簽名算法上文提出的問題,可以用局部敏感哈希解決,局部敏感哈希是一類文本越相似,哈希值越相似的算法,有興趣的同學(xué)自行百度,這里分享一下的思路。 緣起:(1)原創(chuàng)不易,互聯(lián)網(wǎng)抄襲成風(fēng),很多原創(chuàng)內(nèi)容在網(wǎng)上被抄來抄去,改來改去(2)百度的網(wǎng)頁(yè)庫(kù)非常大,爬蟲如何判斷一個(gè)新網(wǎng)頁(yè)是否與網(wǎng)頁(yè)庫(kù)中已有的網(wǎng)頁(yè)重復(fù)呢?這是本文要...

    coordinate35 評(píng)論0 收藏0
  • JavaScript專題系列文章

    摘要:專題系列共計(jì)篇,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫一個(gè)函數(shù),輸入,返回。 JavaScript 專題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個(gè) jQuery 的 ext...

    Maxiye 評(píng)論0 收藏0
  • 《網(wǎng)絡(luò)黑白》一書所抄襲文章列表

    摘要:網(wǎng)絡(luò)黑白一書所抄襲的文章列表這本書實(shí)在是垃圾,一是因?yàn)樗幕ヂ?lián)網(wǎng)上的文章拼湊而成的,二是因?yàn)槠礈愃教睿B表述都一模一樣,還抄得前言不搭后語,三是因?yàn)閮?nèi)容全都是大量的科普,不涉及技術(shù)也沒有干貨。 《網(wǎng)絡(luò)黑白》一書所抄襲的文章列表 這本書實(shí)在是垃圾,一是因?yàn)樗幕ヂ?lián)網(wǎng)上的文章拼湊而成的,二是因?yàn)槠礈愃教?,連表述都一模一樣,還抄得前言不搭后語,三是因?yàn)閮?nèi)容全都是大量的科普,不涉及技術(shù)...

    zlyBear 評(píng)論0 收藏0
  • JPlag在一組程序中尋找抄襲行為(翻譯)

    摘要:它在實(shí)踐中被成功地用于檢測(cè)學(xué)生程序提交中的剽竊行為。這項(xiàng)措施應(yīng)該反映原始程序中由比賽覆蓋的部分代幣。這個(gè)程序集根本不包含任何剽竊行為,因此將其命名為。在節(jié)目集中有個(gè)抄襲對(duì)。 摘要:JPlag是一個(gè)Web服務(wù),可以在給定的集合中找到類似的程序?qū)Φ某绦颉K趯?shí)踐中被成功地用于檢測(cè)學(xué)生Java程序提交中的剽竊行為。能支持的語言除了java之外,還有C、C++和Scheme。我們描述Jpalg...

    Jacendfeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<