在源代码的情况下如何计算文档相似度?

数据挖掘 机器学习 nlp 文本挖掘 类似文件
2021-10-08 23:40:45

我尝试检测不同类型源代码文本(网页、程序代码)的共同作者身份(个人、公司)的概率。我的第一个想法是应用通常的 NLP 工具,如任何基于令牌的文档表示(TF-IDF 或嵌入)并在这些工具上计算相似性,但不知何故,我发现这种方法有点笨拙。我想检测似乎超出此方法范围的“手印”(特征注释和缩写样式、文件夹结构、使用的第 3 方工具、代码中元素的顺序等)。

此外,我在这里找不到任何合适的机器学习的地方。显然,为任何未来的量化特征找到权重会很好,但是这个相似性任务不是分类/回归,那么如何定义目标呢?聚类似乎是一种更好的工具,但我们无法定义与潜在作者一样多的类别。

您能否建议任何更可靠的方法?有没有关于这个主题的文献?

1个回答

为什么不使用所有非代码指示符作为“手印”?例如,许多 IDE 在启动时会在文档中添加特定的注释。此外,这很容易检测到我的工作,我倾向于在 python 中将整个导入块从一个脚本复制到另一个脚本,无论我是否真的需要所有导入。如果有人使用复制的 import 或 include 语句,那么他们的导入将全部按照相同的顺序。如果您跟踪导入的顺序,您可能能够找到模式。

还有一些问题是您是否使用空格或制表符进行缩进,空格或制表符的首选数量等。对于带有大括号的语言,您可以查看是否在 if 语句之后使用大括号,或者在下一行的开头。我相信这会给你足够的“手印”来清楚地识别人。

完成此操作后,您可以使用多级集群尝试首先将文档分配给一组可能的创建者(即所有使用某个 IDE 或文本编辑器的创建者)。然后,您可以遍历并在每个组中寻找某些模式,在每个集群中再次聚类。