一种自动给代码打数据结构标签的方法技术

技术编号:21605661 阅读:22 留言:0更新日期:2019-07-13 18:16
本发明专利技术公开了一种自动给代码打数据结构标签的方法,属于人工智能下自然语言处理领域,该方法包括:使用词法分析器和语法分析器把代码转换成抽象语法树;再对抽象语法树进行建模,在树上使用注意力机制和残差块从下到上对每个结点进行编码,得到整棵树的编码;最后通过模型中分类器给代码打数据结构的标签。根据上述方法可以实现自动给代码打数据结构标签,减轻了人工给代码打数据结构标签的工作量。

A Method of Labeling Code Data Structure Automatically

【技术实现步骤摘要】
一种自动给代码打数据结构标签的方法
本专利技术属于人工智能下自然语言处理领域,具体是一种自动给代码打数据结构标签的方法。
技术介绍
随着互联网的普及,互联网上出现了大量高质量的代码,但是很多代码没有数据结构的标签,不方便用户查询和学习,人工给海量代码打数据结构标签是不现实的,所以本专利技术提出自动给代码打数据结构标签的方法,解决了如何给代码自动打数据结构标签的问题,减轻了人工标注代码的工作量。
技术实现思路
本专利技术提出一种自动给代码打数据结构标签的方法。使用词法分析器和语法分析器把代码转为抽象语法树,之后对每个词进行词嵌入,在树上使用残差块和注意力机制等方法从下到上对每个结点依次编码,最终得到根结点的编码,该编码既包括所有子结点的语法和语义表达,也包括自身结点的语义表达,最后使用根结点的表达进行分类,因为一段代码有可能包含多种数据结构,所以使用多个sigmoid分类器来得到多个数据结构标签。本专利技术是一种自动给代码打数据结构标签的方法,包括以下步骤:步骤1:使用爬虫技术从网页上收集大量标注数据结构的代码。步骤2:由于不同的代码语法不一样,需要针对不同语言使用不同的词法分析器,使用词法分析器把代码中不同类型的变量替换为对应的词,词法分析器把1、1.1等数字替换为Num;词法分析器把所有变量名替换为Name;词法分析器所有字符串替换为Str,其中词法分析器不会把语言对应的关键字替换。步骤3:针对不同的语言使用对应的语法分析器,使用语法分析器把词法分析后的代码转为抽象语法树。步骤4:对词法分析和语法分析后产生的词进行词嵌入,把Num、Name、根结点Module和赋值运算Assign等词进行词嵌入。步骤5:使用同一个残差块Reb对每个结点的嵌入编码进行非线性变换得到新的语义编码。e′=Rebq(e)=LN(W2·ReLU(W1·e)+e)其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embeddingsize为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。步骤6:在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达。Vc=A·HTA=softmax(score(Q,H))其中Q为n个相同当前结点通过残差块变换后的向量叠加后的矩阵,H为当前结点下n个子结点通过残差块变换后的向量叠加后的矩阵,score函数是计算当前结点表达与每个子结点表达的相似度,相似度越高,softmax后概率越大,score函数可以通过三种方式来计算当前结点与子结点的相似度,Vc为注意力表达。再把注意力向量与当前结点向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的语义表达,也包括所有子结点的语义表达。如下面的公式:e″=ReLU(Rebq(e′)+Rebc(Vc)+b)其中e’为当前结点的向量编码,Vc为注意力向量,Reb为残差块,b为偏值,ReLU为ReLU激活函数,e”为e’当前结点向量编码使用残差块编码与Vc注意力向量编码使用残差块编码融合后的向量编码。步骤7:按照上面的公式,在树上从下到上计算每个结点的表达,最后使用根结点的表达进行分类,因为代码有可能属于多个类别,所以使用多个sigmoid分类器来得到多个数据结构的标签。yi=sigmoid(W2·ReLU(W1·e′r)+b)其中e’r为根结点的语义表达,W1和W2为参数,b为偏值,ReLU为ReLU激活函数,sigmoid为sigmoid函数。步骤8:训练模型,使用大量标数据结构代码来训练整体模型,首先使用词法分析器对这段代码进行词法分析,把1、1.1等数字替换为Num,把所有变量名替换为Name,把所有字符串替换为Str,使用语法分析器把词法分析后的代码转为抽象语法树,把抽象语法树中每个结点进行嵌入,也就是把结点找到对应的实维向量,使用残差块对每个结点的嵌入编码进行非线性变换得到新的语义编码。如下面公式:e′=Rebq(e)=LN(W2·ReLU(W1·e)+e)其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embeddingsize为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达。Vc=A·HTA=softmax(score(Q,H))Q为n个相同当前结点通过残差块变换后的向量叠加后的矩阵,H为当前结点下n个子结点通过残差块变换后的向量叠加后的矩阵,score函数是计算当前结点表达与每个子结点表达的相似度,相似度越高,softmax后概率越大,score函数可以通过三种方式来计算当前结点与子结点的相似度,Vc为注意力表达。再把注意力向量与当前结点向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的语义表达,也包括所有子结点的语义表达。如下面的公式:e′=ReLU(Rebq(e′)+Rebc(Vc)+b)e’为当前结点的向量与注意力向量Vc融合后的表达。最后使用根结点的编码进行分类,因为代码有可能属于多个类别,所以使用多个sigmoid分类器来得到多个数据结构的标签。yi=sigmoid(W2·ReLU(W1·e′r)+b)e’r为根结点的语义表达,ReLU为ReLU激活函数,sigmoid为sigmoid函数。根结点的编码通过sigmoid函数有预测概率与真实概率差会产生损失值。再通过反向梯度传播来更新每个参数,进而达到训练的作用。步骤9:使用训练好的模型对新的代码进行预测,来了一段新代码,使用词法分析器对这段新代码进行词法分析,把1、1.1等数字替换为Num,把所有变量名替换为Name,把所有字符串替换为Str,使用语法分析器把词法分析后的代码转为抽象语法树,把抽象语法树中每个结点进行嵌入,如Num、Name等结点进行嵌入,也就是把结点找到对应的实维向量,使用残差块对每个结点的向量进行编码,得到新的编码,再使用注意力机制从下到上依次对每个结点进行编码,最后使用根结点的编码来分类,由于使用多个sigmoid分类器,会判断为多个数据结构,如果其中一个分类器预测某个标签概率大于50%,那么这段代码属于这个类别,也可以设置一个阈值,如预测概率高于70%,才认为这段代码属于这个类别。附图说明图1为本专利技术的流程示意图。图2为a=b+c代码的抽象语法树示意图。图3为抽象语法树编码的示意图。具体实施方式现在结合附图对本专利技术作进一步详细的说明。这些附图均为简化的示意图,仅以示意方式说明本专利技术的基本结构,因此其仅显示与本专利技术有关的构成。图1示出了一种自动给代码打数据结构标签的方法的流程图,包括:第一步使用爬虫技术从各种博客、论坛等网上收集大量有数据结构的代码;第二步使用词法分析器对代码进行词法分析,把1、1.1等数字替换为Num,把所有变量名替换为Name,把所有字符串替本文档来自技高网...

