首页 / 专利库 / 人工智能 / n元语法 / 对程序竞赛型源代码按照解题方法做自动分类与评分的方法

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

阅读:124发布:2020-05-12

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

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所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,所提取的特征分为四类:简单特征、语法树特征、数据依赖图特征和控制语句特征;
记保留字集合为: 记运算符集合为: 记程序中
的变量集合为: 程序中出现的常数集合记为CONST;语法树节点
合记为:NODEAST,语法树节点nodeAST∈NODEAST定义为如下形式的四元组:
其中,TYPE∈{KW,OP,VAR,CONST}代表节点的类型,value∈TYPE代表节点的具体取值;
nson∈N代表子节点的个数,N为自然数集合,nson元组
代表nson个子节点,将语法树节点的定义简化为:
数据依赖图节点集合记为NODEDDG,数据依赖图节点nodeDDG∈NODEDDG定义为如下形式的六元组:
其中,op∈OP是运算符, 是操作数,nvalue是运算符
op的操作数,lvalue∈VAR是存储运算结果的变量; nodeDDG被一条有
向边关联,并且nodeDDG是头节点,nextl是尾节点,将数据依赖图节点的定义简化为:
提取各特征方法如下:
a、提取简单特征:简单特征包括不同保留字和运算符在程序或者程序片段中出现的次数;
保留字kwo在程序或者程序片段中出现的次数由下式定义:
其中,函数1{x}的取值范围为{0,1},符号.是一个二元运算符;
运算符opt在程序中出现的次数由下式定义:
将运算数全为变量的运算符出现的数目和存在常量运算数的运算符出现的数目分开统计,分别定义为:
和:
包含所提取的简单特征的集合记为XSimple;
b、提取语法树特征:语法树特征包括不同运算符对出现在语法树同一条边的两个节点上的数目,定义为:
其中,node0和node1为某两个语法树上的节点;
包含所提取的语法树特征的集合记为XAST;
c、提取数据依赖图特征:数据依赖图特征包括不同运算符对出现在数据依赖图同一条边的两个节点上的数目,定义为:
包含所提取的数据依赖图特征的集合记为XDDG;
d、提取控制语句特征:
1)不同的控制结构和控制结构组合在程序中出现的次数,其中控制结构组合while-if出现的次数:
其中,f为1到node0节点的深度之间的任意值;
2)不同保留字和运算符在控制语句的条件表达式中出现的次数;
包含所提取的控制语句特征的集合记为XControl;
则提取的所有的特征集合Xall为:
Xall=Xsimple∪XAST∪XDDG∪XControl。
4.根据权利要求1所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,所述基于提取的所有的特征集合进行多实例多分类学习,获得分类模型包括:
在多实例多分类学习中,训练集中的元素被称为包裹,一个包裹包含多个被称为实例的特征向量;特征向量按照固定顺序包含了提取的所有的特征集合Xall中的所有元素;一个包裹被标记为正类当且仅当它包含至少一个正类实例,其余情况皆被标记为负类,目标是对未做标号的包裹做分类;
将程序的源代码看成包裹,将程序的每一看成实例,使用某个确定的解题方法的程序被标为正类;程序块是按照大括号来划分的,在同一个大括号中的程序段被分为一块;
假设问题P有mP种解法,则用符号Progij表示第i种解法的第j个程序,1≤i≤mP;CP(Progij)和 分别表示程序Progij的真实类别和预测类别,程序Progij的块数为程序Progij的第k块的特征向量为 程序Progij所有块的特征向量组成的集合即为一个包裹,表示为: 1≤i≤mP,
将问题P的解题方法i0的分类器记为 定义用于分类器 的标签 含义
如下:
并且,定义用于分类器 训练的程序Prog′ij的第k个部分的标签为
采用多实例支持向量机模型来做分类,表示为:
式中, 是松弛变量集合, 为单个变量,假设x′P是待预测的程序的特征向量,φ(x′P)是使用原始数据空间到特征空间的映射后的特征向量, 也就是将函数φ作用于特征向量 上;假设超平面每个维度的斜率 和截距 固定,那么φ(x′P)到超平面的距离用下式计算:
上式中, 为参数 的转置, 为支持向量系数,核函数κ(·,·)=φ(·)φ
(·)取高斯核函数;
在特征集合与标签集合上训练多实例支持向量机模型,结果分别存储在 和
训练之后,得到了最终的 和 这些参数决定了函数
5.根据权利要求4所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,所述利用分类模型对新输入的针对问题P的各程序进行自动分类包括:
假设某一新输入的针对问题P的程序为Prog′P,实例数目为L,则程序Prog′P的实例集是B′={x′h:1≤h≤L},则结合Prog′P、B′={x′h:1≤h≤L}以及函数 进行计算,从而输出分类预测结果
6.根据权利要求1所述的一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,其特征在于,
所述问题P为多解法题目,对新输入的针对问题P的各程序进行自动分类后,如果相应的分类结果表示对应程序源代码错误,则推荐与对应程序源代码解法相同,内容最接近的正确程序源代码;或者,多实例多分类的学习结果包含mP个分类器,如果所有的分类器都把某个程序源代码分到负类,则向老师发出消息,提示相关程序源代码为问题P的新型解法。

