CN107729925B - 对程序竞赛型源代码按照解题方法做自动分类与评分的方法 - Google Patents

对程序竞赛型源代码按照解题方法做自动分类与评分的方法 Download PDF

Info

Publication number
CN107729925B
CN107729925B CN201710883195.2A CN201710883195A CN107729925B CN 107729925 B CN107729925 B CN 107729925B CN 201710883195 A CN201710883195 A CN 201710883195A CN 107729925 B CN107729925 B CN 107729925B
Authority
CN
China
Prior art keywords
program
statement
node
transformation
operator
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.)
Active
Application number
CN201710883195.2A
Other languages
English (en)
Other versions
CN107729925A (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.)
University of Science and Technology of China USTC
Original Assignee
University of Science and Technology of China USTC
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 University of Science and Technology of China USTC filed Critical University of Science and Technology of China USTC
Priority to CN201710883195.2A priority Critical patent/CN107729925B/zh
Publication of CN107729925A publication Critical patent/CN107729925A/zh
Application granted granted Critical
Publication of CN107729925B publication Critical patent/CN107729925B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • 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
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3692Test management for test results analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/21Design or setup of recognition systems or techniques; Extraction of features in feature space; Blind source separation
    • G06F18/217Validation; Performance evaluation; Active pattern learning techniques
    • G06F18/2193Validation; Performance evaluation; Active pattern learning techniques based on specific statistical tests
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/23Clustering techniques
    • G06F18/232Non-hierarchical techniques

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Artificial Intelligence (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Evolutionary Biology (AREA)
  • Evolutionary Computation (AREA)
  • Quality & Reliability (AREA)
  • Computer Hardware Design (AREA)
  • Probability & Statistics with Applications (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,包括:对数据库中针对问题P的各程序在抽象语法树上做程序变换,获得标准化后的程序;从标准化后的程序或程序片段中提取特征,获得所有的特征集合;基于提取的所有的特征集合进行多实例多分类学习,获得分类模型;利用分类模型对新输入的针对问题P的各程序进行自动分类,并进行评分。该方法可以根据程序源代码按照解题方法准确的实现分类与评分。

Description

对程序竞赛型源代码按照解题方法做自动分类与评分的方法
技术领域
本发明涉及计算机应用技术领域,尤其涉及一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法。
背景技术
目前主要有如下两种方式实现程序解题方法的分类与评分:
现有技术一:将程序源代码代入多组测试数据运行,按照通过的测试点数据数目给程序做评分。不足之处在于死板、机械地按照程序源代码通过的测试点数据数目给程序做评分会导致评分的不公平,比如通过测试数据少的源代码有可能非常接近正确的程序,只是存在一些小错误。
现有技术二:使用机器学习方法做程序评分:特征从程序的抽象语法树、控制流图、数据依赖图中提取,程序由好到差被分为五个等级。不足之处在于无法对多解法的程序进行评分。
现有技术三:使用无监督学习方法对语义相似的程序做聚类。不足之处在于这种分类的粒度过细,是语言层次上的分类,而不是算法层次上的,相同的解法不同的实现也会被分到不同的类别。
发明内容
本发明的目的是提供一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,可以根据程序源代码按照解题方法准确的实现分类与评分。
本发明的目的是通过以下技术方案实现的:
一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,包括:
对数据库中针对问题P的各程序在抽象语法树上做程序变换,获得标准化后的程序;
从标准化后的程序或程序片段中提取特征,获得所有的特征集合;
基于提取的所有的特征集合进行多实例多分类学习,获得分类模型;
利用分类模型对新输入的针对问题P的各程序进行自动分类,并进行评分。
由上述本发明提供的技术方案可以看出,使用多实例学习技术可以对程序源代码按照解题方法准确的进行准确的分类,在此基础上,可以对多解法题目的程序做自动评分,可以避免几乎完整地按照某种解法写出的程序,不会因为一点小错误而得低分,从而提高评分的准确性。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
图1为本发明实施例提供的对程序竞赛型源代码按照解题方法做自动分类与评分的方法框架图;
图2为本发明实施例提供的为运算符’*’和’+’在语法树上的一次出现的示意图;
图3为本发明实施例提供的为运算符’*’和’+’在数据依赖图上的一次出现的示意图;
图4为本发明实施例提供的五道题目的混淆矩阵。
具体实施方式
下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。
本发明实施例提供一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,整个方法的框架图如图1所示,其主要包括如下几个步骤:
步骤1、对数据库中针对问题P的各程序在抽象语法树上做程序变换,获得标准化后的程序。
本发明实施例中,程序变换的目的是在确保语义不变的前提下减少语法的差异性。在做变换之前,给主体部分只有一条语句的if/switch/for/while/do-while语句添加一对大括号“{}”。
示例性的,对for语句添加大括号的情况如下所示:
for(表达式1;表达式2;表达式3)语句1
→for(表达式1;表达式2;表达式3){语句1}
本领域技术人员可以理解,上述示例中的符号“→”表示处理(或者变换)结果,后文类似。
本发明实施例的程序变换主要包括六个方面:控制语句变换、运算顺序敏感的运算符的变换、有副作用的运算符的变换、算术表达式的变换、逻辑表达式的变换和其他表达式的变换;其中:
1)控制语句变换:C语言中控制语句包含if语句、switch语句、for语句、while语句和do-while语句;将switch语句转化为if语句,将for语句和do-while语句转化为while语句。即共有三种变换规则,下面给出两种变换示例:
示例1:
for(表达式1;表达式2;表达式3){...}
→表达式1;while(表达式2){...表达式3;}
示例2:
do{...}while(表达式);
→while(true){...if(!表达式)break;}
2)运算顺序敏感的运算符的变换:C语言中,规定运算顺序的运算有:“&&”、“||”、“?:”和“,”。“&&”与“||”运算符是逻辑运算符,后文介绍逻辑表达式的变换时也会提到。对运算顺序敏感的运算符做变换的主要思想是引入临时变量,将一条语句分割成运算顺序不敏感的多条语句。
变换规则一共有三条,同样给出两条变换示例:
示例1:
...表达式0,表达式1...;
→...表达式0;临时变量1=表达式1;临时变量1...;
示例2:
...表达式0?表达式1:表达式2...;
→if(表达式0){临时变量1=表达式1;}
else{临时变量1=表达式2;}...临时变量1...;
3)有副作用的运算符的变换:C语言中有副作用的运算符有:“++(前缀)”、“–-(前缀)”、“++(后缀)”、“–-(后缀)”、“=”、“+=”、“-=”、“*=”、“/=”、“%=”、“<<=”、“>>=”、“&=”、“^=”和“|=”。变换的目标是将所有副作用的运算符统一为“=”运算符,且每条语句最多只有一个赋值运算符。
这种变换的变换规则共有22条,同样给出两条变换示例:
示例1:
while(...++左值表达式...){...}
→左值表达式+=1;
示例2:
左值+=表达式;
→左值=左值+表达式;
4)算术表达式的变换:算术表达式是含有以下运算符的表达式:“+(双目)”、“-(双目)”、“*”、“/”、“%”、“+(单目)”和“-(单目)”。按照下面的思路做变换:先用分配率展开表达式,然后消去单目的“+”(即“+(单目)”)运算符,并将双目的“-”(即“+(双目)”)运算符转化为单目的“-”(即“-(单目)”)运算符和双目的“+”(即“+(双目)”)运算符,最后将单目的“-”运算符上移,即将负号往语法树根部移动。
使用的变换规则共有九条,下面给出六条变换示例:
示例1:+表达式→表达式
示例2:表达式1-表达式2→表达式1+(-表达式2)
示例3:(-表达式1)+(-表达式2)→-(表达式1+表达式2)
示例4:(-表达式1)*(-表达式2)→表达式1*表达式2
示例5:(-表达式1*表达式2)→-(表达式1*表达式2)
示例6:--表达式→表达式
5)逻辑表达式的变换:由于C语言的逻辑运算符中的被运算数的值对运算有影响,因此大量逻辑运算定律规则无法使用,常见的只有双重否定律和德·摩根律可以使用,因此他们成了在变换过程中使用的规则。
下面给出三条变换规则示例:
示例1(双重否定律):!!表达式1→表达式1
示例2(德·摩根律1):
!(表达式1&&表达式2)→(!表达式1||!表达式2)
示例3(德·摩根律2):
!(表达式1||表达式2)→(!表达式1&&!表达式2)
6)其他表达式的变换。
包括:分别为对数组表达式的标准化,对结构体成员运算符的标准化和两条对关系表达式的标准化。
有如下四条变换规则应用于程序标准化:
示例1:左值[表达式]→*(左值+表达式)
示例2:a->b→*(a).b
示例3:(表达式1>=表达式2)→!(表达式1<表达式2)
示例4:(表达式1<=表达式2)→!(表达式1>表达式2)
步骤2、从标准化后的程序或程序片段中提取特征,获得所有的特征集合。
在这一步骤中,将从标准化后的程序或程序片段中提取特征。将提取的特征分为四类:简单特征、语法树特征、数据依赖图特征和控制语句特征。在介绍之前,先形式化定义一些变量,这可以为后面形式化介绍特征提供便利。
记保留字集合为:
Figure GDA0002321874700000051
记运算符集合为:
Figure GDA0002321874700000052
记程序中的变量集合为:
Figure GDA0002321874700000053
程序中出现的常数集合记为CONST;语法树节点集合记为:NODEAST,语法树节点nodeAST∈NODEAST定义为如下形式的四元组:
Figure GDA0002321874700000054
其中,TYPE∈{KW,OP,VAR,CONST}代表节点的类型,value∈TYPE代表节点的具体取值;nson∈N代表子节点的个数,N为自然数集合,nson元组
Figure GDA0002321874700000055
代表nson个子节点,将语法树节点的定义简化为:
Figure GDA0002321874700000056
数据依赖图节点集合记为NODEDDG,数据依赖图节点nodeDDG∈NODEDDG定义为如下形式的六元组:
Figure GDA0002321874700000057
其中,op∈OP是运算符,
Figure GDA0002321874700000058
是操作数,nvalue是运算符op的操作数,lvalue∈VAR是存储运算结果的变量;
Figure GDA0002321874700000059
这里l为任意的1到nnext之间任意的整数,nodeDDG被一条有向边关联,并且nodeDDG是头节点,nextl是尾节点,将数据依赖图节点的定义简化为:
Figure GDA0002321874700000061
提取各特征方法(主要是提取特征的次数)如下:
a、提取简单特征:简单特征包括不同保留字和运算符在程序或者程序片段中出现的次数;比如,运算符“+”在程序中出现的次数。
保留字kwo程序或者程序片段中出现的次数由下式定义:
Figure GDA0002321874700000062
其中,函数1{x}(x为逻辑表达式)的取值范围为{0,1};符号“.”是一个二元运算符,第一个被操作成员是一个多元组,第二个被操作成员是该多元组中的某一项,运算结果是该多元组中该项的值;
运算符opt在程序中出现的次数由下式定义,其中t为任意的1到nop之间任意的整数:
Figure GDA0002321874700000063
为:
Figure GDA0002321874700000064
和:
Figure GDA0002321874700000065
上述两式中t均表示为任意的1到nop之间任意的整数,共有67个简单特征,包含所提取的简单特征的集合记为XSimple
b、提取语法树特征:语法树特征包括不同运算符对(二元组)出现在语法树同一条边的两个节点上的数目,定义为:
Figure GDA0002321874700000066
上述两式中t和s均表示为任意的1到nop之间任意的整数,node0和node1为某两个语法树上的节点。共有441个语法树特征,包含所提取的语法树特征的集合记为XAST
如图2所示,为运算符’*’和’+’在语法树上的一次出现的示意图。
c、提取数据依赖图特征:数据依赖图特征包括不同运算符对(二元组)出现在数据依赖图同一条边的两个节点上的数目,定义为:
Figure GDA0002321874700000071
上述两式中t和s均表示为任意的1到nop之间任意的整数,l为1到nnext之间任意的整数共有441个数据依赖图特征,包含所提取的数据依赖图特征的集合记为XDDG
如图3所示,为运算符’*’和’+’在数据依赖图上的一次出现的示意图。
d、提取控制语句特征:
1)不同的控制结构和控制结构组合在程序中出现的次数,其中控制结构组合while-if出现的次数:
Figure GDA0002321874700000072
其中,f为1到node0节点的深度之间的任意值;
2)不同保留字和运算符在控制语句的条件表达式中出现的次数;
共有25个控制语句特征,包含所提取的控制语句特征的集合记为XControl
则提取的所有的特征集合Xall为:
Xall=Xsimple∪XAST∪XDDG∪XControl
后续模型中使用的947维特征向量x按固定顺序包含了集合Xall的所有元素。
步骤3、基于提取的所有的特征集合进行多实例多分类学习,获得分类模型。
在多实例多分类学习中,训练集中的元素被称为包裹,一个包裹包含多个被称为实例的特征向量;特征向量按照固定顺序包含了提取的所有的特征集合Xall中的所有元素;一个包裹被标记为正类当且仅当它包含至少一个正类实例,其余情况皆被标记为负类,目标是对未做标号的包裹做分类(正类或负类);
将程序的源代码看成包裹,将程序的每一块看成实例,使用某个确定的解题方法的程序被标为正类;程序块是按照大括号来划分的,在同一个大括号中的程序段被分为一块;
再介绍模型之前,先针对模型中所涉及的数学符号进行介绍,假设问题(题目)P∈P,其中P为编程题目集合。在训练集中,问题P共有NP份源代码,有mP种解法,第i种解法的源代码的数目为
Figure GDA0002321874700000081
Figure GDA0002321874700000082
用符号Progij表示第i种解法的第j个程序,1≤i≤mP;CP(Progij)和
Figure GDA0002321874700000083
分别表示程序Progij的真实类别和预测类别,程序
Figure GDA0002321874700000084
的块数为
Figure GDA0002321874700000085
程序
Figure GDA0002321874700000086
的第k块的特征向量为
Figure GDA0002321874700000087
程序
Figure GDA0002321874700000088
所有块的特征向量组成的集合即为一个包裹,表示为:
Figure GDA0002321874700000089
Figure GDA00023218747000000810
将问题P的解题方法i0的分类器记为
Figure GDA00023218747000000811
定义用于分类器
Figure GDA00023218747000000812
的标签
Figure GDA00023218747000000813
含义如下:
Figure GDA00023218747000000814
并且,定义用于分类器
Figure GDA00023218747000000815
训练的程序Prog′ij的第k个部分的标签为
Figure GDA00023218747000000816
但是,这个标签在训练开始之前是不确定的。
采用多实例支持向量机模型来做分类,在单实例支持向量机模型中,我们的目标是寻找一个使正例点和负例点分得最开(最大间隔)的超平面。而在多实例支持向量机模型中,实例的类别是未知的,只有包裹的类别已知。所以最大间隔不仅依赖于超平面,还依赖于实例的标签。具体到本发明实施例中,需要优化下列表达式:
Figure GDA00023218747000000817
Figure GDA00023218747000000818
Figure GDA00023218747000000819
式中,
Figure GDA00023218747000000820
是松弛变量集合,
Figure GDA00023218747000000821
为单个变量,假设x′P是待预测的程序的特征向量,φ(x′P)是使用原始空间到特征空间的映射后的特征向量,
Figure GDA00023218747000000822
也就是将函数φ作用于特征向量
Figure GDA00023218747000000823
上;假设超平面每个维度的斜率
Figure GDA00023218747000000824
和截距
Figure GDA00023218747000000825
固定,那么φ(x′P)到超平面的距离用下式计算:
Figure GDA00023218747000000826
上式中,
Figure GDA00023218747000000827
为参数
Figure GDA00023218747000000828
的转置,
Figure GDA00023218747000000829
为支持向量系数,核函数κ(·,·)=φ(·)φ(·)取高斯核函数。
在特征集合与标签集合上训练多实例支持向量机模型,训练之后,得到了最终的
Figure GDA0002321874700000091
Figure GDA0002321874700000092
这些参数决定了函数
Figure GDA0002321874700000093
上述训练过程可以通过常规方式实现,简述如下:1、实例的标签的初始化为实例所在包裹的标签;2、使用目前的实例的标签训练一个支持向量机分类器;3、更新包裹的标签,更新后如果包裹标签无变化则结束,否则转到第2步。
步骤4、利用分类模型对新输入的针对问题P的各程序进行自动分类,并进行评分。
在训练完成之后,就可以进行分类预测工作。当然,对于对新输入的针对问题P的各程序也需要进行步骤1~步骤2的标准化与特征提取操作。
假设某一新输入的针对问题P的程序为Prog′P,实例数目为L,则程序Prog′P的实例集是B′={x′h:1≤h≤H},则结合Prog′P、B′={x′h:1≤h≤H}以及函数
Figure GDA0002321874700000094
进行计算,从而输出分类预测结果
Figure GDA0002321874700000095
举例来说:现有技术二提出了使用无监督方法对单解法问题的程序做自动评分的方法。对于多解法程序,我们在对程序分类之后,对每一类分别使用现有技术二中提出的方法做评分。具体地,对问题P的一个新的程序
Figure GDA0002321874700000096
被分到的类别为:
Figure GDA0002321874700000097
记这个程序在该类别内的得分为:
Figure GDA0002321874700000098
Figure GDA0002321874700000099
对应现有技术二中五档。另外,我们记算法的得分(优劣)为SMS,类别C的SMS记作
Figure GDA00023218747000000910
SMS由专家来给出。最终,程序
Figure GDA00023218747000000911
的得分
Figure GDA00023218747000000912
为:
Figure GDA00023218747000000913
这里所提到的基于分类预测结果进行评分只是其中一种应用,还可以自动给学生推荐相似且正确的程序,也可以筛选新型解法来辅助老师教学。具体来说:所述问题P为多解法题目,对新输入的针对问题P的各程序进行自动分类后,如果相应的分类结果表示对应程序源代码错误,则推荐与对应程序源代码解法相同,内容最接近的正确程序源代码;或者,多实例多分类的学习结果包含mP个分类器,如果所有的分类器都把某个程序源代码分到负类,则向老师发出消息,提示相关程序源代码为问题P的新型解法。
以自动给学生推荐相似且正确的程序为例:
如果一个程序被系统判定为错误的,且学生向系统提出需求,系统将会给学生推荐一个和他解法相同,内容与他最接近的正确程序。具体地,假设一个学生提交了针对问题P的错误程序
Figure GDA0002321874700000101
系统分的类别为
Figure GDA0002321874700000102
程序“包裹”中的正例特征向量为:
Figure GDA0002321874700000103
则被推荐的程序
Figure GDA0002321874700000104
为:
Figure GDA0002321874700000105
上式中,
Figure GDA0002321874700000106
本发明实施例提供的上述方案将程序按照解题方法自动分类的方法属于首次提出,结合相关应用,主要具有如何优点:
1、对多解法题目的程序做自动评分的优点。自动评分使用现有技术一将程序源代码代入多组测试数据运行也能完成,但这样程序做评分会导致评分的不公平,比如通过测试数据少的源代码有可能非常接近正确的程序,只是存在一些小错误。使用本技术对多解法题目的程序做自动评分则克服了这一缺点,使得几乎完整地按照某种解法写出程序的学生,不会因为一点小错误而得低分。
2、推荐与学生解法相同的语义最接近他的正确程序的优点。学生特别是刚入门的学生在使用自动评测系统做题常常在一道题目上卡了很久而束手无策,而老师、助教的资源有限,不可能做到随时随地提供服务,因此自动给学生推荐与学生解法相同的语义最接近他的正确程序可以帮助学生提高学习效率。
3、自动将使用新型解法解题的程序推荐给教师的优点。了解学生使用的解题方法对教师改进教学工作意义重大,但教师精力有限,不可能逐个阅读所有学生的程序。因此自动将使用常规解法的程序过滤掉,帮助教师筛选出新颖解法的程序很有必要,教师可以因此获得更高的工作效率。
为了便于理解,下面针对本发明的自动分类过程做举例说明。
本示例中,假设训练集中如下问题:求1~N这N个数的和,学生提交了如下程序:
Figure GDA0002321874700000107
Figure GDA0002321874700000111
经过步骤1做程序变换后,得到如下程序,实际上的程序变换是作用在语法树上的,本示例中为方便阅读又将语法树重新转化为程序。
Figure GDA0002321874700000112
然后基于步骤2,对变换之后的程序提取特征,特征数量太多,无法一一列举,仅举以下两例,以下特征都是把整个程序看成一个程序块所提取的:
例1:程序中含有关键字while的数目:
Figure GDA0002321874700000113
例2:运算符对(赋值-加法)出现在语法树同一条边的两个节点上的数目:
Figure GDA0002321874700000114
用一个程序无法对第三步进行举例,用以下五道题目及学生针对这五道题目做的共2267份源代码做说明。其中,第一道题目509份源代码,第二道452份,第三道356份,第四道336份,第五道614分。五道题目的具体描述如表1:
Figure GDA0002321874700000121
表1五道用于测试的题目大致描述
使用发明实施例提供的方案做分类的结果如图4所示,其中的混淆矩阵指的是做五折交叉验证后将每一折的混淆矩阵相加的结果。准确率、召回率、F1值均在该混淆矩阵下计算。最终分类预测结果如表2所示。
Figure GDA0002321874700000131
表2五道用于测试的题目的预测结果
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例可以通过软件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,上述实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。