【技术保护点】
1.一种自动给代码打数据结构标签的方法,其特征在于,所述方法包括:收集大量标注了数据结构的代码;使用词法分析器和语法分析器把代码转为抽象语法树;在树上使用注意力机制和残差块对结点编码,使用编码对代码打标签;训练模型以及使用训练后的模型对新的代码进行预测。

【技术特征摘要】
1.一种自动给代码打数据结构标签的方法,其特征在于,所述方法包括:收集大量标注了数据结构的代码;使用词法分析器和语法分析器把代码转为抽象语法树;在树上使用注意力机制和残差块对结点编码,使用编码对代码打标签;训练模型以及使用训练后的模型对新的代码进行预测。2.根据权利要求1所述的自动给代码打数据结构标签的方法,其特征在于,所述收集大量标注了数据结构的代码包括:从网上通过爬虫技术收集十几万的代码,其中标注了对应的数据结构,数据结构包括树、链表、队列等。3.根据权利要求1所述的自动给代码打数据结构标签的方法,其特征在于,所述使用词法分析器包括:由于不同的代码语法不一样,需要针对不同语言使用不同的词法分析器,使用词法分析器把代码中不同类型的变量替换为对应的词。4.根据权利要求1所述的自动给代码打数据结构标签的方法,其特征在于,所述使用语法分析器包括:针对不同的语言使用对应的语法分析器,使用语法分析器把词法分析后的代码转为抽象语法树。5.根据权利要求1所述的自动给代码打数据结构标签的方法,其特征在于,所述在树上使用注意力机制和残差块对结点编码包括:对词法分析和语法分析后产生的词进行词嵌入转为实值向量。在树上使用注意力机制和残差块对所有结点进行编码。6.根据权利要求1所述的自动给代码打数据结构标签的方法,其特征在于,所述使用编码对代码打标签包括:使用根结点的编码进行分类,因为代码有可能属于多个类别,所以使用多个sigmoid分类器来得到多个数据结构的标签。yi=sigmoid(W2·ReLU(W1·e′r)+b)其中e’r为根结点的语义表达,W1、W2、b为需要学习的参数,ReLU为ReLU激活函数,sigmoid为sigmoid函数。7.根据权利要求1所述的自动给代码打数据结构标签的方法,其特征在于,所述训练模型包括:使用大量标数据结构代码来训练整体模型,首先使用词法分析器对这段代码进行词法分析;使用语法分析器把词法分析后的代码转为抽象语法树;把抽象语法树中每个结点进行嵌入,也就是把结点找到对应的实维向量;使用残差块对每个结点的嵌入编码进行非线性变换得到新的语义编码;如下面公式:e′=Rebq(e)=LN(W2·ReLU(W1·e)+e)其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embeddingsize为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达;Vc=A·HTA=softmax(score(Q,H))Q为n个相同当前结点通过残差块变换后的向量叠加后的矩阵,H为当前结点下n个子结点通过残差块变换后的向量叠加后的矩阵,score函数是计算当前结点表达与每个子结点表达的相似度,相似度越高,softmax后概率越大,score函数可以通过三种方式来计算当前结点与子结点的相似度,Vc为注意力表达;再把注意力向量与当前结点向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的...

【专利技术属性】
技术研发人员:不公告发明人
申请(专利权)人:中森云链成都科技有限责任公司
类型:发明
国别省市:四川,51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1