CN113986345A - 一种预训练增强的代码克隆检测方法 - Google Patents

一种预训练增强的代码克隆检测方法 Download PDF

Info

Publication number
CN113986345A
CN113986345A CN202111283972.2A CN202111283972A CN113986345A CN 113986345 A CN113986345 A CN 113986345A CN 202111283972 A CN202111283972 A CN 202111283972A CN 113986345 A CN113986345 A CN 113986345A
Authority
CN
China
Prior art keywords
training
code
word
model
clone
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202111283972.2A
Other languages
English (en)
Other versions
CN113986345B (zh
Inventor
刘爽
冷林珊
田承霖
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tianjin University
Original Assignee
Tianjin University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tianjin University filed Critical Tianjin University
Priority to CN202111283972.2A priority Critical patent/CN113986345B/zh
Publication of CN113986345A publication Critical patent/CN113986345A/zh
Application granted granted Critical
Publication of CN113986345B publication Critical patent/CN113986345B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • G06F8/751Code clone detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/24Classification techniques
    • G06F18/241Classification techniques relating to the classification model, e.g. parametric or non-parametric approaches
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/044Recurrent networks, e.g. Hopfield networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Artificial Intelligence (AREA)
  • Evolutionary Computation (AREA)
  • General Health & Medical Sciences (AREA)
  • Molecular Biology (AREA)
  • Computing Systems (AREA)
  • Computational Linguistics (AREA)
  • Biophysics (AREA)
  • Mathematical Physics (AREA)
  • Biomedical Technology (AREA)
  • Health & Medical Sciences (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Evolutionary Biology (AREA)
  • Machine Translation (AREA)

Abstract

本发明公开一种预训练增强的代码克隆检测方法,包括以下步骤:(1)使用子词丰富方法对单词进行词向量训练,同时能对词表之外的单词进行更好地表示。(2)使用函数名预测预训练任务来获取函数片段的语义信息,减少了对有标注数据集的依赖。(3)使用少量有标注数据对克隆检测模型进行微调,以达到更好的效果。(4)通过学习代码片段的语义,从而达到更好的分类效果。

Description

一种预训练增强的代码克隆检测方法
技术领域
本发明涉及代码克隆检测领域,特别是对于IV型代码克隆的检测。
背景技术
代码克隆指的是在代码语句构成上或者语义上相似的代码片段,其普遍存在于软件项目之中,尤其在有众多参与者的大规模项目中存在更多。代码克隆产生的原因有很多,主要是开发者在开发的过程中为了提高效率,包括复制粘贴已有的代码片段并进行适当的增减语句或调换语句顺序,或使用开发框架、设计模式等[1]。代码克隆检测是软件工程领域的一项重要任务,对于语义相似但语法差距较大的四型代码克隆的检测尤为困难。
代码克隆检测问题已经被广泛研究。其中较为流行的方法是从源代码和抽象语法树(AST)中提取特征,通过计算特征的相似度判断是否为克隆对。近年来,特征表示学习方法已经引起了学者们广泛的兴趣。这些方法通过获得词嵌入和复杂的神经网络结构来编码源代码或者AST,可以获得较好的检测效果。但是这些方法都使用到了大规模有标注数据集,然而获取数据集的代价对于代码克隆领域来说是巨大的,因为它需要熟练掌握不同语言的程序员进行高质量的标注,因此获得多种语言的数据集代价更大。
代码克隆没有形式化定义,不同的研究人员对克隆的判定有不同的量化方法。较为公认的标准是代码克隆可以被分为四种类型。Ⅰ型克隆表示两段代码在除了注释、布局和空格的以外完全相同。Ⅱ型克隆指的是替换用户定义的标识符,在注释、类型和布局上有变化,但语法或结构相似的代码段。这些克隆也称为参数化克隆。Ⅲ型克隆涉及代码片段对的插入和删除,经过进一步修改(如添加或删除语句)的复制片段,以及对空格、标识符、布局、注释和类型的更改。Ⅳ型克隆指的是具有相似语义但语法结构有所差异的代码片段。Ⅳ型克隆的识别在本质上与Ⅰ-Ⅲ型克隆不同,IV型克隆更偏向语义,即代码片段看上去不相似,但是都实现了相同或者相似的功能。如图1a和图1b中的两段代码所示。
具体涉及的技术如下:
1.自然语言模型Word2Vec
Word2Vec[2]模型的目的是将自然语言文本转化为神经网络所能处理的向量格式,生成的词向量用于神经网络的分类或学习等任务。主要的模型类型有词袋模型和Skip-gram模型两种。
Figure BDA0003332151660000011
其中,
Figure BDA0003332151660000021
为代码片段A经过分词后的单词,Ew为查找矩阵,其在模型中是固定的,
Figure BDA0003332151660000022
为经过模型训练后的词向量。
2.深度学习模型Long Short-Term Memory(LSTM)
LSTM是一种循环神经网络(RNN),主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题而提出的模型。相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
3.预训练
预训练模型是指利用大数据集的训练数据,先行训练出可以表示语义信息的模型,用于下游任务。在自然语言处理领域,预训练模型是一种迁移学习的应用,利用几乎无限的文本,学习输入句子的每一个成员的上下文相关的表示,从而隐式地学习到了通用的语法语义知识。利用预训练模型可以将从开放领域学到的知识迁移到下游任务,以改善低资源任务,对低资源语言处理也非常有利。使用预训练模型+微调机制具备很好的可扩展性,在支持一个新任务时,只需要利用该任务的标注数据进行微调即可。
在基于度量的方法中,用度量值来衡量以源代码作为输入的代码克隆。对于函数或类等语法单元,计算语句度量值,然后比较这些度量值,如果两个语法单元具有相同或相似的度量值,则可以认为它们是克隆对。程序也可以被表示成token序列或词的集合进行代码克隆检测,基于token的方法是在词法的基础上进行检测,这些方法包括词法分析和克隆检测两个步骤。它们在词法分析器的解析之后将目标源代码转换为一系列tokens。扫描token序列以找到token的重复子序列,最后,表示重复子序列的原始代码片段将作为克隆返回。在基于树的克隆检测技术中,程序首先被转换成抽象语法树,然后使用树匹配方法搜索相似的子树。当匹配成功时,相似子树的相应源代码将作为克隆类或克隆对返回。
现有基于监督学习的方法使用人工标注的数据集例如BigCloneBench[3]和OJClone[4]进行监督学习。这些模型实现了很高的性能,但需要一个非常大规模的有标注训练数据集,人工标注代码克隆数据集,特别是Ⅳ型克隆的代价较高,需要标注者有较好的编程知识。近期,大规模语料预训练模型在自然语言处理领域取得了良好进展。在程序语言的表征学习上,大规模预训练模型也受到了关注。在代码克隆相关领域,也有通过预训练模型提升代码表征的方法被提出。当前程序语言领域的预训练模型,如CodeBert,均通过大量代码片段预训练参数,由于参数数量巨大,在目标任务上进行微调时,仍需要较多数量的目标任务训练数据。
与自然语言中的单词相比,编程语言中的token可以以更灵活和多样化的方式命名,因为除了不能将变量和函数名命名为语言关键字外,可以将它们命名为任何单词。例如,几乎所有合法的英语单词(例如“read”,“write”和“length”),子词(例如“buf”和“dest”),以及单词组合(例如“FileInputStream”,“sourceChannel”)都是合法的程序语言tokens。此外,由于拼写错误而产生的命名方式可能会引入更奇怪的(子)字符串组合作为变量或者函数名。因此,编程语言tokens的词汇量可能是无限大的。另一方面,编程语言预训练语料库的规模可能比自然语言小得多,因为只能在少数的开源代码库中获得语料。上述两个问题可能导致token表示中严重的OOV(out of vocabulary)问题。
此外在进行Ⅳ型代码克隆检测时,最直观的方法是使用经过标注的代码克隆对来训练神经网络,在给出大量的代码片段对以及标签(1和0分别代表克隆和非克隆)后,通过训练深度学习模型来区分克隆与非克隆代码片段。然而直接用标注好的数据集训练深度神经网络需要大量经过高质量的标注数据,这项工作不仅费时而且需要很多专业人员进行标注,特别是在检测不同语言的代码克隆时,就需要掌握不同语言的专业人员进行标注
发明内容
本发明的目的是为了克服现有技术中的不足,提供一种轻量级预训练增强的代码克隆检测技术,本发明在于更轻量级的训练方法以及更准确的分类结果,将预训练的方法用于词向量训练以及LSTM神经网络训练的过程中。应用该思想进行轻量级的语义预训练,以提升代码表征能力,基于token的代码表示工作,并利用一个简单的AttBiLSTM神经网络结构通过两个预训练来表示代码片段。
本发明的目的是通过以下技术方案实现的:
一种预训练增强的代码克隆检测方法,包括以下步骤:
(1)在Github等开源代码库中获得大量的预训练语料,通过数据清洗、语法分析、分词等步骤,将连续的代码片段分割成词汇信息。
(2)使用改进后的词向量训练模型对第一步获得的词进行词向量训练,改进后的模型可以对不在词表中的单词进行更准确的表示,对于在词表中预先训练过的单词,直接利用预先训练的嵌入,在经过词向量训练得到的嵌入矩阵中查找向量作为token表示。而对于不在词表中的单词,通过它们的子词来组成它们的表示。
(3)在对token进行了向量表示后,就需要对整个代码片段进行语义表示,然而学习函数体的语义可以通过预训练任务来完成。由于函数名可以很好的反映函数体的语义信息,因此可以使用大量的开源代码对克隆检测模型进行预训练,将函数名和函数体作为训练集训练模型,使用训练好的克隆检测模型参数初始化长短时记忆神经网络AttBiLSTM。AttBiLSTM网络整合token嵌入形式的输入,它由两部分组成:双向长短时记忆部分(BiLSTM)和自注意部分。前者的目的是获得一个高级上下文token表示序列,后者的目的是总结序列级的输入特征,并将每个代码片段缩减为一个单一的密集向量。
(4)对两段代码的语义进行训练,从而识别出输入的两个代码片段是否为克隆代码段;
(5)根据两段代码得出的单一向量进行分类,判断两段代码是否是克隆对。
与现有技术相比,本发明的技术方案所带来的有益效果是:
1.本发明引入了ngram子词来丰富词语表示,采用基于ngram的子词组合的token嵌入来解决token表示中的OOV问题。对于在词表中预先训练过的单词,直接利用预先训练的嵌入,在矩阵Ew中查找向量作为token表示。而对于OOV单词,通过它们的ngram来组成它们的表示。这样可以解决OOV问题,并且在很大程度上提升了编码的准确率。
2.为了解决需要大量标注代码克隆和非克隆数据的高成本问题,本发明提出设计合理的预训练任务,辅助模型学习程序语义信息。在具有良好写作规范的代码中,函数名通常是对函数体语义的描述总结。因此,本发明选取函数名预测任务作为辅助预训练任务。选择函数名预测任务对模型参数进行预训练可以使深度学习模型的特征表示层学习到代码片段的语义,然后经过少量有标注的代码克隆、非克隆数据微调模型参数,从而达到较好的克隆检测效果。
3.本发明使用函数名预测任务预训练AttBiLSTM网络参数,该任务与面向语义的Ⅳ型克隆检测高度相关。在现有工作中,也出现了与函数名预测相关的研究,本发明的主要思想是利用辅助任务监督来学习代码表示。具体来说,函数名预测与Ⅳ型代码克隆检测任务相似,所以被选择为辅助任务。如果所收集的代码是高质量的,没有任何拼写错误的同时变量以及函数名符合命名规范,那么函数名可以反映代码片段的编程意图。因此可以通过预训练获得丰富的语义信息。给定一个代码片段,本发明利用与代码克隆检测模型相同的神经网络结构来表示代码。代码克隆检测判断两个代码片段是否语义相似,函数名预测则是为一个代码片段找到一个合适的方法名。通过该轻量级的预训练过程得到的AttBiLSTM模型的参数,可以很好的表征代码片段的语义,因而,迁移到代码克隆任务中时,对代码表征的模型参数无需过多的微调,只需少量代码克隆数据对分类层进行训练。该方法与通用预训练模型如CodeBert对比,可以大大减少预训练以及微调过程所用的数据集大小,且达到更好的代码克隆检测效果。
附图说明
图1a和图1b为两段IV型代码克隆片段实例。图1a为copyFileUsingChannel(Filesource,File dest);图1b为copyFileUsingChannel(File source,File dest)
图2为代码克隆检测模型的整体结构。
具体实施方式
以下结合附图和具体实施例对本发明作进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明提供一种预训练增强的代码克隆检测方法,见图2,具体的:
1.数据收集:
本实施例使用人工构建的BigCloneBench数据集[3]来评估本发明的有效性。该数据集是一个被广泛使用的Java代码克隆检测的基准,它包含8,654,345个标注好的真实代码克隆对,在这些克隆对中有8,219,320个为Ⅳ型克隆对(占比95.00%),279,032个为非克隆对。随机选择100个Ⅳ型克隆对和100个非克隆对构建数据集,剩下的Ⅳ型克隆对和非克隆对用来测试,以模拟未知的真实克隆情况分布。为了方便训练,保持克隆与非克隆的比例为1:1。
为了预训练token嵌入和代码表示,本实施例从GitHub收集了329个高质量的Java项目(按照获得Star的数量排序)。总共有296,300个文件和2,097,213个方法。经过处理,语料中包含超过一亿九千万个tokens,其中有2,489,036个不同的tokens,构成了词表。在BCB数据集中,仅有928,908个token可以在该预训练得到的词表中搜到,这导致了BigCloneBench上的不在词表中的单词占所有单词的比率为62.68%。
2.预训练提取语义信息的模型
本阶段共分两部分,第一部分使用词向量训练模型训练词向量,第二部分利用代码片段训练克隆检测模型。
对于词向量训练模型,本实施例采用对token嵌入进行子词丰富预训练的SkipGram模型;skipgram模型指的是普通的词向量训练模型,改进后的词向量训练模型是指skipgram+ngram。
为了方便,不区分单词和token,因为token可以被视为编程语言中的单词。词向量训练模型的基本思想是利用语言建模来学习词(tokens)嵌入。SkipGram模型通过预测给定单词的上下文单词来学习单词表示。给定一个单词序列w1,…,wi,…,wn,和一个源单词wi,SkipGram模型预测源单词周围的单词wi-c,…,wi-1,…,wi+1,…,wi+c,c是上下文窗口大小。这个过程是一个典型的分类问题,标签数量与词表大小相同。尽管分类标签数量很大,可以通过负采样来控制。SkipGram模型的目标交叉熵损失函数定义为:
Figure BDA0003332151660000051
在上述公式中,C=2c,wj是wi周围单词中的一个。
SkipGram模型使用一个简单的网络来计算上述公式。网络有两个查找矩阵Ew和Ef,它们都是随机初始化的模型参数,然后在训练过程中根据目标函数进行微调。
给出一对源词和上下文单词(wi,wj),可以从Ew中得到源词嵌入vj,从Ef中得到上下文词嵌入ui。接下来,(wi,wj)的相关分数由ui和vj的数积得到(T代表转置)。
Figure BDA0003332151660000061
分类概率通过以下公式得到:
Figure BDA0003332151660000062
*代表任何其他的被随机负采样的词,分母可以看作是概率计算的归一化因子。
对于子词组合,唯一的区别是源词wi的表示。除了wi的全词嵌入外,还利用了一种由wi的ngram合成表示。例如,对于单词“source”,它的4个字符组合包括“sour”,“ourc”和“urce”。学习这些单词的嵌入,然后由它们来组成词表之外的单词嵌入。
在预训练过程中,源词wi以如下方式被计算:
Figure BDA0003332151660000063
ngram(.)包括所有可能的限于固定长度(本文中为3到6)范围的ngram子词,Q是在wi中ngrams的总数。在整合之后,全词和ngram子词的嵌入可以共同学习。
在探索过程中,对于完整的单词,通过查阅Ew直接获得它们的嵌入。而对于OOV单词,使用上述公式中被包含的ngram子词获得它们的嵌入。例如图1a和图1b中,对于词表之外的单词“sourceChannel”,它的嵌入可以通过平均单词中包含的所有ngrams嵌入来计算。
本发明使用函数名预测任务预训练AttBiLSTM网络参数,该任务与面向语义的Ⅳ型克隆检测高度相关。在现有工作中,也出现了与函数名预测相关的研究,本发明方法的主要思想是利用辅助任务监督来学习代码表示。具体来说,函数名预测与Ⅳ型代码克隆检测任务相似,所以被选择为辅助任务。如果所收集的代码是高质量的,没有任何拼写错误的同时变量以及函数名符合命名规范,那么函数名可以反映代码片段的编程意图。因此可以通过预训练获得丰富的语义信息。给定一个代码片段,利用与代码克隆检测模型相同的神经网络结构来表示代码。代码克隆检测判断两个代码片段是否语义相似,函数名预测则是为一个代码片段找到一个合适的方法名。
函数名预测形式上类似于SkipGram模型。给定一对代码片段CA和它的函数名NB,首先计算它们的向量表示。如图2所示,对于函数体表示CA,利用与代码克隆检测模型相同的网络结构表示代码,可以得到hACODE。对于函数名表示,首先用几个简单的规则将函数名分割成一系列有意义的单词,例如“copyFileUsingStream”被分割成“copy File UsingStream”,然后在单词序列上使用一个简单的平均池化网络来获得其表示。假设NB=w1,…wl,它的向量表示以如下方式计算:
Figure BDA0003332151660000071
查找矩阵Enatural是自然语言词嵌入的集合。这里直接使用一种已公开发布的Glove词嵌入[5]。在本发明中,词嵌入是固定的,所以这部分没有任何模型参数需要训练。
接下来,可以通过它们的表示计算CA和NB的相关分数:
Figure BDA0003332151660000072
在给定CA条件下,NB的概率以如下方式计算:
Figure BDA0003332151660000073
因为分类标签的数量巨大(与合法的函数名总数相同),在这里,同样应用负采样方法进行有效的概率计算。例如,可以抽样5个函数名来近似分母,这个方法大大降低了计算成本。
最后,使用下面的损失函数(还有交叉熵损失)作为训练目标:
loss=-P(NB|CA)
克隆检测模型中的参数与函数名预测模型中的参数完全相同。模型预训练的效果来源于大规模的函数名预测任务,因为构建这样的语料库不需要人工标注。最终目标是预训练AttBiLSTM参数,将预训练得到的参数应用在克隆检测模型中,这就避免了克隆检测模型在训练过程中的参数随机初始化,同时也不需要大规模标注好的语料库。简单地使用预训练的网络参数来初始化神经克隆检测模型的AttBiLSTM部分,然后根据克隆检测目标对这些参数进行调整。
参数设置包括token嵌入预训练,函数名预测训练和代码克隆检测等几个训练任务的超参数。对于token嵌入预训练,直接使用作者发布的fastText[6]工具,其中向量维度设置为100,其它的超参数为该工具默认值。对于代码表示的BiLSTM网络结构,所有隐藏层的维度大小设置为300。在函数名预测和代码克隆检测中,输入嵌入层采用dropout[7],LSTM隐藏层采用Adam算法[8]进行参数优化,初始学习率为5×10-4,梯度剪切阈值为5,mini-batch大小为32。将训练周期和负采样的大小分别设置为20和5,对于代码克隆检测模型训练epoch设置为100。
本发明中研究了低资源设置下的代码克隆检测。提出了两种预训练策略来增强代码表示,(1)使用token嵌入的子词丰富,(2)对从token组合到代码片段的函数名预测。使用增强代码表示可以用最小的训练语料库训练出一个强大的代码克隆检测模型。在BigCloneBench数据集上的实验结果表明,本发明提出的两种策略对Ⅳ型代码克隆的检测是有效的,同时性能上有所提升。本发明的克隆检测模型只用200个训练实例(100个克隆对和100个非克隆对)可以胜过以前使用数百万个训练实例的监督模型,使用更少的数据进行训练可以减少人力物力的消耗。
参考文献:
[1]陈秋远,李善平,鄢萌,夏鑫.代码克隆检测研究进展.软件学报,2019,30(4):962-980.http://www.jos.org.cn/1000-9825/5711.htm.
[2]Mikolov T,Sutskever I,Chen K,et al.Distributed representations ofwords and phrases and their compositionality[C]//Advances in neuralinformation processing systems.2013:3111-3119.
[3]J.Svajlenko,J.F.Islam,I.Keivanloo,C.K.Roy and M.M.Mia,"Towards aBig Data Curated Benchmark of Inter-project Code Clones,"2014IEEEInternational Conference on Software Maintenance and Evolution,2014,pp.476-480,doi:10.1109/ICSME.2014.77.
[4]L.Mou,G.Li,L.Zhang,T.Wang,and Z.Jin,“Convolutional neural networksover tree structures for programming language processing,”in AAAI,2016,pp.1287–1293.
[5]Jeffrey Pennington,Richard Socher,and Christopher DManning.2014.Glove:Global Vectors for Word Representation.EMNLP,1532--1543.
[6]Piotr Bojanowski,Edouard Grave,Armand Joulin,Tomas Mikolov;Enriching Word Vectors with Subword Information.Transactions of theAssociation for Computational Linguistics 2017;5135–146.doi:https://doi.org/10.1162/tacl_a_00051
[7]Y.Yuan,W.Kong,G.Hou,Y.Hu,M.Watanabe and A.Fukuda,"From Local toGlobal Semantic Clone Detection,"2019 6th International Conference onDependable Systems and Their Applications(DSA),2020,pp.13-24,doi:10.1109/DSA.2019.00012.
[8]Alon U,Zilberstein M,Levy O,et al.code2vec:Learning distributedrepresentations of code[J].Proceedings of the ACM on Programming Languages,2019,3(POPL):1-29.
本发明并不限于上文描述的实施方式。以上对具体实施方式的描述旨在描述和说明本发明的技术方案,上述的具体实施方式仅仅是示意性的,并不是限制性的。在不脱离本发明宗旨和权利要求所保护的范围情况下,本领域的普通技术人员在本发明的启示下还可做出很多形式的具体变换,这些均属于本发明的保护范围之内。

Claims (4)

1.一种预训练增强的代码克隆检测方法,其特征在于,包括以下步骤:
(1)从开源代码库获得预训练语料;经过数据清洗、分词处理,将连续的代码片段分割成token,构成词表;
(2)使用子词丰富预训练模型,对上一步获得的词表进行词向量训练,对于在词表中预先训练过的单词,直接利用预先训练的嵌入,在词向量训练中得到的嵌入矩阵中查找向量作为token表示;而对于不在词表中的单词,通过单词的子词来组成单词的表示;
(3)选择与语义相关的任务对克隆检测模型参数进行预训练;使用函数名预测的预训练方法,在获得了开源代码后,使用函数名和函数体对长短时记忆网络进行预训练,使长短时记忆网络获得函数的语义信息;
(4)对两段代码的语义进行训练,从而识别出输入的两个代码片段是否为克隆代码段;
(5)根据两个代码片段得出的单一向量进行分类,判断两段代码是否是克隆对。
2.根据权利要求1所述一种预训练增强的代码克隆检测方法,其特征在于,步骤(1)中利用爬虫方法首先获得所需要的预训练语料。
3.根据权利要求1中所述预训练增强的代码克隆检测,其特征在于,步骤(2)中使用子词丰富预训练模型对词表中的单词进行嵌入。
4.根据权利要求1中所述预训练增强的代码克隆检测,其特征在于,子词丰富预训练模型是经过改进的词向量训练模型,由skipgram模型和ngram模型构成。
CN202111283972.2A 2021-11-01 2021-11-01 一种预训练增强的代码克隆检测方法 Active CN113986345B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111283972.2A CN113986345B (zh) 2021-11-01 2021-11-01 一种预训练增强的代码克隆检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111283972.2A CN113986345B (zh) 2021-11-01 2021-11-01 一种预训练增强的代码克隆检测方法

Publications (2)

Publication Number Publication Date
CN113986345A true CN113986345A (zh) 2022-01-28
CN113986345B CN113986345B (zh) 2024-05-07

Family

ID=79745417

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111283972.2A Active CN113986345B (zh) 2021-11-01 2021-11-01 一种预训练增强的代码克隆检测方法

Country Status (1)

Country Link
CN (1) CN113986345B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114780103A (zh) * 2022-04-26 2022-07-22 中国人民解放军国防科技大学 一种基于图匹配网络的语义类代码克隆检测方法

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110825642A (zh) * 2019-11-11 2020-02-21 浙江大学 一种基于深度学习的软件代码行级缺陷检测方法
CN110851176A (zh) * 2019-10-22 2020-02-28 天津大学 一种自动构造并利用伪克隆语料的克隆代码检测方法
CN111124487A (zh) * 2018-11-01 2020-05-08 浙江大学 代码克隆检测方法、装置以及电子设备
CN111159223A (zh) * 2019-12-31 2020-05-15 武汉大学 一种基于结构化嵌入的交互式代码搜索方法及装置
US20200249918A1 (en) * 2019-02-02 2020-08-06 Microsoft Technology Licensing, Llc. Deep learning enhanced code completion system
CN112215013A (zh) * 2020-11-02 2021-01-12 天津大学 一种基于深度学习的克隆代码语义检测方法
US20210279420A1 (en) * 2020-03-04 2021-09-09 Theta Lake, Inc. Systems and methods for determining and using semantic relatedness to classify segments of text
CN113420296A (zh) * 2021-07-08 2021-09-21 国网甘肃省电力公司电力科学研究院 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111124487A (zh) * 2018-11-01 2020-05-08 浙江大学 代码克隆检测方法、装置以及电子设备
US20200249918A1 (en) * 2019-02-02 2020-08-06 Microsoft Technology Licensing, Llc. Deep learning enhanced code completion system
CN110851176A (zh) * 2019-10-22 2020-02-28 天津大学 一种自动构造并利用伪克隆语料的克隆代码检测方法
CN110825642A (zh) * 2019-11-11 2020-02-21 浙江大学 一种基于深度学习的软件代码行级缺陷检测方法
CN111159223A (zh) * 2019-12-31 2020-05-15 武汉大学 一种基于结构化嵌入的交互式代码搜索方法及装置
US20210279420A1 (en) * 2020-03-04 2021-09-09 Theta Lake, Inc. Systems and methods for determining and using semantic relatedness to classify segments of text
CN112215013A (zh) * 2020-11-02 2021-01-12 天津大学 一种基于深度学习的克隆代码语义检测方法
CN113420296A (zh) * 2021-07-08 2021-09-21 国网甘肃省电力公司电力科学研究院 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
WASI UDDIN AHMAD ET AL.: "Unified Pre-training for Program Understanding and Generation", ARXIV, 10 April 2021 (2021-04-10) *
杨鑫: "基于语义学习的二进制漏洞代码克隆检测", 《中国优秀博士学位论文全文数据库信息科技辑》, no. 02, 15 February 2021 (2021-02-15) *
陈秋远;李善平;鄢萌;夏鑫;: "代码克隆检测研究进展", 软件学报, no. 04, 15 April 2019 (2019-04-15) *
陈翔等: "基于文件粒度的多目标软件缺陷预测方法实证研究", 《软件学报》, vol. 30, no. 12, 15 December 2019 (2019-12-15) *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114780103A (zh) * 2022-04-26 2022-07-22 中国人民解放军国防科技大学 一种基于图匹配网络的语义类代码克隆检测方法
CN114780103B (zh) * 2022-04-26 2022-12-20 中国人民解放军国防科技大学 一种基于图匹配网络的语义类代码克隆检测方法

Also Published As

Publication number Publication date
CN113986345B (zh) 2024-05-07

Similar Documents

Publication Publication Date Title
CN110413986B (zh) 一种改进词向量模型的文本聚类多文档自动摘要方法及系统
CN110134757B (zh) 一种基于多头注意力机制的事件论元角色抽取方法
Chang et al. Chinese named entity recognition method based on BERT
CN109657239B (zh) 基于注意力机制和语言模型学习的中文命名实体识别方法
CN110532554B (zh) 一种中文摘要生成方法、系统及存储介质
Yao et al. Bi-directional LSTM recurrent neural network for Chinese word segmentation
CN111737496A (zh) 一种电力设备故障知识图谱构建方法
CN110929030A (zh) 一种文本摘要和情感分类联合训练方法
CN112215013B (zh) 一种基于深度学习的克隆代码语义检测方法
CN113190656B (zh) 一种基于多标注框架与融合特征的中文命名实体抽取方法
CN113076739A (zh) 一种实现跨领域的中文文本纠错方法和系统
CN116661805B (zh) 代码表示的生成方法和装置、存储介质及电子设备
Ren et al. Detecting the scope of negation and speculation in biomedical texts by using recursive neural network
CN111967267B (zh) 一种基于XLNet的新闻文本地域提取的方法及系统
CN111368542A (zh) 一种基于递归神经网络的文本语言关联抽取方法和系统
Li et al. Joint learning of POS and dependencies for multilingual universal dependency parsing
CN112818698A (zh) 一种基于双通道模型的细粒度的用户评论情感分析方法
CN114676700A (zh) 基于混合多原型的小样本命名实体识别方法
CN113986345B (zh) 一种预训练增强的代码克隆检测方法
Liu et al. Exploring segment representations for neural semi-Markov conditional random fields
CN113449517B (zh) 基于bert门控多窗口注意力网络模型的实体关系抽取方法
Phan et al. Exploiting tree structures for classifying programs by functionalities
Shi et al. Improve on Entity Recognition Method Based on BiLSTM-CRF Model for the Nuclear Technology Knowledge Graph
Xiao et al. Chapter-level entity relationship extraction method based on joint learning
Li et al. A Review of Field Text Analysis

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant