我正在构建一个Web工具来检查提交的内容是从Web获取还是提交者自己的工作。抄袭探测器。
我知道我可以生成校验和并将其用作与其他条目进行比较的键。但是,如果有人做了一些小改动,比如包括/删除注释,更改变量/函数名等等,那么校验和将会有所不同,所以这种方法不起作用。
有关更好方法的任何建议吗?
答案 0 :(得分:8)
Plagiarism detection是相似性检测的特例。这是一个很大的研究领域,几乎和计算机科学一样古老。已发表研究的很多,并没有一个简单的答案。
请参阅,例如a Google Scholar search for "code similarity plagiarism"或"plagiarism detection"。定期Google搜索"source code similarity detection algorithm"之类的内容也很有用。
这个空间里还有很多existing tools,所以我很惊讶你是想写自己的。{/ p>
正如您所指出的,除非代码完全相同,否则校验和将无法完成工作。可以提供帮助的技术包括:
构建字频直方图并进行比较
使用text-substring matching
提取变量,类和方法名称并查找使用相同名称的其他代码。您必须对每个人都会选择的“明显”名称以及由问题决定的名称(如实现特定接口或API)进行大量更正。私有类成员变量和函数或方法中的局部变量是最有用的比较。您将需要编译器的帮助或至少语言的语法分析器来提取这些。
寻找缩进风格的差异。用户是否使用了全空格缩进,除了这一个用标签缩进的函数?
比较解析树或令牌流以消除格式化的影响。您通常需要比较各个函数等,而不仅仅是代码作为一个整体。
......还有更多
你需要做的是制作一份报告,权衡所有这些因素和其他因素,并将它们呈现给人类,以便人类做出决定。您的工具应该解释为什么它认为两个结果相似,而不仅仅是它们相似。
答案 1 :(得分:0)
我如何理解这一点,最近可以添加自定义增强功能:
删除所有非字母或数字的内容;
使用带有空格字符的explode()
作为分隔符并查找所有单词;现在你知道那篇文章中有多少单词;
现在,你必须找出该文章中出现的单词的次数,并在每次在文本中找到该单词时增加单词指示符;
将其存储到数组中,例如:
$words['wordX']++;
请同时使用您要查看的第二篇文章;
现在,比较一下;你知道原始数据;在这一步可以得出一些结论;
使用像约翰的J这样的大字,来自封建主义的F,你也可以得出一些结论;
从这里你可能知道文章是否是同一件事,这可能是真正的一步#1
现在,不知何故,你必须在同一时间逐字逐句地解析这两篇文章,并看到它们之间的差异。
学生可以在原始文章中找到的每个句子/段落后添加自己的“原始”句子。
确保如果你在其中一篇文章的解析过程中取得很大进展,你就会以某种方式保持平衡的解析过程并尝试解析第二篇文章,直到达到平衡。
我看到2个for
指令,可能是3个,或者是3个,这个函数试图在解析过程中保持平衡。
此外,您必须使用explode()
并逐句检查,并逐句逐句查找相似度。
我相信你明白了,但我再说一遍,你无法解析整个WWW。