我正在构建一个网络工具来检查提交的内容是来自网络还是提交者自己的工作。抄袭检测器。
我有一些想法,我可以生成校验和并将其用作与其他条目进行比较的关键。但是,如果有人进行了一些小的更改,例如包含/删除注释、更改变量/函数名称等,那么校验和将会不同,因此这种方法将不起作用。
有什么更好的方法建议吗?
我正在构建一个网络工具来检查提交的内容是来自网络还是提交者自己的工作。抄袭检测器。
我有一些想法,我可以生成校验和并将其用作与其他条目进行比较的关键。但是,如果有人进行了一些小的更改,例如包含/删除注释、更改变量/函数名称等,那么校验和将会不同,因此这种方法将不起作用。
有什么更好的方法建议吗?
抄袭检测是相似性检测的一种特殊情况。这是一个与计算机科学本身一样古老的研究领域。有很多已发表的研究,但没有一个简单的答案。
例如,参见Google Scholar 搜索“代码相似性剽窃”或“剽窃检测”。定期谷歌搜索“源代码相似性检测算法”之类的东西也很有用。
该领域也有很多现有的工具,所以我很惊讶您正在尝试编写自己的工具。
正如您所指出的,除非代码完全相同,否则校验和将无法完成这项工作。可以提供帮助的技术包括:
构建词频直方图并进行比较
提取评论文本并使用文本子字符串匹配查找复制的评论
提取变量、类和方法名称并查找使用相同名称的其他代码。您必须对每个人都会选择的“明显”名称以及由问题决定的名称进行大量更正,例如实现特定的接口或 API。私有类成员变量和函数或方法中的局部变量是最有用的比较。您将需要编译器或至少语法解析器的帮助来提取这些语言。
寻找缩进风格的差异。除了使用制表符缩进的这一功能外,用户是否使用了所有空格缩进?
比较解析树或标记流以去除格式化的影响。您通常必须比较单个函数等,而不仅仅是整个代码。
......还有更多
您需要做的是生成一份报告,权衡所有这些因素和其他因素,并将它们呈现给人类,以便人类做出决定。您的工具应该解释为什么它认为两个结果相似,而不仅仅是它们相似。
我将如何解决这个问题,最近可以添加自定义增强功能:
删除所有不是字母或数字的内容;
使用explode()
空格字符作为分隔符并查找所有单词;现在你知道你在那篇文章中有多少字了;
现在,您必须找出该词在该文章中出现的次数,并在每次在文本中找到该词时增加词指示器;
将其存储到数组中,例如:
$words['wordX']++;
对您要查看的第二篇文章也执行此操作;
现在,比较它们;你知道原始数据;在这一步可以得出一些结论;
使用约翰的J、Feudalism的F等大字,也可以得出一些结论;
从这里你可能会知道这篇文章是否是关于同一件事的,这可能是真正的步骤#1
现在,您必须以某种方式同时逐字解析两篇文章,并查看它们之间的差异。
学生可以在原始文章中找到的每个句子/段落之后添加自己的“原始”句子。
确保如果您在其中一篇文章的解析过程中取得了很大进展,您会以某种方式保持平衡的解析过程并尝试解析第二篇文章,直到达到该平衡。
我看到 2for
条指令,可能是 3 条,或者不是 3 条,而是一个试图在解析过程中保持平衡的函数。
Also, you have to use explode()
and check sentence by sentence, and word by word from each sentence and find the similarity.
I am sure that you get the idea, but i say again, you cant parse the entire WWW.