APP下载

在线题库的一种便捷录入方法及其实现

2014-09-26袁志

软件工程 2014年9期

袁志

摘 要:研究一种在线题库录入问题的便捷方法,让教师通过复制粘贴加上简单编辑即可完成各类试题录入,同时又能满足答题习惯。关键途径包括三个部分:一是利用正则表达式,根据文本内容自动判别题型;二是根据题型对原始数据进行转换,生成包含表单的HTML段,为学生提供答题操作的接口;三是远程图片的服务器端自动存储。用ASP.NET进行了编程实现,验证了可行性。

关键词:在线题库;正则表达式;图片本地化;ASP.NET

中图分类号:TP3 文献标识码:A

1 引言(Instruction)

Web题库对教学的支撑作用是明显的,对于在线题库建设的技术讨论,集中在数据库设计与自动组卷技术[1],试题录入方法的讨论没有得到应重视。然而题库建设工作量很大,除了技术开发之外,试题录入也是繁重的工作。

题库的主体用户分为两种角色:教师和学生。从学生的角度,有一些答题操作已经形成习惯,比如:单选题使用单选按钮,多选题使用复选按钮,填空题在下划线上方填写字符,简答题在空白处填写大段文本。为了满足这些习惯,现有的做法是让教师在录入试题时,对每一种题型进行不同的录入操作,比如为选择题分若干步添加若干不同的选项,为填空题插入表单控件等等,这些方法虽然从技术上是可行的,但教师的工作过程繁琐,直接影响到了题库建设的效率。

本文研究题库的便捷录入方法,使教师可以通过复制粘贴加简单的文本编辑即可完成题库录入,所有的题型录入方法是一致的,不需要考虑题型之间的差异。为此要解决三个问题关键问题:

问题一:题型的自动判别问题。对于一段文本,要从其内容自动判别其题型。

问题二:答题样式的自动生成问题。根据题型对文本进行转换,使之呈现为不同的答题操作视图。

问题三:图片的服务器端自动存储问题。复制粘贴的内容可能包括远程图片链接,链接的数据源要自动存放到题库服务器,使题库系统离开远程资源也可独立运行。

2 自动判别题型(Automatic identification topic of

question)

正则表达式可用来处理有规律可循的字符串,在文献元数据提取[2]、Web信息提取[3]等方面得到广泛应用,本文用正则表达式来进行题型自动识别。

本文只讨论单选题和单项填空题,其余题型完全可以在此基础上扩展。不妨约定,在教师录入试题时,单选题必然存在A、B、C、D等四个选项,填空题的待填部分用任意长度的下划线作为占位符。试题存放在数据库中,为了避开不同DBMS的技术细节差异,采用XML文件描述存储格式:

<?xml version="1.0" encoding="gb2312"?>

计算机网络的OSI参考模型中,负责端到端的数据传输控制的功能位于( )。

A.物理层 B.数据链路层 C.网络层 D.传输层

在计算机网络的OSI参考模型中,负责端到端的数据传输控制的功能位于_______层。

以上XML文件中,Lesson元素对应课程,Category元素对应知识点,Problem元素对应试题,Question元素对应试题中的问题,依次呈包含关系。Problem元素中除了Question元素之外,还可以包括难度系数、参考答案和问题解析等等,本文只关注Question元素。可以看到,题型是问题文本隐式包含的,可以通过文本的规则来自动判断题型。

简单起见,可以将上述两种题型的正则表达式描述如下,这两个表达式当然可以写的更为精确。

单选题的正则式:(.*)(A.*)(B.*)(C.*)(D.*)

填空题的正则式:(.*)(_{3,})(.*)

3 自动生成答题界面(Automatic generation the UI

for answering)

根据自动判断所得的题型,在答题界面对Question部分生成HTML片段,其中包含的HTML表单控件用于提供答题操作接口。具体地说:单选题生成单选按钮组,供学生选择;填空题生成输入框,供学生填写答案。每个表单控件用ProblemID来标记,使得提交答案与题号建立联系,为后续技术处理提供方便。

两种转换分别由下面的两个函数来实现。

//选择题文本转换

string transfer2SelectionHtml(int problemID)

