技术领域
[0001] 本
发明涉及程序题自动评分的技术领域,尤其是指一种基于机器学习的程序题自动评分方法。
背景技术
[0002] 在
计算机程序设计课程教学中,程序题评分是一个复杂、不机械、耗时的过程。随着MOOC等在线学习平台的发展,如何高效、快速、自动给计算机程序设计相关课程中学生提交的作业进行评分和反馈,成为一个备受关注的热点。
[0003] 目前常见的两类评分方式有:1)动态测试:将被批改程序运行起来,能通过编译则采用动态测试,不能通过编译直接返回零分。动态测试过程需要有一组尽可能完备的测试
用例,包含输入测试数据和预期输出结果,向被批改的程序输入测试数据,得到实际输出结果,再用实际输出结果和预期输出结果进行比对,按通过测试用例的百分比返回评分结果。此方法的前提是被批改的程序题能通过编译,没有关心程序的本身。但是对于初学者而言,由于缺乏编程经验,多数的程序题不能通过编译阶段。所以单独使用动态测试对初学者的程序题进行评分,是不合理的。2)静态分析:事先由教学主导者(教师或者助教)提供程序题的参考答案,将参考答案转化为中间表示结构,称为模板程序中间表示。再提取程序源码,将源码转换为中间表示结构,称为被批改程序中间表示结构。最后比较模板程序中间表示结构和被批改程序中间表示结构的相似度,根据相似度返回评分结果。常见的中间表示结构有:程序依赖图、程序抽象语法的XML、抽象语法树、程序控制
流程图、方法调用依赖图等。
比较相似度的方法有:语义相似度、数核相似度
算法、结构度量法、正则表达式、局部语法分析和采分点匹配等。静态分析比动态测试确实有一定的效果,比较了程序本身。但静态测试需要教师或者助教提供程序题参考答案,即模板程序。这增加了教师的工作负担,且模本程序不唯一性对相似度比较结果有一定影响。
发明内容
[0004] 本发明的目的在于克服
现有技术的缺点与不足,提出了一种基于机器学习的程序题自动评分方法,将动态测试和静态分析结合起来,既参考程序题的运行数据,又分析了程序本身。静态分析采用了机器学习方法,无需课程教师提供模板程序,减少教师负担,且能减少模板程序不唯一性,给程序题自动评分结果带来的影响。
[0005] 为实现上述目的,本发明所提供的技术方案为:一种基于机器学习的程序题自动评分方法,包括以下步骤:
[0006] 1)获取学生程序课程作业数据,包括学生作业、作业分数信息;
[0007] 2)对获取到的作业进行数据预处理;
[0008] 3)对程序进行动态测试;
[0009] 4)提取程序特性;
[0010] 5)应用机器学习算法对程序进行静态分析;
[0011] 6)综合动态运行和静态分析结果,返回程序最终评分。
[0012] 在步骤1)中,所述学生作业是指从在线学习平台的程序设计课程中获取的学生作业;所述作业分数信息是指在线学习平台中担任程序课程的教师或者助教给学生提交的作业评判的分数等级。
[0013] 在步骤2)中,对学生提交的程序作业用文本处理技术,除去注释和与程序结构无关的部分。
[0014] 在步骤3)中,将程序题输入动态运行环境,编译运行,通过编译运行的程序采用
黑盒测试,测试该程序通过测试用例的百分比。
[0015] 在步骤4)中,提取的程序特性如下:
[0016] 基本属性:使用词法分析器提取基本属性,包括:①数组个数:统计程序里面定义了多少个数组;②每个数组出现次数:统计程序里面定义的数组使用次数;③自定义变量个数:统计程序里面不重复出现的自定义变量个数;④每个自定义变量出现次数:统计程序里面不重复出现的自定义变量使用次数;⑤关键字个数:统计程序里出现的关键字个数;⑥每个关键字次数:统计程序里出现的关键字使用次数;⑦数值常量个数:统计程序里面出现的数值常量个数;⑧每个数值常量出现次数:统计程序里面出现的数值常量次数;⑨字符常量:统计包含的单个字符和字符串个数;⑩每个字符常量次数:统计程序里面出现的某个字符常量使用次数; 运算符:统计程序出现的运算符个数; 每个运算符出现次数:统计程序出现的运算符使用次数;
[0017] 容量特性:V=Nlog2n;其中,V表示程序容量,N表示程序长度,n表示程序的词汇量;N=N1+N2,N1代表出现的所有操作符总数,N2代表出现的所有操作数总数;n=n1+n2,n1代表用到的操作符种类,n2为用到的操作数种类数;
[0018] 控制流特性:使用圈复杂度来度量;将程序转化为一个带有唯一入口和出口的
节点控制流程图,计算圈复杂度,圈复杂度定义为:V(G)=e-n+2p,其中,p为控制流程图中的模
块数,e为控制流程图边的个数,n为控制流程图中节点的个数;
[0019] 结构特性:将程序表示为抽象语法树,应用词法分析器从抽象语法树中获取程序的逻辑结构,包含:①for循环个数;②while循环个数;③do-while循环个数;④switch次数;⑤if-else次数;⑥函数个数;⑦返回值个数;⑧for循环条件里的变量个数;⑨while循环条件里的变量个数;⑩do-while循环条件里的变量个数; if判断条件的变量个数。
[0020] 在步骤5)中,将学生程序表示为
特征向量,进行特征变化和特征选择,应用机器学习方法训练评分模型,具体步骤如下:
[0021] 5.1)将源程序表示为属性特征向量P(x1,x2,x3,......xn),式中,P为学生程序源码特征向量,x为学生程序源码的特征,n为学生程序源码的特性总数,xn为学生程序源码的第n个特性;x1为数组个数,x2为每个数组出现次数;x3为自定义变量个数;x4为每个自定义变量出现次数;x5为关键字个数;x6为每个关键字次数;x7为数值常量个数;x8为每个数值常量出现次数;x9为字符常量个数;x10为每个字符常量次数;x11为运算符个数;x12为每个运算符出现次数;x13为for循环个数;x14为while循环个数;x15为do-while循环个数;x16为switch次数;x17为if-else次数;x18为函数个数;x19为返回值个数;x20为for循环条件里的变量个数;x21为while循环条件里的变量个数;x22为do-while循环条件里的变量个数;x23为if判断条件的变量个数;特征向量维度n由程序特征属性决定,包括出现的数组个数、自定义变量个数、关键字个数、数值常量个数、字符常量个数、运算符个数决定、函数调用个数。
[0022] 5.2)将学生程序实例作为样本数据,对应的分数等级作为标签,应用机器学习KNN(K-Nearest Neighbor)算法,对样本数据按照分数等级分类,即类别对应分数等级,然后输入未知分类样本计算未知样本所属分类;步骤为:a、计算待分类数据与样本数据的距离;b、为待分类数据选择K个与其距离最小的样本;c、统计出K个样本中大多数样本所属的分类,这个分类就是待分类数据所属的分类,这个分类对应待分类程序的评分等级。
[0023] 在步骤6)中,将动态测试与静态分析结果综合,反馈学生程序题分数,分数为:S=ω1S1+ω2S2,其中,S代表学生程序得分;ω1为动态测试分数所占权重;S1代表动态测试用例通过百分比乘以100后,小数点后一位四舍五入后的数值;ω2为静态分析所占权重;S2代表静态分析结果对应的数值评分结果。
[0024] 本发明与现有技术相比,具有如下优点与有益效果:
[0025] 1、本发明方法实用性高,节约教学资源,为教学过程提供有效辅助,并且能在互联网公司开发岗位招聘中发挥重要作用。
[0026] 2、本发明使用机器学习算法进行自动评分,无需构建模板程序,避免了因为模板程序不唯一给程序评分带来的影响。
[0027] 3、本发明使用动静结合方式进行评分,既考虑了程序运行结果,又考虑了程序结构和程序逻辑。
[0028] 4、本发明程序特征向量提取,采用了属性计数、结构度量、词法分析器、抽象语法树技术相结合,考虑特征更全面。
[0029] 5、本发明对所有的学生程序都进行静态分析,减少动态测试全部通过,但不按题目要求编写程序而产生的误判现象。
附图说明
[0030] 图1为本发明逻辑流程示意图。
[0031] 图2为本发明的数据流向图。
[0032] 图3为本发明静态分析过程机器学习算法流程图。
[0033] 图4为本发明静态分析方法原理示意图。
[0034] 图5为本发明helloworld程序案例。
具体实施方式
[0035] 下面结合具体
实施例对本发明作进一步说明。
[0036] 如图1所示,本实施例所提供的基于机器学习的程序题自动评分方法,包括以下步骤:
[0037] 1)获取学生程序课程作业数据,包括学生作业、作业分数信息;所述学生作业是指从在线学习平台的程序设计课程中获取的学生作业;所述作业分数信息是指在线学习平台中担任程序课程的教师或者助教给学生提交的作业评判的分数等级。
[0038] 2)对获取到的作业进行数据预处理,具体是对学生提交的程序作业用文本处理技术,除去注释和与程序结构无关的部分。
[0039] 3)对程序进行动态测试,将程序题输入动态运行环境,编译运行,通过编译运行的程序采用黑盒测试,测试该程序通过测试用例的百分比。
[0040] 4)提取程序特性,如下:
[0041] 基本属性:使用词法分析器提取基本属性,包括:①数组个数:统计程序里面定义了多少个数组;②每个数组出现次数:统计程序里面定义的数组使用次数;③自定义变量个数:统计程序里面不重复出现的自定义变量个数;④每个自定义变量出现次数:统计程序里面不重复出现的自定义变量使用次数;⑤关键字个数:统计程序里出现的关键字个数;⑥每个关键字次数:统计程序里出现的关键字使用次数;⑦数值常量个数:统计程序里面出现的数值常量个数;⑧每个数值常量出现次数:统计程序里面出现的数值常量次数;⑨字符常量:统计包含的单个字符和字符串个数;⑩每个字符常量次数:统计程序里面出现的某个字符常量使用次数; 运算符:统计程序出现的运算符个数; 每个运算符出现次数:统计程序出现的运算符使用次数;
[0042] 容量特性:V=Nlog2n;其中,V表示程序容量,N表示程序长度,n表示程序的词汇量;N=N1+N2,N1代表出现的所有操作符总数,N2代表出现的所有操作数总数;n=n1+n2,n1代表用到的操作符种类,n2为用到的操作数种类数;
[0043] 控制流特性:使用圈复杂度来度量;将程序转化为一个带有唯一入口和出口的节点控制流程图,计算圈复杂度,圈复杂度定义为:V(G)=e-n+2p,其中,p为控制流程图中的模块数,e为控制流程图边的个数,n为控制流程图中节点的个数;
[0044] 结构特性:将程序表示为抽象语法树,应用词法分析器从抽象语法树中获取程序的逻辑结构,包含:①for循环个数;②while循环个数;③do-while循环个数;④switch次数;⑤if-else次数;⑥函数个数;⑦返回值个数;⑧for循环条件里的变量个数;⑨while循环条件里的变量个数;⑩do-while循环条件里的变量个数; if判断条件的变量个数。
[0045] 5)应用机器学习算法对程序进行静态分析,具体是将学生程序表示为特征向量,进行特征变化和特征选择,应用机器学习方法训练评分模型,具体步骤如下:
[0046] 5.1)将源程序表示为属性特征向量P(x1,x2,x3,......xn),式中,P为学生程序源码特征向量,x为学生程序源码的特征,n为学生程序源码的特性总数,xn为学生程序源码的第n个特性;x1为数组个数,x2为每个数组出现次数;x3为自定义变量个数;x4为每个自定义变量出现次数;x5为关键字个数;x6为每个关键字次数;x7为数值常量个数;x8为每个数值常量出现次数;x9为字符常量个数;x10为每个字符常量次数;x11为运算符个数;x12为每个运算符出现次数;x13为for循环个数;x14为while循环个数;x15为do-while循环个数;x16为switch次数;x17为if-else次数;x18为函数个数;x19为返回值个数;x20为for循环条件里的变量个数;x21为while循环条件里的变量个数;x22为do-while循环条件里的变量个数;x23为if判断条件的变量个数;特征向量维度n由程序特征属性决定,包括出现的数组个数、自定义变量个数、关键字个数、数值常量个数、字符常量个数、运算符个数决定、函数调用个数。
[0047] 5.2)将学生程序实例作为样本数据,对应的分数等级作为标签,应用机器学习KNN(K-Nearest Neighbor)算法,对样本数据按照分数等级分类,即类别对应分数等级,然后输入未知分类样本计算未知样本所属分类;步骤为:a、计算待分类数据与样本数据的距离;b、为待分类数据选择K个与其距离最小的样本;c、统计出K个样本中大多数样本所属的分类,这个分类就是待分类数据所属的分类,这个分类对应待分类程序的评分等级。
[0048] 6)综合动态运行和静态分析结果,返回程序最终评分,具体如下:
[0049] 将动态测试与静态分析结果综合,反馈学生程序题分数,分数为:S=ω1S1+ω2S2,其中,S代表学生程序得分;ω1为动态测试分数所占权重;S1代表动态测试用例通过百分比乘以100后,小数点后一位四舍五入后的数值;ω2为静态分析所占权重;S2代表静态分析结果对应的数值评分结果。
[0050] 下面结合图2至图5,对本实施例上述的基于机器学习的程序题自动评分方法做进一步说明,具体如下:
[0051] 1、从在线学习平台程序课程中获取学生的作业信息,包括学生的程序和教师批改的分数等级。
[0052] 2、在自动评分模块中,对获取的作业信息进行预处理,包括去除注释和程序无关的结构。
[0053] 3、将处理好的程序转入动态测试部分,使用黑盒测试运行程序,记录程序通过测试用例的百分比。对于图5中的程序黑盒测试过程为:比对程序运行实际输出字符串与测试集预输出字符串“Hello World”进行字符串绝对比较。完全比对成功,则通过率为100%;比对不成功则通过率为0%。
[0054] 4、对程序进行静态分析,使用属性计数、词法分析器、抽象语法树、特征向量提取、特征向量选择技术生成程序的特征向量。图5中的helloworld程序,包含了关键字public:2个;class:1个;自定义类名HelloWorld:1个;static:1个;void:1个;main:1个;String:1个;args:1个;System.out.println字符串:1个;Hello字符串:1个;World:1个;Hello World字符串:1个;左大括号“{”:2个;右大括号“}”:2个;左括号“(”:2个;右括号“(”:2个;双引号:1对。并生成hello world程序流程图和抽象语法树,计算程序容量、圈复杂度和结构特性。将获取到的特性表示成特征向量P,进行特征提取和特征选择。
[0055] 5、将程序样本的特征向量输入到机器学习模块中,机器模块中使用KNN(K-Nearest Neighbor)分类器对样本进行分类。如图4所示,该
门程序课程教师的评分规则为“优、良、中、差”对应数值数为“90、80、70、60”。
[0056] 6、输入未知程序样本x特征向量,计算未知样本到各个已知样本的距离,距离按从小到大排列,选取合适的K值,K表示距离最小的K个点。选取K=4,代表未知样本x到已知样本距离最小的4个点。计算这4个点出现的类别概率。如图4所示,4个点中,出现“优”类别的次数为2;出现“中”类别的次数为1;出现“差”类别的次数为1。则未知样本的类别为“优”,即对于分数等级为“优”。
[0057] 7、最后综合静态分析与动态测试的结果,设定动态测试所占权值为0.5,静态分析所占权值为0.5,最后helloworld程序作业分总分为:0.5*100+0.5*90=95,将最后评分返回给在线学习平台。
[0058] 综上所述,在采用以上方案后,能够使用机器学习方法自动对学生程序进行评分,为程序课程的教学过程提供了良好的辅助,大大节省教学资源,减轻任课教师和助教的教学负担。此方法无需与教师提供的模板程序进行对比,即减少了教师的负担,又避免了模板程序不唯一给评分结果造成的影响,具有实际推广价值,值得推广。
[0059] 以上所述实施例只为本发明之较佳实施例,并非以此限制本发明的实施范围,故凡依本发明之形状、原理所作的变化,均应涵盖在本发明的保护范围内。