说明书全文

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

技术领域

[0001] 本发明涉及计算机应用技术领域,尤其涉及一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法。

背景技术

[0002] 目前主要有如下两种方式实现程序解题方法的分类与评分:
[0003] 现有技术一:将程序源代码代入多组测试数据运行,按照通过的测试点数据数目给程序做评分。不足之处在于死板、机械地按照程序源代码通过的测试点数据数目给程序
做评分会导致评分的不公平,比如通过测试数据少的源代码有可能非常接近正确的程序,
只是存在一些小错误。
[0004] 现有技术二:使用机器学习方法做程序评分:特征从程序的抽象语法树、控制流图、数据依赖图中提取,程序由好到差被分为五个等级。不足之处在于无法对多解法的程序
进行评分。
[0005] 现有技术三:使用监督学习方法对语义相似的程序做聚类。不足之处在于这种分类的粒度过细,是语言层次上的分类,而不是算法层次上的,相同的解法不同的实现也会
被分到不同的类别。

发明内容

[0006] 本发明的目的是提供一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,可以根据程序源代码按照解题方法准确的实现分类与评分。
[0007] 本发明的目的是通过以下技术方案实现的:
[0008] 一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,包括:
[0009] 对数据库中针对问题P的各程序在抽象语法树上做程序变换,获得标准化后的程序;
[0010] 从标准化后的程序或程序片段中提取特征,获得所有的特征集合;
[0011] 基于提取的所有的特征集合进行多实例多分类学习,获得分类模型;
[0012] 利用分类模型对新输入的针对问题P的各程序进行自动分类,并进行评分。
[0013] 由上述本发明提供的技术方案可以看出,使用多实例学习技术可以对程序源代码按照解题方法准确的进行准确的分类,在此基础上,可以对多解法题目的程序做自动评分,
可以避免几乎完整地按照某种解法写出的程序,不会因为一点小错误而得低分,从而提高
评分的准确性。
附图说明
[0014] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本
领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他
附图。
[0015] 图1为本发明实施例提供的对程序竞赛型源代码按照解题方法做自动分类与评分的方法框架图;
[0016] 图2为本发明实施例提供的为运算符’*’和’+’在语法树上的一次出现的示意图;
[0017] 图3为本发明实施例提供的为运算符’*’和’+’在数据依赖图上的一次出现的示意图;
[0018] 图4为本发明实施例提供的五道题目的混淆矩阵。

具体实施方式