{

string question = ""; //取出question……略

string pattern = @"(.*)(A.*)(B.*)(C.*)(D.*)"; //正则表达式模式

//文本替换模式,生成一段问题和一个单选按钮组,其Name属性等于ProblemID

//$1,$2,$3,$4,$5分别表示匹配的组

string replacement = string.Format(@"

$1

$2

$3endprint

$4

$5", problemID);

Regex regex = new Regex(pattern); //生成正则表达式

Match match= regex.Matches(question); //匹配

String result = match.Result(replacement); //转换

return result;

}

//填空题文本转换

string transfer2BlankHtml(int problemID)

{

string question = "";

string result = "";

string pattern = @"(.*)(_{3,})(.*)";

string replacement1 = string.Format(@"$1$3",probelmID);

Regex regex = new Regex(pattern);

MatchCollection matches = regex.Matches(question);

foreach (Match match in matches)

{

result = match.Result(replacement1);

}

return result;

}

4 远程图片的自动本地化(Automatic locationize

remote images)

在录入试题时,用户经常从其他网站中复制一段内容粘贴,从HTML的角度来讲,复制的内容包括纯文本和图片链接地址。纯文本保存到题库服务器是没有问题的,而图片链接地址保存到题库服务器可能造成问题,这是因为链接源可能会消失。因此,远程图片应该保存到题库服务器。

人工操作方法是先将远程图片下载到用户主机,然后再上传到服务器,然后利用在线编辑工具编辑试题,在试题中加入服务器端的图片链接,这种方法颇为费时费力。这里讨论的是自动存储技术。

当试题中包含了远程网站上的一个图片链接时,其Question元素必然包含类似以下的HTML段落,可以用正则表达式来捕获。

我们所需要做的工作是:录入的数据提交时,由服务器端程序向链接源发送请求,将获取的图片数据保存到服务器的文件系统中,并对应修改链接地址。核心函数如下:

void saveImage(string uri)

{

int index = uri.LastIndexOf("/");

string filename = Server.MapPath("/Files/") + uri.Substring(index + 1);

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri);

req.Method = "GET";

using (WebResponse res = req.GetResponse())

{

byte[] buff = new byte[1024];

Stream r = res.GetResponseStream();

FileStream w = new FileStream(filename, FileMode.Create);

int byteCount = 0;

while ((byteCount = r.Read(buff, 0, buff.Length)) > 0)

{

w.Write(buff, 0, byteCount);

}

r.Close();

w.Close();

}

}

5 示例(Example)

我们开发了一个“计算机软件水平(资格)考试在线练习网站”,该网站的主要功能是题库维护和在线练习,在该网站中采用本文所述的方法,大大减小了题库录入的工作量。举一个选择题为例,从某网站复制2013年的网络工程师考试的一道选择题,录入操作界面和答题界面如图1和图2。

图1 试题录入界面

Fig.1 The test question input interface

由图1可以看出,对于一道单选题,在录入的时候直接复制粘贴即可完成录入操作,不必分项填写待选项。

图2 单选题的答题界面

Fig.2 The answer interface

由图2可以看出,该选择题的问题文本自动转换为用户的习惯答题方式,用单选按钮来答题,其中的图片源地址指向题库服务器上图片文件,不会因为原始网站的变化而丢失。

6 结论(Conclusion)

本文叙述的题库快捷录入方法,使教师可以采用一致性的方法完成大多数类型的试题录入,教师的操作只有复制粘贴加上简单的文本编辑,省去复杂的操作流程,大大提高了试题录入效率。该方法所依赖的技术,一是利用正则表达式对试题进行匹配和转换,将其转换为HTML片段输出到页面,二是采用后台自动运行的持久化技术实现图片的服务器端存储。

下一步要做的工作:试题录入时常常有重复录入的可能性,依靠人工检索是比较困难的,计划采用以编辑距离为度量的试题相似度检查机制,进一步提高题库录入的便利度。

参考文献(References)

[1] 董园.在线考试系统中的题库建设相关技术的研究[J].电子世

界,2013,17:112-115.

[2] 曹俊,万晓云,廖顺保.基于正则表达式批量提取CNKI文献元

数据技术探究[J].图书情报工作,2010,10(19):111-114.

[3] 胡军伟,秦奕青,张伟.正则表达式在Web信息抽取中的应用

[J].北京信息科技大学学报,2011,12(6):86-89.

作者简介:

袁 志(1971-),男,硕士,副教授.研究领域:网络与信息

系统.endprint

