Re: [問卦] 有沒有程式設計課抓作業抄襲的八卦?消失

看板Gossiping作者時間8年前 (2016/10/12 08:33), 編輯推噓6(605)
留言11則, 7人參與, 最新討論串3/3 (看更多)
※ 引述《snaketsai (さいでんし)》之銘言: : 先說,小弟不是這塊專門, : 純粹今天參加研討會回到旅館、腦袋很累但又睡不著 : 湊巧看到這篇文章 : 隨便看看文件(只快速看了15 min)隨便講而已 : 所以一定有講錯,但也還請板上神人能夠幫忙簡介XD : (表示想聽別人消化完的版本QQ) : 某些大學的數位教學平台(e.g. Moodle) : 助教的系統那邊可能會串一些抄襲偵測的服務 : 直接 n取2 抓起來比對 : 其中學術用免錢的後端,以Stanford的MOSS(Measure Of Software Similarity) : 系統最為常見 : 而它背後理論基礎的論文是這篇: : 《Winnowing: Local Algorithms for Document Fingerprinting》 : 從標題便可發現其實它的本質應該還是文本分析,而非真正去理解程式結構 : 那篇論文的重點就在針對局部文本比對加上winnowing : 首先是一般的Karp-Rabin字串比對, : 這演算法提出兩個常數來規範它的偵測敏感度: : (1)小於K長度字串的重複不計。 : 白話文來說就是: : 假如一直抓「的」這個字,是沒有意義的,因為文章中這字出現頻率超高 : (2)長度大於T的字串重複視為抄襲的保證下限。 : 白話文就是: : 一大段字完全一模一樣,你說這不是抄襲騙誰啊? : 很直觀地,T一定要大於或等於K : 現在假定一個抄超長句子,以K為單位做K-gram後、取雜湊的雜湊值的序列為: : h1 h2 h3 h4 ... hn : 且n比(t-k)大 : 這篇論文的作者覺得必定存在一段子句(先稱作hi)是足夠代表整個句子 : 亦即不論你從h1~hn中怎麼圈選子句子來聲稱: : 「因為A文件中的一個句子S1的子句S1' : 符合B文件中的另一個句子S2的子句S2' : 所以我們認為S1跟S2是同一句話」 : 那S1'跟S2'一定包含hi這段指紋子句 : 現在再提出一個常數W為T-K+1,代表雜湊值的比對窗口大小 : 以W為窗口,每次位移一格取出雜湊值k-gram : 接下來就是它的重點Winnowing了: : 第一次取第一個窗口中最小的雜湊值,放進指紋名單、並且當作 目前指紋。 : 接下來第二個窗口中一樣取最小,跟上一次的 目前指紋 比較; : 一樣的話:若在該窗口最右邊還是取,若不是在最右邊則拋棄, : 不一樣的直接放進指紋名單、變成新的目前指紋。 : (原文看沒有很懂,我是看別人的實做跟論文例子推想) : 有了指紋名單,接下來就是從另外一個文件中取出指紋子句了 : 如果兩邊重複越多,那自然合理判斷為越像 : 至於怎麼斷句,切成不同的部份,在這篇論文又是另外一個主題 : = = = = : 以論文中的舉例來跑一次,今天有一個句子被餵進演算法裡面—— : A do run run, a do run run. : 會先被去掉不影響分析的不相關特徵,e.g. 標點符號、大小寫差異— — : adorunrunadorunrun : 接下來設K為5,做出5-gram (亦即5個為一單位,每次往後一格取完所有子字串) : adoru dorun orunr runru unrun nrunr runru : unrun nruna runad unado nador adoru dorun : orunr runru unrun : 假定對每單位取完雜湊長這樣: : 77 74 42 17 98 50 17 98 8 88 67 39 77 74 42 : 17 98 : 設T為8,那窗口W按上述說明為4,將雜湊取4-gram : 並且做Winnowing,被選出來的我用紅色標注 : (77, 74, 42, 17) (74, 42, 17, 98) : (42, 17, 98, 50) (17, 98, 50, 17) : (98, 50, 17, 98) (50, 17, 98, 8) : (17, 98, 8, 88) (98, 8, 88, 67) : ( 8, 88, 67, 39) (88, 67, 39, 77) : (67, 39, 77, 74) (39, 77, 74, 42) : (77, 74, 42, 17) (74, 42, 17, 98) : 所以我們得到了特徵值名單: : 17, 17, 8, 39, 17 : 接下來......接下來就是怎麼從另一份文件選出子句來; : 跑同樣流程然後比對有沒有相同指紋的事情了(逃) : 坦白說我是覺得還滿意外MOSS的基礎是這樣有點純文本分析味道的產物 : 一直以來我都以為他可能會把兩份程式各長出一顆AST、然後比樹的相似度之類的 : 這種作法在資料流分析也不算少見、對程式碼混淆的抵抗力也很高 : 不過缺點就是出題太簡單的話,不是抄襲也會長太像被誤判 : 當然,就如我文章開頭所述,我是在腦袋很亂睡不著時亂看的 : 很可能一覺醒來發現我根本搞錯這篇paper想幹麻 : 而我也相信板上神人這麼多,一定有人看過MOSS的原理 : 還請看到的您不吝分享 <(_ _)> : 真的該洗洗睡了Orz 不太清楚 MOSS 的原理 這樣還是文字比對吧 ? 一般人抄作業 不都是變數名稱改一下 用 search and replace all 來替換嗎? 這樣還抓得到嗎? 要抓程式抄襲 應該是要寫 front end parser 吧? 先把程式轉成 CFG (context free grammar) 再轉成語法樹 syntax tree 用樹狀比對 抓相似的節點吧? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.224.54.156 ※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1476232423.A.D9F.html

10/12 08:47, , 1F
對某些程式文盲而言 改個變數名稱可能都辦不到吧
10/12 08:47, 1F

10/12 09:15, , 2F
一樓好中肯wwwwww
10/12 09:15, 2F

10/12 09:18, , 3F
一樓害我笑惹
10/12 09:18, 3F

10/12 09:30, , 4F
我覺得比對目的檔可能簡單一點
10/12 09:30, 4F

10/12 10:14, , 5F
用 DiffNow 比對兩分 code
10/12 10:14, 5F

10/14 18:43, , 6F
1F XDDDDD
10/14 18:43, 6F

10/22 05:36, , 7F
吃進來前做variable mangling就解掉了
10/22 05:36, 7F

10/22 05:37, , 8F
雖然我個人也覺得MOSS真正線上給人用的應該沒有論文那
10/22 05:37, 8F

10/22 05:37, , 9F
麼單純
10/22 05:37, 9F

10/22 05:38, , 10F
轉AST我後面就提了,實務上一些抓repackaging app的方
10/22 05:38, 10F

10/22 05:38, , 11F
式就是這樣幹(不過他是Data-Flow tree)
10/22 05:38, 11F
文章代碼(AID): #1N_OJdsV (Gossiping)
討論串 (同標題文章)
文章代碼(AID): #1N_OJdsV (Gossiping)