[0019] 下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本
发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施
例,都属于本发明的保护范围。
[0020] 本发明实施例提供一种对程序竞赛型源代码按照解题方法做自动分类与评分的方法,整个方法的框架图如图1所示,其主要包括如下几个步骤:
[0021] 步骤1、对数据库中针对问题P的各程序在抽象语法树上做程序变换,获得标准化后的程序。
[0022] 本发明实施例中,程序变换的目的是在确保语义不变的前提下减少语法的差异性。在做变换之前,给主体部分只有一条语句的if/switch/for/while/do-while语句添加
一对大括号“{}”。
[0023] 示例性的,对for语句添加大括号的情况如下所示:
[0024] for(表达式1;表达式2;表达式3)语句1
[0025] →for(表达式1;表达式2;表达式3){语句1}
[0026] 本领域技术人员可以理解,上述示例中的符号“→”表示处理(或者变换)结果,后文类似。
[0027] 本发明实施例的程序变换主要包括六个方面:控制语句变换、运算顺序敏感的运算符的变换、有副作用的运算符的变换、算术表达式的变换、逻辑表达式的变换和其他表达
式的变换;其中:
[0028] 1)控制语句变换:C语言中控制语句包含if语句、switch语句、for语句、while语句和do-while语句;将switch语句转化为if语句,将for语句和do-while语句转化为while语
句。即共有三种变换规则,下面给出两种变换示例:
[0029] 示例1:
[0030] for(表达式1;表达式2;表达式3){...}
[0031] →表达式1;while(表达式2){...表达式3;}
[0032] 示例2:
[0033] do{...}while(表达式);
[0034] →while(true){...if(!表达式)break;}
[0035] 2)运算顺序敏感的运算符的变换:C语言中,规定运算顺序的运算有:“&&”、“||”、“?:”和“,”。“&&”与“||”运算符是逻辑运算符,后文介绍逻辑表达式的变换时也会提到。对运算顺序敏感的运算符做变换的主要思想是引入临时变量,将一条语句分割成运算顺序不
敏感的多条语句。
[0036] 变换规则一共有三条,同样给出两条变换示例:
[0037] 示例1:
[0038] ...表达式0,表达式1...;
[0039] →...表达式0;临时变量1=表达式1;临时变量1...;
[0040] 示例2:
[0041] ...表达式0?表达式1:表达式2...;
[0042] →if(表达式0){临时变量1=表达式1;}
[0043] else{临时变量1=表达式2;}...临时变量1...;
[0044] 3)有副作用的运算符的变换:C语言中有副作用的运算符有:“++(前缀)”、“–-(前缀)”、“++(后缀)”、“–-(后缀)”、“=”、“+=”、“-=”、“*=”、“/=”、“%=”、“<<=”、“>>=”、“&=”、“^=”和“|=”。变换的目标是将所有副作用的运算符统一为“=”运算符,且每条语句最多只有一个赋值运算符。
[0045] 这种变换的变换规则共有22条,同样给出两条变换示例:
[0046] 示例1:
[0047] while(...++左值表达式...){...}
[0048] →左值表达式+=1;
[0049] 示例2:
[0050] 左值+=表达式;
[0051] →左值=左值+表达式;
[0052] 4)算术表达式的变换:算术表达式是含有以下运算符的表达式:“+(双目)”、“-(双目)”、“*”、“/”、“%”、“+(单目)”和“-(单目)”。按照下面的思路做变换:先用分配率展开表达式,然后消去单目的“+”(即“+(单目)”)运算符,并将双目的“-”(即“+(双目)”)运算符转
化为单目的“-”(即“-(单目)”)运算符和双目的“+”(即“+(双目)”)运算符,最后将单目的
“-”运算符上移,即将负号往语法树根部移动。
[0053] 使用的变换规则共有九条,下面给出六条变换示例:
[0054] 示例1:+表达式→表达式
[0055] 示例2:表达式1-表达式2→表达式1+(-表达式2)
[0056] 示例3:(-表达式1)+(-表达式2)→-(表达式1+表达式2)
[0057] 示例4:(-表达式1)*(-表达式2)→表达式1*表达式2
[0058] 示例5:(-表达式1*表达式2)→-(表达式1*表达式2)
[0059] 示例6:--表达式→表达式
[0060] 5)逻辑表达式的变换:由于C语言的逻辑运算符中的被运算数的值对运算有影响,因此大量逻辑运算定律规则无法使用,常见的只有双重否定律和德·摩根律可以使用,因
此他们成了在变换过程中使用的规则。
[0061] 下面给出三条变换规则示例:
[0062] 示例1(双重否定律):!!表达式1→表达式1
[0063] 示例2(德·摩根律1):
[0064] !(表达式1&&表达式2)→(!表达式1||!表达式2)
[0065] 示例3(德·摩根律2):
[0066] !(表达式1||表达式2)→(!表达式1&&!表达式2)
[0067] 6)其他表达式的变换。
[0068] 包括:分别为对数组表达式的标准化,对结构体成员运算符的标准化和两条对关系表达式的标准化。
[0069] 有如下四条变换规则应用于程序标准化:
[0070] 示例1:左值[表达式]→*(左值+表达式)
[0071] 示例2:a->b→*(a).b
[0072] 示例3:(表达式1>=表达式2)→!(表达式1<表达式2)
[0073] 示例4:(表达式1<=表达式2)→!(表达式1>表达式2)
[0074] 步骤2、从标准化后的程序或程序片段中提取特征,获得所有的特征集合。
[0075] 在这一步骤中,将从标准化后的程序或程序片段中提取特征。将提取的特征分为四类:简单特征、语法树特征、数据依赖图特征和控制语句特征。在介绍之前,先形式化定义
一些变量,这可以为后面形式化介绍特征提供便利。
[0076] 记保留字集合为: 记运算符集合为: 记程序中的变量集合为: 程序中出现的常数集合记为CONST;语法树
节点集合记为:NODEAST,语法树节点nodeAST∈NODEAST定义为如下形式的四元组:
[0077]
[0078] 其中,TYPE∈{KW,OP,VAR,CONST}代表节点的类型,value∈TYPE代表节点的具体取值;nson∈N代表子节点的个数,N为自然数集合,nson元组
代表nson个子节点,将语法树节点的定义简化
为:
[0079]
[0080] 数据依赖图节点集合记为NODEDDG,数据依赖图节点nodeDDG∈NODEDDG定义为如下形式的六元组:
[0081]
[0082] 其中,op∈OP是运算符, 是操作数,nvalue是运算符op的操作数,lvalue∈VAR是存储运算结果的变量; 这里l为任意
的1到nnext之间任意的整数,nodeDDG被一条有向边关联,并且nodeDDG是头节点,nextl是尾节
点,将数据依赖图节点的定义简化为:
[0083]
[0084] 提取各特征方法(主要是提取特征的次数)如下:
[0085] a、提取简单特征:简单特征包括不同保留字和运算符在程序或者程序片段中出现的次数;比如,运算符“+”在程序中出现的次数。
[0086] 保留字kwo程序或者程序片段中出现的次数由下式定义:
[0087]
[0088] 其中,函数1{x}(x为逻辑表达式)的取值范围为{0,1};符号“.”是一个二元运算符,第一个被操作成员是一个多元组,第二个被操作成员是该多元组中的某一项,运算结果
是该多元组中该项的值;
[0089] 运算符opt在程序中出现的次数由下式定义,其中t为任意的1到nop之间任意的整数:
[0090]为:
[0091]
[0092] 和:
[0093]
[0094] 上述两式中t均表示为任意的1到nop之间任意的整数,共有67个简单特征,包含所Simple
提取的简单特征的集合记为X ;
[0095] b、提取语法树特征:语法树特征包括不同运算符对(二元组)出现在语法树同一条边的两个节点上的数目,定义为:
[0096]
[0097] 上述两式中t和s均表示为任意的1到nop之间任意的整数,node0和node1为某两个语法树上的节点。共有441个语法树特征,包含所提取的语法树特征的集合记为XAST;
[0098] 如图2所示,为运算符’*’和’+’在语法树上的一次出现的示意图。
[0099] c、提取数据依赖图特征:数据依赖图特征包括不同运算符对(二元组)出现在数据依赖图同一条边的两个节点上的数目,定义为:
[0100]
[0101] 上述两式中t和s均表示为任意的1到nop之间任意的整数,l为1到nnext之间任意的整数共有441个数据依赖图特征,包含所提取的数据依赖图特征的集合记为XDDG;
[0102] 如图3所示,为运算符’*’和’+’在数据依赖图上的一次出现的示意图。
[0103] d、提取控制语句特征:
[0104] 1)不同的控制结构和控制结构组合在程序中出现的次数,其中控制结构组合while-if出现的次数:
[0105]
[0106] 其中,f为1到node0节点的深度之间的任意值;
[0107] 2)不同保留字和运算符在控制语句的条件表达式中出现的次数;
[0108] 共有25个控制语句特征,包含所提取的控制语句特征的集合记为XControl;
[0109] 则提取的所有的特征集合Xall为:
[0110] Xall=Xsimple∪XAST∪XDDG∪XControl。
[0111] 后续模型中使用的947维特征向量x按固定顺序包含了集合Xall的所有元素。
[0112] 步骤3、基于提取的所有的特征集合进行多实例多分类学习,获得分类模型。
[0113] 在多实例多分类学习中,训练集中的元素被称为包裹,一个包裹包含多个被称为实例的特征向量;特征向量按照固定顺序包含了提取的所有的特征集合Xall中的所有元素;
一个包裹被标记为正类当且仅当它包含至少一个正类实例,其余情况皆被标记为负类,目
标是对未做标号的包裹做分类(正类或负类);
[0114] 将程序的源代码看成包裹,将程序的每一看成实例,使用某个确定的解题方法的程序被标为正类;程序块是按照大括号来划分的,在同一个大括号中的程序段被分为一
块;
[0115] 再介绍模型之前,先针对模型中所涉及的数学符号进行介绍,假设问题(题目)P∈P P
P,其中P为编程题目集合。在训练集中,问题P共有N 份源代码,有m种解法,第i种解法的源
代码的数目为 用符号Progij表示第i种解法的第j个程序,1≤i≤mP;
CP(Progij)和 分别表示程序Progij的真实类别和预测类别,程序 的块数为
程序 的第k块的特征向量为 程序 所有块的特征向量组成的集合即为一
个包裹,表示为:
[0116] 将问题P的解题方法i0的分类器记为 定义用于分类器 的标签含义如下:
[0117]
[0118] 并且,定义用于分类器 训练的程序Prog′ij的第k个部分的标签为 但是,这个标签在训练开始之前是不确定的。
[0119] 采用多实例支持向量机模型来做分类,在单实例支持向量机模型中,我们的目标是寻找一个使正例点和负例点分得最开(最大间隔)的超平面。而在多实例支持向量机模型
中,实例的类别是未知的,只有包裹的类别已知。所以最大间隔不仅依赖于超平面,还依赖
于实例的标签。具体到本发明实施例中,需要优化下列表达式:
[0120]
[0121]
[0122]
[0123] 式中, 是松弛变量集合, 为单个变量,假设x′P是待预测的程序的特征向量,φ(x′P)是使用原始空间到特征空间的映射后的特征向量, 也就是将函数φ作用
于特征向量 上;假设超平面每个维度的斜率 和截距 固定,那么φ(x′P)到超平面
的距离用下式计算:
[0124]
[0125] 上式中, 为参数 的转置, 为支持向量系数,核函数κ(·,·)=φ(·)φ(·)取高斯核函数。
[0126] 在特征集合与标签集合上训练多实例支持向量机模型,训练之后,得到了最终的和 这些参数决定了函数
[0127] 上述训练过程可以通过常规方式实现,简述如下:1、实例的标签的初始化为实例所在包裹的标签;2、使用目前的实例的标签训练一个支持向量机分类器;3、更新包裹的标
签,更新后如果包裹标签无变化则结束,否则转到第2步。
[0128] 步骤4、利用分类模型对新输入的针对问题P的各程序进行自动分类,并进行评分。
[0129] 在训练完成之后,就可以进行分类预测工作。当然,对于对新输入的针对问题P的各程序也需要进行步骤1~步骤2的标准化与特征提取操作。
[0130] 假设某一新输入的针对问题P的程序为Prog′P,实例数目为L,则程序Prog′P的实例集是B′={x′h:1≤h≤H},则结合Prog′P、B′={x′h:1≤h≤H}以及函数 进行计算,从
而输出分类预测结果
[0131] 举例来说:现有技术二提出了使用无监督方法对单解法问题的程序做自动评分的方法。对于多解法程序,我们在对程序分类之后,对每一类分别使用现有技术二中提出的方
法做评分。具体地,对问题P的一个新的程序 被分到的类别为: 记这
个程序在该类别内的得分为: 对应
现有技术二中五档。另外,我们记算法的得分(优劣)为SMS,类别C的SMS记作 SMS由专
家来给出。最终,程序 的得分 为:
[0132]
[0133] 这里所提到的基于分类预测结果进行评分只是其中一种应用,还可以自动给学生推荐相似且正确的程序,也可以筛选新型解法来辅助老师教学。具体来说:所述问题P为多
解法题目,对新输入的针对问题P的各程序进行自动分类后,如果相应的分类结果表示对应
程序源代码错误,则推荐与对应程序源代码解法相同,内容最接近的正确程序源代码;或
者,多实例多分类的学习结果包含mP个分类器,如果所有的分类器都把某个程序源代码分
到负类,则向老师发出消息,提示相关程序源代码为问题P的新型解法。
[0134] 以自动给学生推荐相似且正确的程序为例:
[0135] 如果一个程序被系统判定为错误的,且学生向系统提出需求,系统将会给学生推荐一个和他解法相同,内容与他最接近的正确程序。具体地,假设一个学生提交了针对问题
P的错误程序 系统分的类别为 程序“包裹”中的正例特征向量为:
则被推荐的程序 为:
[0136]
[0137] 上式中,
[0138] 本发明实施例提供的上述方案将程序按照解题方法自动分类的方法属于首次提出,结合相关应用,主要具有如何优点:
[0139] 1、对多解法题目的程序做自动评分的优点。自动评分使用现有技术一将程序源代码代入多组测试数据运行也能完成,但这样程序做评分会导致评分的不公平,比如通过测
试数据少的源代码有可能非常接近正确的程序,只是存在一些小错误。使用本技术对多解
法题目的程序做自动评分则克服了这一缺点,使得几乎完整地按照某种解法写出程序的学
生,不会因为一点小错误而得低分。
[0140] 2、推荐与学生解法相同的语义最接近他的正确程序的优点。学生特别是刚入的学生在使用自动评测系统做题常常在一道题目上卡了很久而束手无策,而老师、助教的资
源有限,不可能做到随时随地提供服务,因此自动给学生推荐与学生解法相同的语义最接
近他的正确程序可以帮助学生提高学习效率。
[0141] 3、自动将使用新型解法解题的程序推荐给教师的优点。了解学生使用的解题方法对教师改进教学工作意义重大,但教师精有限,不可能逐个阅读所有学生的程序。因此自
动将使用常规解法的程序过滤掉,帮助教师筛选出新颖解法的程序很有必要,教师可以因
此获得更高的工作效率。
[0142] 为了便于理解,下面针对本发明的自动分类过程做举例说明。
[0143] 本示例中,假设训练集中如下问题:求1~N这N个数的和,学生提交了如下程序:
[0144]
[0145]
[0146] 经过步骤1做程序变换后,得到如下程序,实际上的程序变换是作用在语法树上的,本示例中为方便阅读又将语法树重新转化为程序。
[0147]
[0148] 然后基于步骤2,对变换之后的程序提取特征,特征数量太多,无法一一列举,仅举以下两例,以下特征都是把整个程序看成一个程序块所提取的:
[0149] 例1:程序中含有关键字while的数目:
[0150]
[0151] 例2:运算符对(赋值-加法)出现在语法树同一条边的两个节点上的数目:
[0152]
[0153] 用一个程序无法对第三步进行举例,用以下五道题目及学生针对这五道题目做的共2267份源代码做说明。其中,第一道题目509份源代码,第二道452份,第三道356份,第四
道336份,第五道614分。五道题目的具体描述如表1:
[0154]
[0155] 表1五道用于测试的题目大致描述
[0156] 使用发明实施例提供的方案做分类的结果如图4所示,其中的混淆矩阵指的是做五折交叉验证后将每一折的混淆矩阵相加的结果。准确率、召回率、F1值均在该混淆矩阵下
计算。最终分类预测结果如表2所示。
[0157]
[0158] 表2五道用于测试的题目的预测结果
[0159] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例可以通过软件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,
上述实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易
失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设
备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0160] 以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,
都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范
围为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