Claims (6)

1.一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,包括:
对数据库中针对问题P的各程序在抽象语法树上做程序变换,获得标准化后的程序;
从标准化后的程序或程序片段中提取特征,获得所有的特征集合;
基于提取的所有的特征集合进行多实例多分类学习,获得分类模型;
利用分类模型对新输入的针对问题P的各程序进行自动分类,并进行评分;
其中,所述对数据库中针对问题P的各程序在抽象语法树上做程序变换包括:控制语句变换、运算顺序敏感的运算符的变换、有副作用的运算符的变换、算术表达式的变换和逻辑表达式的变换;其中:
控制语句变换:C语言中控制语句包含if语句、switch语句、for语句、while语句和do-while语句;将switch语句转化为if语句,将for语句和do-while语句转化为while语句;
运算顺序敏感的运算符的变换:C语言中,规定运算顺序的运算有:“&&”、“||”、“?:”和“,”,引入临时变量,将一条语句分割成运算顺序不敏感的多条语句;
有副作用的运算符的变换:将所有副作用的运算符统一为“=”运算符,且每条语句最多只有一个赋值运算符;
算术表达式的变换:先用分配律展开表达式,然后消去单目的“+”运算符,并将双目的“-”运算符转化为单目的“-”运算符和双目的“+”运算符,最后将单目的“-”运算符上移,即将负号往语法树根部移动;
逻辑表达式的变换:将逻辑运算定律规则变换为双重否定律或者德·摩根律。
2.根据权利要求1所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,在做程序变换之前,给主体部分只有一条语句的if、switch、for、while以及do-while语句添加一对大括号。
3.根据权利要求1所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,所提取的特征分为四类:简单特征、语法树特征、数据依赖图特征和控制语句特征;
记保留字集合为:
Figure FDA0002321874690000011
记运算符集合为:
Figure FDA0002321874690000012
记程序中的变量集合为:
Figure FDA0002321874690000021
程序中出现的常数集合记为CONST;语法树节点集合记为:NODEAST,语法树节点nodeAST∈NODEAST定义为如下形式的四元组:
Figure FDA0002321874690000022
其中,TYPE∈{KW,OP,VAR,CONST}代表节点的类型,value∈TYPE代表节点的具体取值;nson∈N代表子节点的个数,N为自然数集合,nson元组
Figure FDA0002321874690000023
代表nson个子节点,将语法树节点的定义简化为:
Figure FDA0002321874690000024
数据依赖图节点集合记为NODEDDG,数据依赖图节点nodeDDG∈NODEDDG定义为如下形式的六元组:
Figure FDA0002321874690000025
其中,op∈OP是运算符,
Figure FDA0002321874690000026
是操作数,nvalue是运算符op的操作数,lvalue∈VAR是存储运算结果的变量;
Figure FDA0002321874690000027
nodeDDG被一条有向边关联,并且nodeDDG是头节点,nextl是尾节点,将数据依赖图节点的定义简化为:
Figure FDA0002321874690000028
提取各特征方法如下:
a、提取简单特征:简单特征包括不同保留字和运算符在程序或者程序片段中出现的次数;
保留字kwo在程序或者程序片段中出现的次数由下式定义:
Figure FDA0002321874690000029
其中,函数1{x}的取值范围为{0,1},符号.是一个二元运算符;
运算符opt在程序中出现的次数由下式定义:
Figure FDA00023218746900000210
将运算数全为变量的运算符出现的数目和存在常量运算数的运算符出现的数目分开统计,分别定义为:
Figure FDA0002321874690000031
和:
Figure FDA0002321874690000032
包含所提取的简单特征的集合记为XSimple
b、提取语法树特征:语法树特征包括不同运算符对出现在语法树同一条边的两个节点上的数目,定义为:
Figure FDA0002321874690000033
其中,node0和node1为某两个语法树上的节点;
包含所提取的语法树特征的集合记为XAST
c、提取数据依赖图特征:数据依赖图特征包括不同运算符对出现在数据依赖图同一条边的两个节点上的数目,定义为:
Figure FDA0002321874690000034
包含所提取的数据依赖图特征的集合记为XDDG
d、提取控制语句特征:
1)不同的控制结构和控制结构组合在程序中出现的次数,其中控制结构组合while-if出现的次数:
Figure FDA0002321874690000035
其中,f为1到node0节点的深度之间的任意值;
2)不同保留字和运算符在控制语句的条件表达式中出现的次数;
包含所提取的控制语句特征的集合记为XControl
则提取的所有的特征集合Xall为:
Xall=Xsimple∪XAST∪XDDG∪XControl
4.根据权利要求1所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,所述基于提取的所有的特征集合进行多实例多分类学习,获得分类模型包括:
在多实例多分类学习中,训练集中的元素被称为包裹,一个包裹包含多个被称为实例的特征向量;特征向量按照固定顺序包含了提取的所有的特征集合Xall中的所有元素;一个包裹被标记为正类当且仅当它包含至少一个正类实例,其余情况皆被标记为负类,目标是对未做标号的包裹做分类;
将程序的源代码看成包裹,将程序的每一块看成实例,使用某个确定的解题方法的程序被标为正类;程序块是按照大括号来划分的,在同一个大括号中的程序段被分为一块;
假设问题P有mP种解法,则用符号Progij表示第i种解法的第j个程序,1≤i≤mP;CP(Progij)和
Figure FDA0002321874690000041
分别表示程序Progij的真实类别和预测类别,程序Progij的块数为
Figure FDA0002321874690000042
程序Progij的第k块的特征向量为
Figure FDA0002321874690000043
程序Progij所有块的特征向量组成的集合即为一个包裹,表示为:
Figure FDA0002321874690000044
1≤i≤mP,
Figure FDA0002321874690000045
将问题P的解题方法i0的分类器记为
Figure FDA0002321874690000046
定义用于分类器
Figure FDA0002321874690000047
的标签
Figure FDA0002321874690000048
含义如下:
Figure FDA0002321874690000049
并且,定义用于分类器
Figure FDA00023218746900000410
训练的程序Prog′ij的第k个部分的标签为
Figure FDA00023218746900000411
采用多实例支持向量机模型来做分类,表示为:
Figure FDA00023218746900000412
Figure FDA00023218746900000413
Figure FDA00023218746900000414
式中,
Figure FDA00023218746900000415
是松弛变量集合,
Figure FDA00023218746900000416
为单个变量,假设x′P是待预测的程序的特征向量,φ(x′P)是使用原始数据空间到特征空间的映射后的特征向量,
Figure FDA00023218746900000417
也就是将函数φ作用于特征向量
Figure FDA00023218746900000418
上;假设超平面每个维度的斜率
Figure FDA00023218746900000419
和截距
Figure FDA00023218746900000420
固定,那么φ(x′P)到超平面的距离用下式计算:
Figure FDA00023218746900000421
上式中,
Figure FDA0002321874690000051
为参数
Figure FDA0002321874690000052
的转置,
Figure FDA0002321874690000053
为支持向量系数,核函数κ(·,·)=φ(·)φ(·)取高斯核函数;
在特征集合与标签集合上训练多实例支持向量机模型,结果分别存储在
Figure FDA0002321874690000054
Figure FDA0002321874690000055
训练之后,得到了最终的
Figure FDA0002321874690000056
Figure FDA0002321874690000057
这些参数决定了函数
Figure FDA0002321874690000058
5.根据权利要求4所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,所述利用分类模型对新输入的针对问题P的各程序进行自动分类包括:
假设某一新输入的针对问题P的程序为Prog′P,实例数目为L,则程序Prog′P的实例集是B′={x′h:1≤h≤L},则结合Prog′P、B′={x′h:1≤h≤L}以及函数
Figure FDA0002321874690000059
进行计算,从而输出分类预测结果
Figure FDA00023218746900000510
6.根据权利要求1所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,
所述问题P为多解法题目,对新输入的针对问题P的各程序进行自动分类后,如果相应的分类结果表示对应程序源代码错误,则推荐与对应程序源代码解法相同,内容最接近的正确程序源代码;或者,多实例多分类的学习结果包含mP个分类器,如果所有的分类器都把某个程序源代码分到负类,则向老师发出消息,提示相关程序源代码为问题P的新型解法。
CN201710883195.2A 2017-09-26 2017-09-26 对程序竞赛型源代码按照解题方法做自动分类与评分的方法 Active CN107729925B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710883195.2A CN107729925B (zh) 2017-09-26 2017-09-26 对程序竞赛型源代码按照解题方法做自动分类与评分的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710883195.2A CN107729925B (zh) 2017-09-26 2017-09-26 对程序竞赛型源代码按照解题方法做自动分类与评分的方法

