展开

基于Java反射机制的习题自动评分模型构建

发布时间:2018-12-21   |  所属分类:计算机应用:论文发表  |  浏览:  |  加入收藏

  目前大部分的考试自动评分系统针对的主要还是客观题的自动评测, 而对于一些主观题则仍然不够完善, 这些技术的实现是大部分在线考试和自动化阅卷系统的关键所在。大部分的研究人员主要通过开发一个中间表示形式来对数据源进行分析和匹配, 然后根据既定的算法进行评分, 但这类方法实现技术复杂, 计算机系统的负载比较大, 而且灵活性也不够。以计算机语言编程题为例, 研究和探讨了一种基于Java反射机制的自动评分模型, 通过反射机制对源代码的执行结果进行分析, 融合程序的查错纠错技术以及正则表达式来实现匹配评分, 实现了Java程序主观编程题的自动评分技术和原型系统。

计算机研究与发展

  《计算机研究与发展》诞生于我国计算机事业的初创时期(1958年),是我国第一个计算机刊物,它是随着中国计算机事业的发展而成长起来的。五十多年来,该刊始终结合我国计算机事业不同时期的重点和需要,有计划、有组织地进行选题,刊登了大量国内最新科研成果和国家重点支持的研究项目的论文,对我国计算机科学技术的发展和高技术领域人才的培养发挥了巨大的作用。

  1、 概述

  在当前的很多计算机类型考试中, 很多都应用了自动评分系统, 既减轻了改卷老师的负担, 也大幅度提高了工作效率。但在一些编程类的课程考试中, 由于存在了非常多的主观编程题目, 这些主观题由于现阶段没有一个比较成熟的技术可以依赖, 大部分还是采用的人工批改手段[1]。这些技术的实现是大部分在线考试和自动化阅卷系统的关键所在, 因此大部分的研究人员主要通过开发一个中间表示形式来对数据源进行分析和匹配, 将整个程序作为整体来进行静态代码分析, 然后根据既定的算法进行评分, 但这类方法实现技术复杂, 计算机系统的负载比较大, 而且灵活性也不够。如何通过现有的计算机技术来实现编程主观题自动评分, 既兼顾评分结果, 又兼顾灵活评分, 既易实现, 又能够最大化兼顾通用, 是研究的难点。以计算机语言编程题为例, 研究和探讨一种基于Java反射机制的自动评分模型, 通过反射机制对源代码的执行结果进行分析, 融合程序的查错纠错技术以及正则表达式来实现匹配评分, 实现了Java程序主观编程题的自动评分技术和原型系统, 具备一定的理论和现实意义。

  2、 Java反射机制

  Java反射机制主要是通过调用程序中已知的类来进行编译, 然后根据编译结果来判断程序的执行情况, 然后根据执行情况来与后续的评分标准进行匹配后进行打分。反射机制通过调用Java中的java.lang.reglect包, 由这个包里面的4个类来实现, 基本思想就是编译学生的程序, 通过获取类名, 类的成员变量, 构造方法及普通的方法, Java的反射包中包含了要获取的相关参数和方法, 可以比较容易获取需要的信息[2]。

  要实现反射的首要条件是获取入口类, 反射机制首先调用Class类来创建一个类的对象, 然后通过前面所提到的其他几个类以及反射APIs动态处理来获取这个类的相关内部信息, 包括该类的变量、方法以及属性等[3]。具体一点来说就是, 程序中的任意一个通过程序编译的Java类, 加载到虚拟机后, 都被表示为Class类的对象。该对象提供了比较常用的访问器来获取Class类所表示的对象, 如为了获取构造方法, 可使用getDec laredConstructor () 。再利用这些对象来反射获取相关的类成员的具体信息。比如可以通过Method对象来调用getModifiers () 方法与getReturnType () 方法就可以获取方法的修饰符和返回类型。同样, 也可以通过Field对象调用get (Object boj) 与set (Object obj1, Object obj2) , 来访问变量或者修改变量值。

  3、 正则表达式

  由于程序编程题目属于偏主观的题目, 实现的方法可以多种多样, 也就是说没有所谓的标准答案。但是在出题过程中, 教师一般会指定成员变量、方法名、构造方法参数等基本信息, 对实现方法的功能进行要求, 不会限定具体实现方式, 这时正则表达式则可以通过表达式来对考生程序和相关标准答案进行复杂运算匹配, 然后根据运算结果来进行打分, 灵活而且高效。

  Java中的正则表达式分为Pattern和Match而两个类来实现, 他们都封装在java.util.regex包中, Pattern类是对正则表达式进行编译的, Match类则是对正则表达式进行匹配的, 也就是用来检索结果的[4]。主要步骤如下:

  (1) 构造一个可以实现字符串编译的正则表达式模式对象, 通过调用Pattern类的compile (string string) 来实现, 其中string参数为代表正则表达式的字符串。

  (2) 调用Matcher类中的matcher (CharSequence mstring) 方法来对上一个步骤的Pattern对象进行匹配对象创建, 参数表示待匹配字符。

  (3) 假设上一个步骤所产生的Matcher对象为mMatcher, 则使用mMatcher对象进行结果的搜索匹配。Matcher对象提供了以下几个常用的方法:

  1) boolean find () :任意目标的匹配。

  2) boolean find (int begin) :用来对指定的位置开始进行字符串匹配查找。

  3) int begin:返回匹配目标字符串的开始位置。

  4) int end () :返回匹配目标字符串的结束位置。

  5) String string () :返回当前匹配的字符串内容。

  4、 XML技术

  在自动化评分系统中, 通过Java反射机制来调用源程序进行编译后再将结果通过正则表达式来与标准答案进行匹配。因此, 标准答案的存储和表达方式不仅要准确, 还要灵活多样, 符合各种不同类型的参考答案。这就需要一种可以描述各种复杂关系的通用数据格式。选择了XML文档作为标准答案的存储格式, 简单、方便、通用, 内容和格式分离。

  4.1、 XML验证

  为了保证XML文件的有效性, 需要对XML文件的数据结构进行约束, 通过调用约束格式来对XML文档进行验证来确保有效性。主要通过DTD和XML Schema文件来保存XML格式结构。前者有独立的语法结构, 后者则是特殊的XML文件, 也是通过XML语法来描述约束条件。

  4.1.1、 DTD

  主要用于对XML内容的格式进行验证, 以确保XML内容的严谨性和正确性。但由于缺少对数据类型和命名空间的支持, 对XML格式的限定有限[5]。

  4.1.2、 XML Schem

  XML Schema是用来描述XML文档结构的, 本身也是使用XML文档结构, 所以不需要重新学习一门语言, 与DTD出于同样的目的产生, 但是功能更为强大[6]。

  4.2、 XML解析

  由于采用XML文档保存答案, 在进行答案匹配的时候需要从XML文档中获取答案内容。这里往往会用到XML的解析技术, 主要包括了DOM和SAX两种。

  (1) DOM:XML DOM (XML Document Object Model) 定义了访问和操作XML文档的标准方法。通过该方法可以将XML中的数据以树形的结构放入到内存中, 然后通过程序对该树进行访问以方便获取所需要的数据。由于该技术需要把所有内容先放到树里面, 如果XML文件内容较多时会占用较多内存空间, 影响计算机系统的工作效率[7]。

  (2) SAX:全称Simple API for XML, 是一个软件包, 提供了外部的API接口, 允许程序调用后对XML文件进行读取[8]。SAX不需要对整个XML文档进行整体读取, 实行的是逐行扫描, 在扫描的同时进行数据解析。这种方法相对于DOM来说更加方便, 特别是对于大数据量的XML文档, 由于不需要把所有数据导入内存, SAX的效率更高一筹。

  4.3、 XML查询

  XML解析技术是对XML文档进行整体的读取, 如果需要对XML内的数据进行查询匹配的话则会用到相对应的查询技术, 主要包含两种:XPath和XQuery。

  (1) XPath:确定文档中某部分的具体位置, 主要通过它来实现, 它的返回值可能是节点, 节点集合, 原子值, 以及节点和原子值的混合等[9]。XPath的核心是XML文档的路径表达式。通过XPath所建立的节点路径, 应用可以沿着这些路径节点逐一进行比较查找, 以获取所需的数据内容。

  (2) XQuery:是在Xpath技术的基础上面发展出来的用来, 是对XPath的扩展, 其功能比较全[10]。XPath查询返回的是一个经过排序的节点序列, 如果需要获取节点内容还需要通过遍历来获取节点数据。而XQuery返回的则是完整的节点集合, 数据就包含在集合本身, 通过程序可以非常方便地获取。同时, XQuery提供了更加丰富的表达式类型和数据类型, 还有模式验证机制等。

  5、 原型设计

  通过对以上几种技术的描述, 为了验证自动评分技术的可行性和准确性, 设计并实现了一个系统原型, 该原型在Eclipse平台进行开发, 采用了Java程序语言进行编写。系统设计采用了MVC三层结构。评分方式采用了静态分析以及动态模拟执行代码分析两种, 客观题主要通过静态方式判分, 主观编程题则通过Java的反射机制来进行执行验证。原型系统主要核心功能就在于自动评分, 采用了上文所述的Java反射机制, 程序查错纠错技术、XML文档存储技术以及正则表达式匹配评分技术结合来实现。系统首先读取考试题中考生所写的程序源代码, 调用Java反射机制实现对程序的编译执行, 并将执行结果读取出来放入内存, 题目参考答案保存到XML文档中, 不同答案的组合分数不同, 事先需要确定组合类型和对应分数, 然后将规则写成正则表达式。然后执行结果与XML中参考答案进行匹配组合, 获取到最终表达式后通过正则表达式给出最终的分数。通过多次测试, 该方式在准确性方面比较高, 只要结果的XML文件考虑周全, 与人工评分的误差可忽略不计, 但在通用性方面还有待提高, 也就是针对不同类型的题目, 参考答案的XML文件编写通用性不足, 基本达到最初的验证目标, 如果题库建设比较成熟之后, 采用此种评分方式, 其效率还是远超手动评分的。

  6、 结语

  通过对几个关键性技术的分析和研究, 可以推断可实现基于Java的主观编程题的自动评分, 并通过组建原型系统进行了实现验证。系统的评分方法采用了Java语言本身独特的反射机制结合其他相关技术可以针对Java编程题目实现执行编译后通过对答案的组合匹配实现自动化评分, 设计思路相对比较新颖, 可为自动评分系统提供一个具备参考意义的案例。由于只适用于Java语言, 也为其他编程语言提供了一个思路, 未来在通用性上还有待继续提高。

  参考文献:

  [1]牛永洁, 张晓光.关于程序设计题自动评分方法的研究.信息技术, 2010, (11) :64-67.

  [2]段汉周, 凌捷, 郑衍衡. Visual Basic程序设计考核自动评阅系统中若干问题的研究.计算机工程, 2001, 27 (4) :167-168.

  [3]乔善平.基于智能移动Agent的C语言考试系统.计算机工程与科学, 2004, (4) :29-31.

  [4]王甜甜.基于语义相似度的编程题自动评分方法的研究:[硕士论文].黑龙江:计算机科学与技术系, 2005.

  [5]马培军, 王甜甜, 苏小红.基于程序理解的编程题自动评分方法.计算机研究与发展, 2009, 46 (7) :63-65.

  [6]王倩, 苏小红, 马培军.有语法错误的编程题自动评分方法研究——用局部语法分析和采分点匹配实现, 计算机工程与应用, 2010, 46 (17) :58-60.

  [7]娄不夜. Java编程题自动判分软件框架的设计.计算机工程与设计, 2010, 31 (24) :74-76.

  [8]佘石泉, 周肆清.正则表达式在编程题自动阅卷中的应用.计算机技术与发展, 2007, 17 (7) :244-246.

  [9]于淑香. C语言程序设计题自动评分系统的设计与实现.沙洲职业工学院学报, 2008, 11 (2) :10-13.

  [10]李海华.基于Java的XML加解密系统的设计与实现.计算机技术与发展, 2011, (8) :45-47.

转载请注明来自:http://www.uuqikan.com/jisuanjiyingyonglw/19907.html


    上一篇:数据驱动模型在洪水预报中的应用及其发展趋势
    下一篇:计算机软件日常的维护措施