摘 要:研究一种在线题库录入问题的便捷方法,让教师通过复制粘贴加上简单编辑即可完成各类试题录入,同时又能满足答题习惯。关键途径包括三个部分:一是利用正则表达式,根据文本内容自动判别题型;二是根据题型对原始数据进行转换,生成包含表单的HTML段,为学生提供答题操作的接口;三是远程图片的服务器端自动存储。用ASP.NET进行了编程实现,验证了可行性。

关键词:在线题库;正则表达式;图片本地化;ASP.NET

中图分类号:TP3 文献标识码:A

1 引言(Instruction)

Web题库对教学的支撑作用是明显的,对于在线题库建设的技术讨论,集中在数据库设计与自动组卷技术[1],试题录入方法的讨论没有得到应重视。然而题库建设工作量很大,除了技术开发之外,试题录入也是繁重的工作。

题库的主体用户分为两种角色:教师和学生。从学生的角度,有一些答题操作已经形成习惯,比如:单选题使用单选按钮,多选题使用复选按钮,填空题在下划线上方填写字符,简答题在空白处填写大段文本。为了满足这些习惯,现有的做法是让教师在录入试题时,对每一种题型进行不同的录入操作,比如为选择题分若干步添加若干不同的选项,为填空题插入表单控件等等,这些方法虽然从技术上是可行的,但教师的工作过程繁琐,直接影响到了题库建设的效率。

本文研究题库的便捷录入方法,使教师可以通过复制粘贴加简单的文本编辑即可完成题库录入,所有的题型录入方法是一致的,不需要考虑题型之间的差异。为此要解决三个问题关键问题:

问题一:题型的自动判别问题。对于一段文本,要从其内容自动判别其题型。

问题二:答题样式的自动生成问题。根据题型对文本进行转换,使之呈现为不同的答题操作视图。

问题三:图片的服务器端自动存储问题。复制粘贴的内容可能包括远程图片链接,链接的数据源要自动存放到题库服务器,使题库系统离开远程资源也可独立运行。

2 自动判别题型(Automatic identification topic of

question)

正则表达式可用来处理有规律可循的字符串,在文献元数据提取[2]、Web信息提取[3]等方面得到广泛应用,本文用正则表达式来进行题型自动识别。

本文只讨论单选题和单项填空题,其余题型完全可以在此基础上扩展。不妨约定,在教师录入试题时,单选题必然存在A、B、C、D等四个选项,填空题的待填部分用任意长度的下划线作为占位符。试题存放在数据库中,为了避开不同DBMS的技术细节差异,采用XML文件描述存储格式:

<?xml version="1.0" encoding="gb2312"?>

计算机网络的OSI参考模型中,负责端到端的数据传输控制的功能位于( )。

A.物理层 B.数据链路层 C.网络层 D.传输层

在计算机网络的OSI参考模型中,负责端到端的数据传输控制的功能位于_______层。

以上XML文件中,Lesson元素对应课程,Category元素对应知识点,Problem元素对应试题,Question元素对应试题中的问题,依次呈包含关系。Problem元素中除了Question元素之外,还可以包括难度系数、参考答案和问题解析等等,本文只关注Question元素。可以看到,题型是问题文本隐式包含的,可以通过文本的规则来自动判断题型。

简单起见,可以将上述两种题型的正则表达式描述如下,这两个表达式当然可以写的更为精确。

单选题的正则式:(.*)(A.*)(B.*)(C.*)(D.*)

填空题的正则式:(.*)(_{3,})(.*)

3 自动生成答题界面(Automatic generation the UI

for answering)

根据自动判断所得的题型,在答题界面对Question部分生成HTML片段,其中包含的HTML表单控件用于提供答题操作接口。具体地说:单选题生成单选按钮组,供学生选择;填空题生成输入框,供学生填写答案。每个表单控件用ProblemID来标记,使得提交答案与题号建立联系,为后续技术处理提供方便。

两种转换分别由下面的两个函数来实现。

//选择题文本转换

string transfer2SelectionHtml(int problemID)

