CN112148879A - 一种自动给代码打数据结构标签的计算机可读存储介质 - Google Patents
一种自动给代码打数据结构标签的计算机可读存储介质 Download PDFInfo
- Publication number
- CN112148879A CN112148879A CN202011019000.8A CN202011019000A CN112148879A CN 112148879 A CN112148879 A CN 112148879A CN 202011019000 A CN202011019000 A CN 202011019000A CN 112148879 A CN112148879 A CN 112148879A
- Authority
- CN
- China
- Prior art keywords
- node
- code
- vector
- nodes
- embedding
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/35—Clustering; Classification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/33—Querying
- G06F16/335—Filtering based on additional data, e.g. user or group profiles
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/205—Parsing
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Audiology, Speech & Language Pathology (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Machine Translation (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明公开了一种自动给代码打数据结构标签的计算机可读存储介质,属于人工智能下自然语言处理领域,该方法包括:使用词法分析器和语法分析器把代码转换成抽象语法树;再对抽象语法树进行建模,在树上使用注意力机制和残差块从下到上对每个结点进行编码,得到整棵树的编码;最后通过模型中分类器给代码打数据结构的标签。根据上述方法可以实现自动给代码打数据结构标签,减轻了人工给代码打数据结构标签的工作量。
Description
本申请是申请日为2019年4月16日,申请号为2019103047977,发明创造名称为“一种自动给代码打数据结构标签的方法”的分案申请。
技术领域
本发明属于人工智能下自然语言处理领域,具体是一种自动给代码打数据结构标签的计算机可读存储介质。
背景技术
随着互联网的普及,互联网上出现了大量高质量的代码,但是很多代码没有数据结构的标签,不方便用户查询和学习,人工给海量代码打数据结构标签是不现实的,所以本发明提出自动给代码打数据结构标签的方法,解决了如何给代码自动打数据结构标签的问题,减轻了人工标注代码的工作量。
发明内容
本发明提出一种自动给代码打数据结构标签的计算机可读存储介质。一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现一种自动给代码打数据结构标签的方法,该方法使用词法分析器和语法分析器把代码转为抽象语法树,之后对每个词进行词嵌入,在树上使用残差块和注意力机制等方法从下到上对每个结点依次编码,最终得到根结点的编码,该编码既包括所有子结点的语法和语义表达,也包括自身结点的语义表达,最后使用根结点的表达进行分类,因为一段代码有可能包含多种数据结构,所以使用多个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,embedding size为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。
步骤6:在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达。
Vc=A·HT
A=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,embedding size为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。
在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达。
Vc=A·HT
A=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,把所有字符串替换为Str,其中词法分析器不把语言对应的关键字替换;
第三步使用语法分析器对代码进行语法分析,把代码转为抽象语法树;
第四步使用残差块对抽象语法树中每个结点进行编码,每个结点得到通过残差块编码后的新的编码,再使用注意力机制在树上从下到上依次对每个结点进行编码,把每个结点的所有子结点和当前结点的信息进行融合,该结点既有所有子结点的语义编码又有当前结点的语义编码,从下到上一层一层编码,直到对树上根结点进行编码后结束;
第五步训练模型,使用大量标数据结构代码来训练整体模型,首先使用词法分析器对这段代码进行词法分析,把1、1.1等数字替换为Num,把所有变量名替换为Name,把所有字符串替换为Str,使用语法分析器把词法分析后的代码转为抽象语法树,把抽象语法树中每个结点进行嵌入,也就是把结点找到对应的实维向量,使用残差块对每个结点的嵌入编码进行非线性变换得到新的语义编码。如下面公式:
e′=Rebq(e)=LN(W2·ReLU(W1·e)+e)
其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embedding size为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。
在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达。
Vc=A·HT
A=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函数有预测概率与真实概率差会产生损失值。再通过反向梯度传播来更新每个参数,进而达到训练的作用。
第六步使用训练好的模型对新的代码进行预测,来了一段新代码,使用词法分析器对这段新代码进行词法分析,把1、1.1等数字替换为Num,把所有变量名替换为Name,把所有字符串替换为Str,使用语法分析器把词法分析后的代码转为抽象语法树,把抽象语法树中每个结点进行嵌入,如Num、Name等结点进行嵌入,也就是把结点找到对应的实维向量,使用残差块对每个结点的向量进行编码,得到新的编码,再使用注意力机制从下到上依次对每个结点进行编码,最后使用根结点的编码来分类,由于使用多个sigmoid分类器,会判断为多个数据结构,如果其中一个分类器预测某个标签概率大于50%,那么这段代码属于这个类别,也可以设置一个阈值,如预测概率高于70%,才认为这段代码属于这个类别。
图2示出了a=b+c代码的抽象语法树示意图,其中包括Module、Assign、Name、Store、BinOp、Load、Add名称。下面依次来介绍一下,Module为根结点,所有代码的开始;Assign为赋值符号,具体是a=b+c代码中=;Name为变量名的抽象名称,具体不清楚是哪一个变量,但是从代码中可以看出,是a、b、c变量;Store为存储符号,把b+c计算后的值赋值给a,并存在内存当中;BinOp为二元操作,如加法、减法、乘法、除法;Load为加载符号,加载某个变量的值;Add为加法符号,把两个变量的值相加。
图2中a=b+c代码的抽象语法树流程为先给Module根结点,有多少行代码那Module根结点下就有多少个子结点,现在只有一行代码,这a=b+c代码主要在做赋值运算,那Module根结点下有了Assign赋值结点,Assign赋值结点有左子树和右子树,左子树代表赋值给某一个变量,也就是a=b+c中等号左边的变量,右子树代表a=b+c中等号右边的符号,Assign赋值结点左子结点为Name代表赋值给Name这个变量值,Name下子结点为Store存储结点,代表把等式右边的值赋值给左边并且存储到内存当中。
Assign赋值结点右子结点有BinOp二元操作符号,代表下面有可能有加法、减法、乘法、除法。BinOp二元操作符号下有Add加法符号代表该代码等号右边为加法运算,Add加法符号左边Name变量符号为代码a=b+c中b变量,该变量符号下面子结点为Load加载符号,说明需要使用b变量中的值来进行计算。Add加法符号右边Name变量符号为代码a=b+c中c变量,该变量符号下面子结点为Load加载符号,说明需要使用c变量中的值来进行计算。
在抽象语法树中,Module为根结点,Assign为赋值结点,先计算右边的BinOp二元操作符号,把Name变量符号代表b变量,Load把b变量中的值取出来,再把另一个Name变量符号代表c变量,Load把c变量中的值取出来,把两个变量的值进行运算,再看Add加法符号把b变量中的值与c变量中的值相加,相加后通过Assign赋值符号,把计算得到的值赋值给Name变量符号,具体为a=b+c代码中a变量,赋值给a变量后需要把a变量的值存储下来,需要使用Store存储符号,最后Store存储符号把赋值给a变量的值存储到内存当中。
图3示对抽象语法树编码的示意图,从下到上叙述,最下面叶子结点为NameEmbedding、Add Embedding、Name Embedding,Embedding代表对这些结点进行嵌入,也就是把结点转为实值向量,再对这三个结点使用残差块对这三个结点进行更进一步编码,得到这三个结点语义编码,下一步对BinOp二元操作结点进行嵌入Embedding,把BinOp二元操作结点转为对应的实值向量,再使用残差块对BinOp结点进行编码。如下面的公式:
e′=Rebq(e)=LN(W2·ReLU(W1·e)+e)
其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embedding size为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。
编码后使用注意力机制计算当前BinOp结点下所有子结点与当前BinOp结点最相关的语义表达。如下面的公式:
Vc=A·HT
A=softmax(score(Q,H))
Q为n个相同当前结点通过残差块变换后的向量叠加后的矩阵,H为当前结点下n个子结点通过残差块变换后的向量叠加后的矩阵,score函数是计算当前结点表达与每个子结点表达的相似度,相似度越高,softmax后概率越大,score函数可以通过三种方式来计算当前结点与子结点的相似度,Vc为注意力表达。
再把注意力机制得到BinOp结点下所有子结点的语义编码向量与残差块对BinOp结点的编码向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的语义表达,也包括所有子结点的语义表达。如下面的公式:
e′=ReLU(Rebq(e′)+Rebc(Vc)+b)
e’为当前结点的向量与注意力向量Vc融合后的表达。
现在得到BinOp二元操作结点的编码向量,然后对Assgin Embedding结点的左子树编码,左子树只有Name Embedding结点,就对Name变量结点进行嵌入Embedding,得到该结点的编码向量,与上面一样,使用残差块对Name Embedding进行编码得到新的语义表达,Assign Embedding所有子结点都有编码向量了,现在对Assign结点进行嵌入Embedding,把Assign结点转为实值向量,使用残差块对Assign Embedding结点向量进行重新编码得到新的语义表达。再使用注意力机制计算当前Assign Embedding结点下所有子结点与当前Assign Embedding结点最相关的语义表达。随后把注意力机制得到Assign Embedding结点下所有子结点的语义编码向量与残差块对Assign Embedding结点的编码向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的语义表达,也包括所有子结点的语义表达。
编码最后阶段,把Module根结点进行嵌入Embedding转为对应的实值向量,使用残差块对Module Embedding进行重新编码得到新的语义编码。再使用注意力机制计算当前Module Embedding结点下所有子结点与当前Module Embedding结点最相关的语义表达。随后把注意力机制得到Module Embedding结点下所有子结点的语义编码向量与残差块对Module Embedding结点的编码向量融合形成新的当前结点的向量表达。现在得到Module结点的语义编码向量,它也代表整个代码的语义编码,下面把Module结点的语义编码向量输入到多个Sigmoid函数里面,每个Sigmoid函数判断是否是某个数据结构。
下面结合附图,详细描述本发明的技术方案:
如图1所示,本发明的主要流程为:
步骤1:使用爬虫技术从网页上收集大量标注数据结构的代码。
步骤2:由于不同的代码语法不一样,需要针对不同语言使用不同的词法分析器,使用词法分析器把代码中不同类型的变量替换为对应的词,词法分析器把1、1.1等数字替换为Num,词法分析器把所有变量名替换为Name,词法分析器把所有字符串替换为Str,其中词法分析器不会把语言对应的关键字替换。
步骤3:针对不同的语言使用对应的语法分析器,使用语法分析器把词法分析后的代码转为抽象语法树。如图2所示,使用python ast工具器对a=b+c代码转为抽象语法树。
步骤4:对词法分析和语法分析后产生的词进行词嵌入,如Num、Name、根结点Module、赋值运算Assign等词进行词嵌入。
步骤5:使用同一个残差块Reb对每个结点的嵌入编码进行非线性变换得到新的语义编码。
e′=Rebq(e)=LN(W2·ReLU(W1·e)+e)
其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embedding size为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。
步骤6:在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达。
Vc=A·HT
A=softmax(score(Q,H))
Q为n个相同当前结点通过残差块变换后的向量叠加后的矩阵,H为当前结点下n个子结点通过残差块变换后的向量叠加后的矩阵,score函数是计算当前结点表达与每个子结点表达的相似度,相似度越高,softmax后概率越大,score函数可以通过三种方式来计算当前结点与子结点的相似度,Vc为注意力表达。
再把注意力向量与当前结点向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的语义表达,也包括所有子结点的语义表达。如下面的公式:
e′=ReLU(Rebq(e′)+Rebc(Vc)+b)
e’为当前结点的向量与注意力向量Vc融合后的表达。
步骤7:按照上面的公式,在树上从下到上计算每个结点的表达,最后使用根结点的表达进行分类,因为代码有可能属于多个类别,所以使用多个sigmoid分类器来得到多个数据结构的标签。
yi=sigmoid(W2·ReLU(W1·e′r)+b)
e’r为根结点的语义表达,ReLU为ReLU激活函数,sigmoid为sigmoid函数。
步骤8:训练模型,使用大量标数据结构代码来训练整体模型,使得模型对任何代码判断,准确率达到50%以上,所有带数据结构的代码训练模型一次为一个epoch,其中一段代码训练一次模型的流程为提供一段代码,使用词法分析器对这段代码进行词法分析,把1、1.1等数字替换为Num,把所有变量名替换为Name,把所有字符串替换为Str,使用语法分析器把词法分析后的代码转为抽象语法树,把抽象语法树中每个结点进行嵌入,也就是把结点找到对应的实维向量,使用残差块对每个结点的嵌入编码进行非线性变换得到新的语义编码。如下面公式:
e′=Rebq(e)=LN(W2·ReLU(W1·e)+e)
其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embedding size为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。
在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达。
Vc=A·HT
A=softmax(score(Q,H))
Q为n个相同当前结点通过残差块变换后的向量叠加后的矩阵,H为当前结点下n个子结点通过残差块变换后的向量叠加后的矩阵,score函数是计算当前结点表达与每个子结点表达的相似度,相似度越高,softmax后概率越大,score函数可以通过三种方式来计算当前结点与子结点的相似度,Vc为注意力表达。
再把注意力向量与当前结点向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的语义表达,也包括所有子结点的语义表达。如下面的公式:
e′=ReLU(Rebq(e′)+Rebc(Vc)+b)
e’为当前结点的向量与注意力向量Vc融合后的表达。
最后使用根结点的编码来分类,根结点的编码通过sigmoid函数有预测概率与真实概率差会产生损失值,再通过反向梯度传播来更新每个参数,进而达到训练的作用。
步骤9:使用训练好的模型对新的代码进行预测,来了一段新代码,使用词法分析器对这段新代码进行词法分析,把1、1.1等数字替换为Num,把所有变量名替换为Name,把所有字符串替换为Str,使用语法分析器把词法分析后的代码转为抽象语法树,把抽象语法树中每个结点进行嵌入,如Num、Name等结点进行嵌入,也就是把结点找到对应的实维向量,使用残差块对每个结点的向量进行编码,得到新的编码,再使用注意力机制从下到上依次对每个结点进行编码,最后使用根结点的编码来分类,由于使用多个sigmoid分类器,会判断为多个数据结构,如果其中一个分类器预测某个标签概率大于50%,那么这段代码属于这个类别,也可以设置一个阈值,如预测概率高于70%,才认为这段代码属于这个类别。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是
上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备实现本发明的基于配置信息的数据查询方法。
上对本发明实施所提供的一种自动给代码打数据结构标签的方法进行了详细地介绍,本文对本发明的原理和实施方式进行了阐述,以上实施的说明只是用于辅助理解本发明的方法及其核心思想。
Claims (9)
1.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现以下自动给代码打数据结构标签的方法:
收集大量标注了数据结构的代码;
使用词法分析器和语法分析器把代码转为抽象语法树;
在树上使用注意力机制和残差块对结点编码,使用编码对代码打标签;
训练模型以及使用训练后的模型对新的代码进行预测,所述训练模型包括:
使用大量标数据结构代码来训练整体模型,首先使用词法分析器对这段代码进行词法分析;
使用语法分析器把词法分析后的代码转为抽象语法树;
把抽象语法树中每个结点进行嵌入,也就是把结点找到对应的实维向量;
使用残差块对每个结点的嵌入编码进行非线性变换得到新的语义编码;如下面公式:
e'=Rebq(e)=LN(W2·ReLU(W1·e)+e)
其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embedding size为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块;
在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达;
Vc=A·HT
A=softmax(score(Q,H))
Q为n个相同当前结点通过残差块变换后的向量叠加后的矩阵,H为当前结点下n个子结点通过残差块变换后的向量叠加后的矩阵,score函数是计算当前结点表达与每个子结点表达的相似度,相似度越高,softmax后概率越大,score函数可以通过三种方式来计算当前结点与子结点的相似度,Vc为注意力表达;再把注意力向量与当前结点向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的语义表达,也包括所有子结点的语义表达;如下面的公式:
e”=ReLU(Rebq(e')+Rebc(Vc)+b)
e”其中e'为当前结点的向量编码,Vc为注意力向量Vc,Reb为残差块,b为偏值,ReLU为ReLU激活函数,e”为e'当前结点向量编码使用残差块编码与Vc注意力向量编码使用残差块编码融合后的向量编码;
最后使用根结点的编码进行分类,因为代码有可能属于多个类别,所以使用多个sigmoid分类器来得到多个数据结构的标签;
yi=sigmoid(W2·ReLU(W1·e'r)+b)
e'r为根结点的语义表达,ReLU为ReLU激活函数,sigmoid为sigmoid函数;
根结点的编码通过sigmoid函数有预测概率与真实概率差会产生损失值,再通过反向梯度传播来更新每个参数,进而达到训练的作用。
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所述的计算机可读介质,其特征在于,所述使用训练后的模型对新的代码进行预测包括:
使用训练好的模型对新的代码进行预测,来了一段新代码,使用词法分析器对这段新代码进行词法分析,把1、1.1数字替换为Num,把所有变量名替换为Name,把所有字符串替换为Str,使用语法分析器把词法分析后的代码转为抽象语法树,把抽象语法树中每个结点进行嵌入,Num、Name结点进行嵌入,也就是把结点找到对应的实维向量,使用残差块对每个结点的向量进行编码,得到新的编码,再使用注意力机制从下到上依次对每个结点进行编码,最后使用根结点的编码来分类,由于使用多个sigmoid分类器,会判断为多个数据结构,如果其中一个分类器预测某个标签概率大于50%,那么这段代码属于这个类别,设置一个阈值,如预测概率高于70%,才认为这段代码属于这个类别。
8.根据权利要求5所述的计算机可读介质,其特征在于,所述在树上使用残差块编码包括:
使用同一个残差块Reb对每个结点的嵌入编码进行非线性变换得到该结点新的语义编码;如下面公式:
e'=Rebq(e)=LN(W2·ReLU(W1·e)+e)
其中e为当前结点对应的嵌入编码,e∈Rembedding_size,embedding size为每个结点嵌入的维度,W1∈Rd_i×embedding_size,W2∈Rembedding_size×d_i,d_i为超参数,ReLU是ReLU激活函数,LN是层次归一化,Reb为残差块。
9.根据权利要求5所述的计算机可读介质,其特征在于,所述在树上使用注意力机制编码包括:
在树上从下到上对非叶子结点进行编码,使用注意力机制计算当前结点下所有子结点与当前结点最相关的语义表达;
Vc=A·HT
A=softmax(score(Q,H))
Q为n个相同当前结点通过残差块变换后的向量叠加后的矩阵,H为当前结点下n个子结点通过残差块变换后的向量叠加后的矩阵,score函数是计算当前结点表达与每个子结点表达的相似度,相似度越高,softmax后概率越大,score函数可以通过三种方式来计算当前结点与子结点的相似度,Vc为注意力表达。再把注意力向量与当前结点向量融合形成新的当前结点的向量表达,现在当前结点的向量表达既包括自己本身的语义表达,也包括所有子结点的语义表达;如下面的公式:
e”=ReLU(Rebq(e')+Rebc(Vc)+b)
e”为当前结点的向量与注意力向量Vc融合后的表达,ReLU是ReLU激活函数,Reb残差块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011019000.8A CN112148879B (zh) | 2019-04-16 | 2019-04-16 | 一种自动给代码打数据结构标签的计算机可读存储介质 |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011019000.8A CN112148879B (zh) | 2019-04-16 | 2019-04-16 | 一种自动给代码打数据结构标签的计算机可读存储介质 |
CN201910304797.7A CN110008344B (zh) | 2019-04-16 | 2019-04-16 | 一种自动给代码打数据结构标签的方法 |
Related Parent Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910304797.7A Division CN110008344B (zh) | 2019-04-16 | 2019-04-16 | 一种自动给代码打数据结构标签的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112148879A true CN112148879A (zh) | 2020-12-29 |
CN112148879B CN112148879B (zh) | 2023-06-23 |
Family
ID=67172257
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910304797.7A Active CN110008344B (zh) | 2019-04-16 | 2019-04-16 | 一种自动给代码打数据结构标签的方法 |
CN202011019000.8A Active CN112148879B (zh) | 2019-04-16 | 2019-04-16 | 一种自动给代码打数据结构标签的计算机可读存储介质 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910304797.7A Active CN110008344B (zh) | 2019-04-16 | 2019-04-16 | 一种自动给代码打数据结构标签的方法 |
Country Status (1)
Country | Link |
---|---|
CN (2) | CN110008344B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113139054B (zh) * | 2021-04-21 | 2023-11-24 | 南通大学 | 一种基于Transformer的代码编程语言分类方法 |
CN116661805B (zh) * | 2023-07-31 | 2023-11-14 | 腾讯科技(深圳)有限公司 | 代码表示的生成方法和装置、存储介质及电子设备 |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050273772A1 (en) * | 1999-12-21 | 2005-12-08 | Nicholas Matsakis | Method and apparatus of streaming data transformation using code generator and translator |
CN101614787A (zh) * | 2009-07-07 | 2009-12-30 | 南京航空航天大学 | 基于M-ary结构分类器的模拟电子电路故障诊断方法 |
CN102439589A (zh) * | 2008-10-02 | 2012-05-02 | 韩国电子通信研究院 | 利用路径代码编码和解码可扩展标记语言的方法和设备 |
CN103064969A (zh) * | 2012-12-31 | 2013-04-24 | 武汉传神信息技术有限公司 | 自动建立关键词索引表的方法 |
US20160124723A1 (en) * | 2014-10-31 | 2016-05-05 | Weixi Ma | Graphically building abstract syntax trees |
CN108399158A (zh) * | 2018-02-05 | 2018-08-14 | 华南理工大学 | 基于依存树和注意力机制的属性情感分类方法 |
CN108446540A (zh) * | 2018-03-19 | 2018-08-24 | 中山大学 | 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与*** |
WO2018191344A1 (en) * | 2017-04-14 | 2018-10-18 | Salesforce.Com, Inc. | Neural machine translation with latent tree attention |
CN108829823A (zh) * | 2018-06-13 | 2018-11-16 | 北京信息科技大学 | 一种文本分类方法 |
CN109033069A (zh) * | 2018-06-16 | 2018-12-18 | 天津大学 | 一种基于社会媒体用户动态行为的微博主题挖掘方法 |
CN109241834A (zh) * | 2018-07-27 | 2019-01-18 | 中山大学 | 一种基于隐变量的嵌入的群体行为识别方法 |
CN110188104A (zh) * | 2019-05-30 | 2019-08-30 | 中森云链(成都)科技有限责任公司 | 一种面向K12编程的Python程序代码快速搜索方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040068716A1 (en) * | 2002-10-04 | 2004-04-08 | Quicksilver Technology, Inc. | Retargetable compiler for multiple and different hardware platforms |
CN102063488A (zh) * | 2010-12-29 | 2011-05-18 | 南京航空航天大学 | 一种基于语义的代码搜索方法 |
CN102339252B (zh) * | 2011-07-25 | 2014-04-23 | 大连理工大学 | 基于xml中间模型以及缺陷模式匹配的静态检测*** |
US10169208B1 (en) * | 2014-11-03 | 2019-01-01 | Charles W Moyes | Similarity scoring of programs |
CN107220180B (zh) * | 2017-06-08 | 2020-08-04 | 电子科技大学 | 一种基于神经网络语言模型的代码分类方法 |
-
2019
- 2019-04-16 CN CN201910304797.7A patent/CN110008344B/zh active Active
- 2019-04-16 CN CN202011019000.8A patent/CN112148879B/zh active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050273772A1 (en) * | 1999-12-21 | 2005-12-08 | Nicholas Matsakis | Method and apparatus of streaming data transformation using code generator and translator |
CN102439589A (zh) * | 2008-10-02 | 2012-05-02 | 韩国电子通信研究院 | 利用路径代码编码和解码可扩展标记语言的方法和设备 |
CN101614787A (zh) * | 2009-07-07 | 2009-12-30 | 南京航空航天大学 | 基于M-ary结构分类器的模拟电子电路故障诊断方法 |
CN103064969A (zh) * | 2012-12-31 | 2013-04-24 | 武汉传神信息技术有限公司 | 自动建立关键词索引表的方法 |
US20160124723A1 (en) * | 2014-10-31 | 2016-05-05 | Weixi Ma | Graphically building abstract syntax trees |
WO2018191344A1 (en) * | 2017-04-14 | 2018-10-18 | Salesforce.Com, Inc. | Neural machine translation with latent tree attention |
CN108399158A (zh) * | 2018-02-05 | 2018-08-14 | 华南理工大学 | 基于依存树和注意力机制的属性情感分类方法 |
CN108446540A (zh) * | 2018-03-19 | 2018-08-24 | 中山大学 | 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与*** |
CN108829823A (zh) * | 2018-06-13 | 2018-11-16 | 北京信息科技大学 | 一种文本分类方法 |
CN109033069A (zh) * | 2018-06-16 | 2018-12-18 | 天津大学 | 一种基于社会媒体用户动态行为的微博主题挖掘方法 |
CN109241834A (zh) * | 2018-07-27 | 2019-01-18 | 中山大学 | 一种基于隐变量的嵌入的群体行为识别方法 |
CN110188104A (zh) * | 2019-05-30 | 2019-08-30 | 中森云链(成都)科技有限责任公司 | 一种面向K12编程的Python程序代码快速搜索方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112148879B (zh) | 2023-06-23 |
CN110008344A (zh) | 2019-07-12 |
CN110008344B (zh) | 2020-09-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113642330B (zh) | 基于目录主题分类的轨道交通规范实体识别方法 | |
CN111160008B (zh) | 一种实体关系联合抽取方法及*** | |
CN107330032B (zh) | 一种基于递归神经网络的隐式篇章关系分析方法 | |
CN113177124B (zh) | 一种垂直领域知识图谱构建方法及*** | |
CN109960728B (zh) | 一种开放域会议信息命名实体识别方法及*** | |
CN111897908A (zh) | 融合依存信息和预训练语言模型的事件抽取方法及*** | |
CN111694924A (zh) | 一种事件抽取方法和*** | |
CN113822026B (zh) | 一种多标签实体标注方法 | |
CN111274790A (zh) | 基于句法依存图的篇章级事件嵌入方法及装置 | |
CN113168499A (zh) | 检索专利文档的方法 | |
CN113254675B (zh) | 基于自适应少样本关系抽取的知识图谱构建方法 | |
CN113196277A (zh) | 用于检索自然语言文档的*** | |
CN113360654B (zh) | 文本分类方法、装置、电子设备及可读存储介质 | |
CN113468887A (zh) | 基于边界与片段分类的学者信息关系抽取方法和*** | |
CN111340006B (zh) | 一种手语识别方法及*** | |
CN110008344B (zh) | 一种自动给代码打数据结构标签的方法 | |
CN116245097A (zh) | 训练实体识别模型的方法、实体识别方法及对应装置 | |
CN114492460B (zh) | 基于衍生提示学习的事件因果关系抽取方法 | |
CN117390189A (zh) | 基于前置分类器的中立文本生成方法 | |
CN115408506B (zh) | 联合语义解析和语义成分匹配的nl2sql的方法 | |
CN116186241A (zh) | 基于语义学分析与提示学习的事件要素抽取方法、装置、电子设备及存储介质 | |
CN116483314A (zh) | 一种自动化智能活动图生成方法 | |
CN115906818A (zh) | 语法知识预测方法、装置、电子设备和存储介质 | |
CN115860002A (zh) | 一种基于事件抽取的作战任务生成方法及*** | |
CN114528459A (zh) | 一种基于语义的网页信息抽取方法及*** |
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 |