Publications (2)

Publication Number Publication Date
CN107729925A CN107729925A (zh) 2018-02-23
CN107729925B true CN107729925B (zh) 2020-03-31

Family

ID=61206954

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710883195.2A Active CN107729925B (zh) 2017-09-26 2017-09-26 对程序竞赛型源代码按照解题方法做自动分类与评分的方法

Country Status (1)

Country Link
CN (1) CN107729925B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108389147B (zh) * 2018-02-26 2020-11-03 浙江创课教育科技有限公司 试题难度分级处理方法及系统
CN108830376B (zh) * 2018-06-13 2021-12-14 中国科学技术大学 针对时间敏感的环境的多价值网络深度强化学习方法
CN109491915B (zh) * 2018-11-09 2022-02-08 网易有道信息技术(杭州)有限公司 数据处理方法及装置、介质和计算设备
CN109977205B (zh) * 2019-03-08 2021-06-22 中南大学 一种计算机自主学习源代码的方法
CN110245860B (zh) * 2019-06-13 2022-08-23 桂林电子科技大学 一种基于虚拟实验平台的自动评分的方法
CN110955606B (zh) * 2019-12-16 2023-07-25 湘潭大学 一种基于随机森林的c语言源代码静态评分方法
CN112905186B (zh) * 2021-02-07 2023-04-07 中国科学院软件研究所 适用于开源软件供应链的高信噪比代码分类方法及装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102023921A (zh) * 2010-12-17 2011-04-20 江苏大学 Sql程序自动评分方法及装置
CN103886780A (zh) * 2013-11-26 2014-06-25 天津思博科科技发展有限公司 一种c语言程序题自动评分系统
CN106021410A (zh) * 2016-05-12 2016-10-12 中国科学院软件研究所 一种基于机器学习的源代码注释质量评估方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102023921A (zh) * 2010-12-17 2011-04-20 江苏大学 Sql程序自动评分方法及装置
CN103886780A (zh) * 2013-11-26 2014-06-25 天津思博科科技发展有限公司 一种c语言程序题自动评分系统
CN106021410A (zh) * 2016-05-12 2016-10-12 中国科学院软件研究所 一种基于机器学习的源代码注释质量评估方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于程序理解的编程题自动评分方法;马培军等;《计算机研究与发展》;20091231;第46卷(第7期);第1136-1141页 *

