簡體   English   中英

如何測量兩個python代碼塊之間的相似性?

[英]How to measure similarity between two python code blocks?

許多人想衡量代碼相似性以發現抄襲,但是我的目的是將一組python代碼塊(例如,對同一編程問題的答案)聚集到不同的類別中,並區分學生采用的不同方法。

如果您有任何想法可以實現,請在此處分享。

一種方法是然后計算可能分組為諸如分支,創建,操作等類別的函數,對象,關鍵字的數量以及每種類型的數量變量。 無需依賴被稱為相同名稱的方法和變量。

對於給定的問題,類似的方法往往會得出類似的分數,例如:使用決策樹的學生將有大量分支語句,而使用決策表的學生將具有低得多的分支語句。

這種方法比解析代碼結構和比較結果要快得多。

您可以選擇任何您喜歡的實質上對代碼塊的內容進行哈希處理的方案,並將具有相同哈希值的代碼塊放入同一類別。

當然,最終的相似之處將高度取決於您定義哈希函數的方式。 例如,一個真正愚蠢的哈希函數H(code)== 0會將所有內容放入同一個bin中。

一個困難的問題是找到一種散列函數,該散列函數以一種看起來與自然相似的方式對代碼塊進行分類。 經過大量的研究,沒有人能找到比我看到它們相似時更好的判斷方法。

您當然不希望它依賴於布局/縮進/空格/注釋,否則,即使它們的語義內容相同,對它們的細微更改也會對塊進行不同的分類。

人們通常使用三種主要方案來查找重復的(或類似的)代碼:

  • 基於指標的方案,該方案通過計算指標來計算各種類型的運算符和操作數,從而計算哈希值。 (注意:這使用詞法標記)。 這些通常僅在功能級別上運行。 我不知道基於此的實用工具。

  • 基於詞法的方案將輸入流分解為詞素,將標識符和文字轉換為固定的特殊常量(例如,將它們視為未區分的),然后在這些序列上基本上對N-gram(N個令牌的序列)進行哈希處理。 本質上,有許多基於此思想的克隆檢測器。 它們可以很好地工作,但是也可以找到愚蠢的匹配項,因為沒有什么強制與程序結構邊界對齊。 序列

      return ID; } void ID ( int ID ) { 

是11克,經常在類似C的語言中出現,但顯然不是有用的克隆)。 結果是容易出現誤報,例如,您在沒有一個的情況下得到了匹配。

  • 基於抽象語法樹的匹配(散列在子樹上),該匹配通過使用直接表示語言結構的AST自動將克隆與語言邊界對齊。 (我是該論文的原始作者,並根據這個想法構建了一個商業產品CloneDR,請參見我的簡歷)。 這些工具的優勢在於,它們可以在匹配中間匹配包含不同長度的標記序列的代碼,例如,一個(任意大小的)語句被另一條語句替換。

本文提供了各種技術的概述: http : //www.cs.usask.ca/~croy/papers/2009/RCK_SCP_Clones.pdf 它表明,基於AST的克隆檢測工具似乎最有效地產生了人們一致認為類似的代碼塊的克隆,這似乎是OP特殊興趣的關鍵。 參見表14。

[有一些基於圖的方案可以匹配控制圖和數據流圖。 可以說,他們應該產生更好的比賽,但實際上在實踐中並沒有做得更好。]

暫無
暫無

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

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