首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动代码检查

自动代码检查
EN

Data Science用户
提问于 2018-04-27 11:16:24
回答 2查看 172关注 0票数 4

我有一些机器学习的经验,主要是聚类和分类器。然而,当涉及到NLP时,我有点像个新手。

尽管如此,我意识到处理自然语言所涉及的各种问题和困难,例如词性、歧义、否定检测等。我也知道某些表示文本的模型,如单词袋和字向量表示。

虽然我的具体问题是文本问题,但在我看来,这并不是一个自然的语言问题。相反,我需要比较1000 s的编程代码文件,以确定它们之间有多相似。

不像自然语言处理,我们删除停止词,我们非常关心的问题,如歧义和否定的范围等,在编程代码没有歧义,至少没有保留关键字,如“函数”,“如果”,“其他”,同时,“结束”,也没有任何歧义与核心数学函数和其他运算符,如“日志”,“罪恶”,“坦赫”等。

对于我的问题,我们可以假设所有文件都使用相同的编程语言(比如R),并且假设每个编程文件最多包含250行代码。

最初的目标是生成一个相关矩阵,以显示代码文件之间的相似性。

在我看来,有两种方法可以解决这个问题:

  1. 既快又简单。我建议从每个文本文件中删除:
    • 所有评论,因为我对每个开发人员的个人评论不感兴趣
    • 所有多余的空白(删除所有格式,确保保留的单词和代码块之间只有一个空格)

这是我在一个简单的解决方案中所做的唯一的预处理。然后,我建议使用Doc2Vec模型将每个文件简化为单个向量,然后通过计算相关系数来比较不同的向量。对于人们来说,这对于一个非常快速和简单化的解决方案来说是否合理?如果没有,请建议您将做哪些其他预处理和/或您将使用什么模型来表示文件。

  1. 更先进。这个简单的解决方案的一个直接缺陷是它太天真了。例如:
    • 如果代码A和代码B具有完全相同的代码(即执行完全相同任务的相同函数,并且所有变量和对象名称都是相同的),但代码A的函数所列顺序与代码B中所列的略有不同,那么两个代码文件的逐行比较显然会显示出差异。但是,如果B文件中的代码是重新排序的,使函数与文件A的顺序完全相同,那么就不会有任何区别。
    • 代码A和代码B在逻辑上可以完全相同(即执行逻辑上相同的操作和输出的函数的数目),但对象、变量和函数名称是不同的(毕竟,这是每个编码器的主观选择),那么我们又会有显著的差异。例如,在代码A的文件中有一个名为MyFunction(a,b)的函数,而在代码B的文件中有一个名为CopyMyFunction(x,y)的函数。现在,如果两个函数执行完全相同的操作(例如两个输入值的和),那么从逻辑上讲,代码是相同的--只是变量名称不同。
    • 最后是一个更复杂的版本。假设代码A的文件中有一个名为MyAverage (a,b)的函数执行这些操作,返回输出d: C=a+B= c/2假设在代码B的文件中也有一个名为MyAverage(a,b)的函数,它执行相同的计算,但在逻辑上只执行一个步骤,即c=(a+ b)/2,这两个函数逻辑上产生完全相同的输出,尽管代码A在两个步骤中执行,而代码B在一个步骤中完成。

以上显然只是可能遇到的问题类型的一些例子。

目的不是确定是否存在抄袭,也不确定代码部分是否从一个代码文件复制到另一个代码文件。相反,如果随后在一个代码文件中发现了严重错误( bug或逻辑错误),那么我需要一种方法来识别在其他代码文件中发生相同错误的可能性,即通过从一个文件复制到另一个文件来传播该错误?

人们将如何处理更高级的问题?例如,为了解决最后一个问题(即确定代码的两个部分在逻辑上是否等效),我可以看到两种方法来处理这个问题:

  • 变量的重命名和替换。因此,在代码A中,由于变量c被定义为"a + b",可以将其替换为变量d的表达式,并添加括号。替换后,变量d可以重命名为变量c。在这种情况下,代码B将与代码A相同。
  • 输出模拟在更复杂的功能中,上述技术可能并不总是起作用。相反,如果当给定相同的输入时,两个函数的输出是相同的,那么我们可以推断出两者的逻辑必须在一定程度的信任范围内是相同的吗?这方面的问题是,模拟数百万的投入将是非常耗时和昂贵的肯定。

除此之外,我不知道如何处理这个问题。

对使用的方法和/或资源有什么想法吗?

我很高兴能在这个问题上得到一个很好的参考或资源。

EN

回答 2

Data Science用户

发布于 2018-04-27 15:04:07

您可以从软件相似性度量开始。它可以在一组软件文档中找到类似的软件文档。它有几个好的特性-空白不敏感,噪声抑制,和位置无关。它基于更一般的文档指纹概念,其中哈希是由文档构造的。对文档哈希值进行比较。在风水纸中有一个更技术性的解释。

这里是一篇综述性论文,介绍了Levenshtein字符串编辑距离、RTED-鲁棒树编辑距离算法和图形编辑距离等技术。

票数 2
EN

Data Science用户

发布于 2018-04-28 04:01:29

另一种可能还不太先进的方法是将深度学习系统与输出的修改结合起来,以提供“相似之处”。

本文对Code2vec这一个进行了代码神经网络训练,将其编码成一个可扩展的向量,以预测其性质,然后根据本文的要求完成一些任务。可以想象,如果您有符合您想要培训的标准的“标记”代码,那么NN可能是一些值得研究的东西(至少从远处看)。Code2vec介绍似乎适合于更复杂的例子,因为它能够以一种类似于语言的方式预测输出和比较代码(因为有很多NN体系结构在总结和情感分析方面这样做)。

票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/30937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档