Also Published As

Publication number Publication date
CN107729925A (zh) 2018-02-23

Similar Documents

Publication Publication Date Title
CN107729925B (zh) 对程序竞赛型源代码按照解题方法做自动分类与评分的方法
US7685082B1 (en) System and method for identifying, prioritizing and encapsulating errors in accounting data
Terechshenko et al. A comparison of methods in political science text classification: Transfer learning language models for politics
CN110532353B (zh) 基于深度学习的文本实体匹配方法、系统、装置
CN109710744B (zh) 一种数据匹配方法、装置、设备及存储介质
CN108228758A (zh) 一种文本分类方法及装置
Kaur Incorporating sentimental analysis into development of a hybrid classification model: A comprehensive study
Shi et al. Chatgraph: Interpretable text classification by converting chatgpt knowledge to graphs
Zhang et al. Sparse population code models of word learning in concept drift
Lee et al. Use of training, validation, and test sets for developing automated classifiers in quantitative ethnography
CN104933158A (zh) 数学问题求解模型的训练方法和装置、推理方法和装置
CN111222318A (zh) 基于双通道双向lstm-crf网络的触发词识别方法
JP2016170636A (ja) 接続関係推定装置、方法、及びプログラム
Rooshenas et al. Discriminative structure learning of arithmetic circuits
Kathuria et al. AOH-Senti: aspect-oriented hybrid approach to sentiment analysis of students’ feedback
CN112214597B (zh) 基于多粒度建模的半监督文本分类方法和系统
Lin et al. Robust educational dialogue act classifiers with low-resource and imbalanced datasets
Nudelman et al. Using bayesian networks and machine learning to predict computer science success
Alexander et al. Quantum text encoding for classification tasks
Pathuri et al. Feature based sentimental analysis for prediction of mobile reviews using hybrid bag-boost algorithm
CN112446206A (zh) 一种菜谱标题的生成方法及装置
CN110750712A (zh) 基于数据驱动的软件安全需求推荐方法
Bai et al. Gated character-aware convolutional neural network for effective automated essay scoring
Bartička et al. Evaluating attribution methods for explainable nlp with transformers
Moodley Language identification with decision trees: Identification of individual words in the south african languages

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