检测“相似”源代码的簇


10

假设我有400名学生(在一所大大学中)必须执行计算机科学项目,并且他们必须独自工作(没有一组学生)。一个项目的例子可以是“在fortran中实现快速傅立叶变换算法”(我知道,这听起来并不性感,但是这使我的问题更简单了)。我是纠正者,我想发送例程以检查是否有提议实施的学生群体“过于相似,无法真正独立编写”。

这是对集群的无监督搜索。我认为问题更多是关于使用哪些属性,而不是使用哪种聚类算法。我要做的第一件事是一个字母一个字母的直方图。理想情况下,由于作弊者比这更聪明,因此我最终将尝试选择较好的字母随机排列,以查看是否存在字母直方图(带有排列)的良好匹配。那些没有探究代码结构,只探究字母的边际分布的人……您有什么解决方案?是否有专门用于解决此问题的软件或软件包?(实际上,在过去,计算机科学老师声称他们拥有这种工具,但现在我怀疑他们的工具非常简单)

我猜软件开发的律师也有这类问题(不是有1000名学生,而是有2个大代码...这使事情变得更难了)?

Answers:


4

显而易见的预处理步骤是合并真正相同的文件。

之后,关键是规范化。在某个时候,学生将开始重构代码,重命名变量等。或改写评论。字母直方图受此影响太大(再加上它将捕获很多语言属性)。

一种常见的技术是使用特定于语言的解析器,并将源代码转换为抽象语法树。然后从中提取特征。并可能同时并行分析评论。

然后是基于行的“最长公共子序列”方法。如果您在单行上具有相当好的相似性,则可以搜索任何两个文件中最长的公共子序列。这还将产生许多匹配项。


只是想补充一点,使用后缀树或后缀数组可以有效地找到最长的公共子序列。
2012年

谢谢Anony,我真的很喜欢您的回答精神(并赞成)。这听起来像是真正的具有“数据转换”和寻找极端模式的高维统计信息。您要在那几棵树上放什么样的距离?
罗宾吉拉德

我不是AST表示相似性的专家。我相信从某种意义上说,“模拟”是一棵树是另一棵树的一种特殊子树。我想,要比较AST,您需要对齐它们并计算相对差异。也许不考虑分支的顺序,所以琐碎的代码重新排序不会改变结果。请注意,您可能会得到误报,因为只有n种有效解决问题的方法,而您得到误报的原因仅在于他们找到了正确的解决方案……
QUIT--Anony-Mousse

0

在反抄袭世界中,我之前遇到过“图同构”概念。也许您也可以看看。

LCS-最长公共子序列也是可能的。但是,尝试比较所有这些解决方案,看看什么是最好的:)


欢迎光临本站!您能否为上述工作提供一些参考,也许还会提供更多详细信息,以便读者更好地了解图形同构或LCS如何解决当前的问题?
chl 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.