{

string question = ""; //取出question……略

string pattern = @"(.*)(A.*)(B.*)(C.*)(D.*)"; //正则表达式模式

//文本替换模式,生成一段问题和一个单选按钮组,其Name属性等于ProblemID

//$1,$2,$3,$4,$5分别表示匹配的组

string replacement = string.Format(@"

$1

$2

$3endprint

摘 要:研究一种在线题库录入问题的便捷方法,让教师通过复制粘贴加上简单编辑即可完成各类试题录入,同时又能满足答题习惯。关键途径包括三个部分:一是利用正则表达式,根据文本内容自动判别题型;二是根据题型对原始数据进行转换,生成包含表单的HTML段,为学生提供答题操作的接口;三是远程图片的服务器端自动存储。用ASP.NET进行了编程实现,验证了可行性。

关键词:在线题库;正则表达式;图片本地化;ASP.NET

中图分类号:TP3 文献标识码:A

1 引言(Instruction)

Web题库对教学的支撑作用是明显的,对于在线题库建设的技术讨论,集中在数据库设计与自动组卷技术[1],试题录入方法的讨论没有得到应重视。然而题库建设工作量很大,除了技术开发之外,试题录入也是繁重的工作。

题库的主体用户分为两种角色:教师和学生。从学生的角度,有一些答题操作已经形成习惯,比如:单选题使用单选按钮,多选题使用复选按钮,填空题在下划线上方填写字符,简答题在空白处填写大段文本。为了满足这些习惯,现有的做法是让教师在录入试题时,对每一种题型进行不同的录入操作,比如为选择题分若干步添加若干不同的选项,为填空题插入表单控件等等,这些方法虽然从技术上是可行的,但教师的工作过程繁琐,直接影响到了题库建设的效率。

本文研究题库的便捷录入方法,使教师可以通过复制粘贴加简单的文本编辑即可完成题库录入,所有的题型录入方法是一致的,不需要考虑题型之间的差异。为此要解决三个问题关键问题:

问题一:题型的自动判别问题。对于一段文本,要从其内容自动判别其题型。

问题二:答题样式的自动生成问题。根据题型对文本进行转换,使之呈现为不同的答题操作视图。

问题三:图片的服务器端自动存储问题。复制粘贴的内容可能包括远程图片链接,链接的数据源要自动存放到题库服务器,使题库系统离开远程资源也可独立运行。

2 自动判别题型(Automatic identification topic of

question)

正则表达式可用来处理有规律可循的字符串,在文献元数据提取[2]、Web信息提取[3]等方面得到广泛应用,本文用正则表达式来进行题型自动识别。

本文只讨论单选题和单项填空题,其余题型完全可以在此基础上扩展。不妨约定,在教师录入试题时,单选题必然存在A、B、C、D等四个选项,填空题的待填部分用任意长度的下划线作为占位符。试题存放在数据库中,为了避开不同DBMS的技术细节差异,采用XML文件描述存储格式:

<?xml version="1.0" encoding="gb2312"?>

计算机网络的OSI参考模型中,负责端到端的数据传输控制的功能位于( )。

A.物理层 B.数据链路层 C.网络层 D.传输层

在计算机网络的OSI参考模型中,负责端到端的数据传输控制的功能位于_______层。

以上XML文件中,Lesson元素对应课程,Category元素对应知识点,Problem元素对应试题,Question元素对应试题中的问题,依次呈包含关系。Problem元素中除了Question元素之外,还可以包括难度系数、参考答案和问题解析等等,本文只关注Question元素。可以看到,题型是问题文本隐式包含的,可以通过文本的规则来自动判断题型。

简单起见,可以将上述两种题型的正则表达式描述如下,这两个表达式当然可以写的更为精确。

单选题的正则式:(.*)(A.*)(B.*)(C.*)(D.*)

填空题的正则式:(.*)(_{3,})(.*)

3 自动生成答题界面(Automatic generation the UI

for answering)

根据自动判断所得的题型,在答题界面对Question部分生成HTML片段,其中包含的HTML表单控件用于提供答题操作接口。具体地说:单选题生成单选按钮组,供学生选择;填空题生成输入框,供学生填写答案。每个表单控件用ProblemID来标记,使得提交答案与题号建立联系,为后续技术处理提供方便。

两种转换分别由下面的两个函数来实现。

//选择题文本转换

string transfer2SelectionHtml(int problemID)

{

string question = ""; //取出question……略

string pattern = @"(.*)(A.*)(B.*)(C.*)(D.*)"; //正则表达式模式

//文本替换模式,生成一段问题和一个单选按钮组,其Name属性等于ProblemID

//$1,$2,$3,$4,$5分别表示匹配的组

string replacement = string.Format(@"

$1

$2

$3endprint