簡體   English   中英

您將如何編寫反抄襲網站?

[英]How would you code an anti plagiarism site?

首先,請注意,我對這樣的事情如何工作感興趣,並且不打算為客戶端等構建它,因為我確信可能已經有開源實現。

檢測上傳文本中的抄襲的算法如何工作? 它是否使用正則表達式將所有單詞發送到索引,去掉諸如“the”、“a”等已知單詞,然后查看不同文章中有多少單詞相同? 他們是否有神奇數量的相同單詞將其標記為可能的重復? 它是否使用levenshtein()

我選擇的語言是 PHP。

更新

我正在考慮不在全球范圍內檢查抄襲,而是在一個班級上傳的 30 篇文章中說更多。 如果學生們在嚴格的一人作業上聚在一起。

這是一個聲稱這樣做的在線網站: http : //www.plagiarism.org/

良好的抄襲檢測將根據文檔類型(例如特定語言的文章或程序代碼)應用啟發式方法。

但是,您也可以應用通用解決方案。 查看歸一化壓縮距離(NCD)。 顯然,您無法准確計算文本的Kolmogorov 復雜度,但您可以通過簡單地壓縮文本來處理它。

較小的 NCD 表示兩個文本更相似。 一些壓縮算法會給出比其他算法更好的結果。 幸運的是,PHP 支持多種壓縮算法,因此您可以立即運行 NCD 驅動的抄襲檢測代碼。 下面我將給出使用Zlib 的示例代碼:

PHP:

function ncd($x, $y) { 
  $cx = strlen(gzcompress($x));
  $cy = strlen(gzcompress($y));
  return (strlen(gzcompress($x . $y)) - min($cx, $cy)) / max($cx, $cy);
}   

print(ncd('this is a test', 'this was a test'));
print(ncd('this is a test', 'this text is completely different'));

Python:

>>> from zlib import compress as c
>>> def ncd(x, y): 
...     cx, cy = len(c(x)), len(c(y))
...     return (len(c(x + y)) - min(cx, cy)) / max(cx, cy) 
... 
>>> ncd('this is a test', 'this was a test')
0.30434782608695654
>>> ncd('this is a test', 'this text is completely different')
0.74358974358974361

請注意,對於較大的文本(閱讀:實際文件),結果會更加明顯。 試一試並報告您的經驗!

我認為這個問題很復雜,沒有一個最好的解決方案。 您可以在整個文檔級別(即某人從網絡下載整篇文章)一直到短語級別檢測單詞的精確重復。 在文檔級別執行此操作非常簡單 - 最簡單的解決方案是獲取提交的每個文檔的校驗和,並將其與已知文檔的校驗和列表進行比較。 之后你可以嘗試檢測抄襲,或者找到直接復制然后稍微改變的句子,以擺脫這樣的軟件。

要獲得在短語級別有效的內容,如果想要任何級別的效率,您可能需要變得更加復雜。 例如,您可以尋找段落之間寫作風格的差異,並將注意力集中在與論文的其余部分相比感覺“不合適”的段落上。

有很多關於這個主題的論文,所以我懷疑還沒有一個完美的解決方案。 例如,這兩篇論文介紹了此類軟件的一些一般問題,並提供了大量參考資料,您可以根據需要深入研究。

http://ir.shef.ac.uk/cloughie/papers/pas_plagiarism.pdf

http://proceedings.informingscience.org/InSITE2007/IISITv4p601-614Dreh383.pdf

好吧,您首先必須了解您要面對的是什么。

逐字抄襲應該很容易被發現。 最簡單的方法是獲取足夠長的詞元組並將它們與您的語料庫進行比較。 足夠的長度可以非常低。 比較谷歌結果:

"I think" => 454,000,000
"I think this" => 329,000,000
"I think this is" => 227,000,000
"I think this is plagiarism" => 5

因此,即使采用這種方法,您也有很高的機會找到一兩個好的匹配項(有趣的事實:大多數罪犯真的很愚蠢)。

如果抄襲者使用同義詞,改變詞序等等,顯然會變得更困難一些。 您還必須存儲同義詞,並嘗試稍微規范化語法結構以保持相同的方法有效。 當然,拼寫也是如此(即嘗試通過標准化進行匹配或嘗試考慮匹配中的偏差,就像在其他答案中發布的 NCD 方法中一樣)。

然而,最大的問題是概念上的抄襲。 這真的很難,如果不解析每個句子的語義(即足夠復雜的人工智能),就沒有明顯的解決方案。

然而,事實是,您只需要找到某種匹配即可。 您無需查找完全匹配即可在您的語料庫中找到相關文本。 無論如何,最終的評估應該始終由人類進行,因此如果您發現不完全匹配也沒關系。

抄襲者大多是愚蠢和懶惰的,所以他們的副本也會愚蠢和懶惰。 有些人在他們的作品中付出了難以置信的努力,但這些作品通常首先是不明顯的抄襲,因此很難以編程方式進行追蹤(即,如果一個人在兩種文本並排呈現的情況下難以識別抄襲,計算機很可能也會)。 對於所有其他 80% 左右的情況,愚蠢的方法就足夠了。

這真的取決於“從哪里抄襲”。 如果您是在單個站點的上下文中進行討論,那么這與整個網絡、會議圖書館或...

http://www.copyscape.com/幾乎證明這是可以做到的。

基本概念似乎是

  • 用谷歌搜索一些不常見的單詞序列
  • 對每一個結果,做詳細的分析

詳細分析部分當然可以類似,因為它是1對1的比較,但定位和獲取源文檔是關鍵因素。

(這是一個 Wiki!請在此處編輯並進行更正或增強)

為了在不太大的字符串上獲得更好的結果:

在字符串或小文本上直接使用 NCD 公式存在問題。 NCD(X,X) 不為零 (!)。 要刪除此工件,請減去自我比較。

請參閱http://leis.saocarlos.sp.gov.br/SIMILAR.php 上的similar_NCD_gzip() 演示

function similar_NCD_gzip($sx, $sy, $prec=0, $MAXLEN=90000) {
# NCD with gzip artifact correctoin and percentual return.
# sx,sy = strings to compare. 
# Use $prec=-1 for result range [0-1], $pres=0 for percentual,
#     $pres=1 or =2,3... for better precision (not a reliable)  
# Use MAXLEN=-1 or a aprox. compress lenght. 
# For NCD definition see http://arxiv.org/abs/0809.2553
# (c) Krauss (2010).
  $x = $min = strlen(gzcompress($sx));
  $y = $max = strlen(gzcompress($sy));
  $xy= strlen(gzcompress($sx.$sy));
  $a = $sx;
  if ($x>$y) { # swap min/max
    $min = $y;
    $max = $x;
    $a = $sy;
  }
  $res = ($xy-$min)/$max; # NCD definition.
  
  # Optional correction (for little strings):
  if ($MAXLEN<0 || $xy<$MAXLEN) {
    $aa= strlen(gzcompress($a.$a));
    $ref = ($aa-$min)/$min;
    $res = $res - $ref; # correction
  }
  return ($prec<0)? $res: 100*round($res,2+$prec);
}

這在Plagiarism Remover上效果很好,需要幫助來制作這樣的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM