基于图的连通性指标实现知识点的最优推荐
2021-07-27赵鸿昌
摘 要:文章以加权无向图的连通性作为量化评价指标,在巩固复习阶段实现了基于知识点网络的学习内容最优推荐,能对全部知识点做整体掌控性练习。知识点网络具有固有权值、已练习权值和待练习权值,通过遍历待练习知识点能得到待练习权值及知识点网络的最优连通性指标。文章对49个知识点的小型Linux脚本题库给出了求取连通性指标的前后端两种实现方法,并在应用场景下实现了针对学生个体的一步和多步最优推荐,以及针对班级和学习小组的最优推荐。实践结果表明:最优推荐的有效性与教师的直觉相吻合,学生反映知识结构性明显增强,学习的主动性也增强,并获得较好的知识迁移能力。该案例为教育信息化软件应用于素质教育的内涵式提升给出了有益的借鉴。
关键词:知识点网络;图的连通性;最优推荐策略;矩阵特征值
中图分类号:G434 文献标志码:B 文章编号:1673-8454(2021)12-0085-07
一、引言
以《国家职业教育改革实施方案》等文件作为指引,教师、教材和教法的研究已经成为教育界各级各类教师普遍关注的热点[1],尤其在当前线上教育蓬勃发展的大背景下,改进线上个性化学习效果更是教法研究的重中之重。个性化学习能破解优质教师资源不足的难题,又能充分利用现代信息技术,特别是大数据和人工智能等技术,来加速推动教育信息化,提高教育的效率和质量,实质上相当于用技术手段有效扩大优质教师资源的影响力。
理想的个性化学习一般需要两个前提:一是富于经验的教师设计好电子题库,库中诸多基础知识点和应用类型知识点联系紧密,形成关系复杂的网状连接即知识点网络;二是有适合学生当前学习阶段的知识点推荐策略。知识点网络形式的电子题库目前已经有了一些研究。例如,根据所设置的题型题量、题目覆盖次数和题目间的包含容斥关系,已有研究者构建了基于SystemVerilog语言的全自动约束随机抽题组卷系统[2]。而推荐策略目前则只有随机推荐和电商平台中的相似推荐两类可供借鉴,前者目标不明确,而后者需要做大量结构化数据的特征相关度分析以挖掘用户的历史喜好信息,并不完全适合学习过程的各个阶段。
学习主要分为三个阶段:知识点识记、知识点应用和知识点创新。学习的前期主要涉及前两个阶段。知识点只有熟练才能应用,因此需要反复“刷题”,以从不同侧面理解知识点。一般基于教材、习题册或电子题库开展练习。此外,练习的技巧与学习的阶段又密切相关。例如,初次学习阶段与巩固复习阶段对知识点的练习需求完全不同。初次学习阶段一般需要临近式学习,重在练习与当前知识点关系密切的知识点,容易产生“举一反三”的效果从而增强学习信心,这已是教育界的共识。而巩固复习阶段的练习策略则需要在整体框架下统筹设计以产生最好的学习效果,要在有限的学习时间内,对所有知识点做整体掌控性的练习,获得知识点应用能力的最大提升。
综上所述,以优秀教师提供的知识点网络为基础,需要深入研究巩固复习阶段知识点的最优练习策略。既不能简单地随机推荐知识点开展“题海”式练习,也不能漫无目标地利用人工智能等先进技术推荐知识点。目前尚缺少一个能够达成共识的策略,原因在于知识点网络的整体掌控程度缺乏量化的评价指标。
本文针对上述研究背景,提出了一种基于代数图论中图连通性指标的最优知识点推荐策略,在巩固复习阶段基于知识点网络实现个性化学习。学习过程中,记录每个学生的练习程度,多个学生的练习程度还可以叠加。最优知识点推荐的对象可以是學生个体,也可以是学习小组,还可以是班级整体,甚至可以是年级或更大规模的组。因此,这种推荐策略不但可以指导学生自主练习,还可以为教师推荐作业和习题课的内容,为翻转课堂和线上线下混合教学的开展提供了有效的技术支撑。
二、知识点网络的连通性指标
如上所述,需要研究巩固复习阶段基于知识点网络的最优练习策略。图1所示的知识点网络由知识点及之间的连线组成,每条连线赋予一个非负的固有权值,表示所连接两个知识点之间的关系紧密程度,权值越大则关系越密切,连线也越粗。每当练习了一个知识点,则把与该知识点相连的所有知识点之间的连线权值加1,如图1中“生成20行hi”这个知识点练习了一次,就把图中高亮的知识点与它之间连线的权值加1。因此,任何时刻知识点网络已经确定的权值由两部分作和:一是反映知识点之间内在关联的固有权值;二是反映学习练习过程的已练习权值。如果是多人学习小组,则知识点网络的权值就取作固有权值与所有学生已练习权值之和。
任何时刻除了确定的权值之外,知识点网络的权值还有未确定的因素即待练习权值,这就是需要最优推荐的待练习知识点对应权值。假设优秀教师提供的知识点网络是全连通的,即在固有权值的状态下就已经是全连通的,那么加入已练习权值和待练习权值后连通程度更强,连通程度可以由代数图论中图的Laplacian矩阵来表征,该矩阵是半正定矩阵且最小特征值为0[3]。在无线传感网和多智能体协同控制的研究领域中,通常选取上述矩阵的第二小特征值作为连通性指标[4],这对于知识点网络同样适用。孤立的知识点越多则知识点网络越呈现出碎片化而不易学习(学习更需要强记)的特征,连通性越强则知识点之间不同侧面串联的应用场景越多。因此,给定知识点网络的固有权值和已练习权值,问题归结为再练习哪个知识点获得的待练习权值能让连通性指标最大。
三、实现方案与关键代码
1.系统结构
系统由客户端、服务器和计算引擎三部分组成,如图2所示。其中,计算引擎的实现方式具有一定的灵活性,可以在服务器实现,也可以在客户端的浏览器上实现,还可以分散在服务器和客户端实现,因服务器性能和计算负载而定。服务器上的JSON文件是客户端和服务器之间数据交换的标准格式,记录了知识点网络的全部信息,由客户端读取并显示给用户。JSON文件由电子题库生成,不同电子题库格式对应不同的生成规则。客户端还要提交已练习的知识点号给服务器,生成的练习过程数据用在计算引擎中,而计算引擎的工作过程相对复杂,共有三步:①由JSON文件生成节点度矩阵;②由三种权值和JSON文件计算出邻接矩阵;③再遍历待练习的知识点号,并通过多次计算Laplacian矩阵的第二小特征值得到最优的连通性指标和最优待练习的知识点号。
由图2可知,本系统结构的优点在于对学生个体和班级整体作最优推荐的流程完全相同,差别只在于收集一个人或所有人的练习过程文件,此类操作只引入极少的计算负荷。
2.电子题库设计
知识点网络包括知识点本身和知识点之间的连线,每条连线具有不同的固有权值。知识点网络记录在JSON文件中,而JSON文件则来自于电子题库。电子题库的格式设计重在简洁高效,既要便于生成JSON文件,也要考虑网页前端显示的易用性,又要尽量减少教师长期维护的工作量。以如下格式Linux脚本电子题库为例:
level1
生成一行hi 用echo在屏幕上打印hi echo hi
生成一行echo 用echo命令在屏幕上打印echo echo echo
……
level2
生成20行hi 用不用awk实现。 seq 20 | xargs -i echo hi
生成5个目录 目录名依次为1,2,3,4,5。 seq 5 | xargs -i mkdir {}
……
level3
用grep取前3行 先seq 5,再用grep取出前3行来。 seq 5 | grep -m 3 "."
用sed取前3行 先seq 5,再用sed取出前3行来。 seq 5 | sed -n '1,3p'
用sed加空行 先seq 5,再用sed每行后面加两个空行。 seq 5 | sed 'G;G'
……
level4
生成20行hi 用awk循环实现 echo hi | awk '{ for(i=0;i<20;i++) print $0}'
用awk取前3行 先seq 5,再用awk取出前3行来。 seq 5 | awk '{if(NR<4){print $0}}'
……
level5
不用tac反序显示 先用seq 4,再用awk实现反序显示。 seq 3 | awk '{i=$0"\n"i} END{printf i}'
……
该题库共有49个知识点,所有知识点按难度组织成level1到level5的级别,前三个级别属于基础知识点,后两个级别是应用类型的知识点。每个知识点包括三个字段:功能描述、详细信息以及实现该功能的Linux脚本具体命令,字段之间用跳格隔开。如此设计不但方便教师整理知识点,还方便网页以“刷题”方式显示前两个字段,又方便用静态隐藏且鼠标悬停的效果显示第三個字段(答案)。另外,教师只需关注知识点本身和难度分类,知识点之间连线的固有权值由脚本自动生成,知识点号也由行号自动生成,最大限度地降低了人工维护成本。
3.JSON格式与知识点网络
知识点网络源自电子题库,但其载体是JSON文件,其中最重要的信息是自动生成知识点之间连线的固有权值,在计算引擎中用以生成节点度矩阵和邻接矩阵。众所周知,Linux脚本命令行以管道符号“|”连接多级简单脚本命令,而简单脚本命令如echo、seq、sed、awk等一般只用到20个左右。对于这种情况,连线间固有权值(见下文JSON格式中的“weight”参数)就取作两个知识点的Linux脚本具体命令中同时出现的简单脚本命令数目。为方便网页和服务器进行数据交换,将上述电子题库转换成JSON格式。其中,知识点的名字取作该知识点所在电子题库文件中的行号,而“numOfPipes”参数则表示Linux脚本具体命令中的字符数,字符数越多则知识点在图1中就显示为越大的椭圆,代表知识点的难易程度。此外,JSON格式中没有知识点对应的答案,答案是网页中某知识点的鼠标点击事件触发时,用其名字在电子题库中即时查找出来的。
{
"level1": [ { "name": "pp2", "value":"生成一行hi", "numOfChars":7}, { "name": "pp3", "value":"生成一行echo", "numOfChars":9} ……],
……
"level5": [ { "name": "pp50", "value":"不用tail取后3行", "numOfChars":70}, { "name": "pp51", "value":"不用tac反序显示", "numOfChars":39}……],
"links": [
{"weight": 4, "source": "pp32", "target": "pp44"},
{"weight": 4, "source": "pp44", "target": "pp54"},
{"weight": 4, "source": "pp47", "target": "pp54"},
{"weight": 5, "source": "pp31", "target": "pp47"},
{"weight": 5, "source": "pp44", "target": "pp47"},
{"weight": 6, "source": "pp31", "target": "pp44"}
……
]
}
以上将电子题库转换成JSON格式的实现脚本过于复杂,此处只描述其核心思想。
第1步:为电子题库文件加行号,因此得到每个知识点前面的行号,并加上“pp”用作“name”参数。
第2步:用awk中的length()函数统计每个知识点的Linux脚本具体命令中的字符数,并把每个知识点整理成name、value和numOfChars格式。
第3步:将每个知识点中管道符号前后的基本命令提取出来,与知识点的“name”参数一起生成link文件,每行形如51 seq。
第4步:统计出任何两个知识点之间相同基本命令的总数目,所用Linux脚本如下:
cat link | xargs -i sed 's/^/{} /g' link | \
awk '{if($1<$3 && $2==$4) print $1" "$3}' | sort | uniq -c
其中整體分三步:①link文件与自身作信息扩充即所有行全交叉,结果每行由2个字段变成4个字段,即两个知识点的“name”参数和具体命令中的某个基本脚本命令。②根据源知识点和目标知识点的对称可互换性,只需用awk过滤出源知识点号更小的情况,并只显示出两个知识点的“name”参数,表示两者之间出现了一次相同的简单脚本命令。③排序并用uniq命令统计出所有知识点两两之间相同简单脚本命令的总数。
第5步:按JSON格式要求生成weight、source和target信息,并补齐所有匹配的区域定界符号。
4.生成Laplacian矩阵并求特征值
知识点网络的Laplacian矩阵定义为无向图的节点度矩阵与邻接矩阵之差,其中邻接矩阵则由固有权值、已练习权值和待练习权值叠加生成。因为知识点的“name”参数取自电子题库文件的行号,所以,诸如“level1”这样的行会让知识点号有跳号,生成Laplacian矩阵的第一步就需要把link文件中的知识点号转换为无跳号的知识点号,并且得到固有权值文件zlap.2。关键脚本如下:
cat 1tiku.txt | cat -n | grep level -v | cat -n | awk '{print $1" "$2}' > zlap.1.translation
cat zlap.1.translation | awk '{system("sed '\''s/ "$2" / "$1" /g'\'' -i zlap.2");}'
所生成的固有权值文件zlap.2格式为(第一个字段是固有权值,后两个字段为知识点号):
1 9 10
1 9 11
1 9 12
1 9 13
……
下一步合并反映学习过程的已练习权值和待练习权值。实现策略是待练习的知识点号写入zlap.input.1文件的同时,再合并上每个学生已经练习过的知识点文件zlap.learned,然后将这些知识点相关所有连线的权值依次加1,关键脚本如下:
cat zlap.input.1 <( find allStudents/ | grep zlap.learned | xargs -i cat {}) \
| xargs -i \bash -c " grep \" {} \\\| {}\$\" zlap.2" \
| awk '{print "1 " $2" "$3}' > zlap.2.learning
cat zlap.2 zlap.2.learning > zlap.2.all
其中<(xxx)是Linux脚本中不常用的嵌入输入数据管道,功能是将命令xxx的执行结果作为cat命令除zlap.input.1之外的那一部分输入数据流。
至此,知识点网络的固有权值、已练习知识点对应的权值和待练习知识点对应的权值已合并到总权值文件zlap.2.all中,最后即由该文件生成节点度矩阵和邻接矩阵进而得出Laplacian矩阵及其特征值。关键脚本如下:
1 seq 49 | xargs -i bash -c " grep \" {} \\\| {}\$\" zlap.2.all | awk 'BEGIN{s=0;}{s=s+\$1;}END{print s}' " \
2 | sed '1i d=[' | sed '$a ];' | tr '\n' ' ' > zlap.3.degree
3 seq 49 | xargs -i bash -c "sed 's/^/{} /g' <(seq 49)" \
4 | xargs -i bash -c "echo -n hi: ; grep \" {}\$\" zlap.2.all | awk '{print \$1}' \
5 | awk 'BEGIN{s=0;}{s=s+\$1;}END{print s}' \
6 | sed 's/\$/,/g' " | sed 's/hi:\([0-9]\)/\1/g' | sed 's/hi:/0,\n/g' \
7 | xargs -n 49 | sed 's/,$/;/g' | sed '1i a=[' | sed '$a ]; ' | tr '\n' ' ' > zlap.4.adja
8 cat zlap.3.degree zlap.4.adja | sed '$a eig(diag(d)-a-a'\'')' | octave 2> /dev/null
其中,首先生成节点度矩阵,算法见第1行。遍历每个节点并从总权值文件中取出含有该节点号的行,这些行的第1列之和就是此节点的度,所有节点的度组成的对角矩阵即为节点度矩阵。其次由总权值文件生成邻接矩阵,即对总权值文件进行扩充,把没有连接关系的节点对的位置写上数值0,见第3~6行,其中第3行再次应用信息扩充生成所有知识点号的全交叉。最后求取特征值用到的命令是octave,其要求的矩阵格式转换与矩阵运算代码见第2、7、8行。
在只有固有權值的情况下,求取特征值的结果如下:
ans =
-5.7033e-15
1.7428e+00
5.0000e+00 ……
9.8136e+01
其中反映出知识点网络的连通性指标是1.7428,计算耗时不足1秒(配置为Intel 酷睿i5-3230M、内存4GB、Ubuntu x64、octave版本4.0.0)。当存在已练习权值和待练习权值时,连通性指标必将增加,关键是要找到让增加量最大的情况:自变量是待练习的知识点号,因变量是知识点网络的连通性指标。
四、应用场景与性能测试
本文列举典型应用场景的功能需求及其实现方法,并对所得结果做了相应的对比分析。其中,针对学生个体的一步最优推荐是学生个性化学习时最常用的场景,针对班级整体的最优推荐则是为教师推荐作业和习题课内容的场景。
1.针对学生个体的一步最优推荐
学生基于知识点网络的学习过程就是反复练习所关注的知识点,每当练习完某个知识点,该知识点号被存入服务器上每个学生已经练习过的知识点文件zlap.learned中。在求取知识点网络的连通性指标时,与文件zlap.learned中知识点相关的知识点之间连线的权值就会加1。根据代数图论中图的叠加理论可知,邻接矩阵中的权值变大则Laplacian矩阵相应的特征值均变大[3],特别地,Laplacian的第二小特征值即连通性指标必将增加,反映出知识点网络更强的连通性,符合常识。由此,只要遍历所有待练习的知识点、相应地改变邻接矩阵的权值并多次求取Laplacian矩阵的特征值就能断定应学习的知识点。用到的脚本如下:
seq 49 | xargs -i bash -c "echo {} > zlap.input.1; ./zlaplacian.cmd " \
| grep ans -A 3 | awk '{if(NR%5==4) print $0}' | cat -n | sort -k 2
其中的zlaplacian.cmd是求取一次连通性指标的脚本,其内容前已述及。
在只有固有权值而没有已练习知识点的情况下,求取的最优推荐知识点及其连通性指标如表1所示。表1中的结果说明,学习者与固有权值情况下1.7428的连通性指标相对照,按最优推荐的知识点学习,则连通性指标有约50%的提升,而第6个最优推荐知识点的连通性指标则改进甚微。由此可见,此49个知识点的电子题库中只有5个知识点能让连通性指标有较为显著的改进,因此最优知识点推荐策略相比随机推荐有相当大的优势。
值得一提的是,针对学生个体的一步最优推荐知识点是“统计词频”,这与笔者基于此电子题库的教学实践相吻合。该知识点一般都在前几次课引入,而且大多数学生都在学习完此知识点之后感觉对Linux脚本的理解程度有了一定的质变。此外,前5个最优推荐的知识点都是关于echo命令的,而且其中3个知识点还十分基础,这符合Linux脚本中“一门深入”的练习策略。实际上,echo确实是表面上很简单但实际上很难的命令,它串起了Linux脚本中几乎所有的功能点,通过反复练习和试错可以发现它的诸多疑难功能点,从而激发学习的兴趣。另外,还可以不断强化这些功能点:命令和参数的不同、不使用输入数据流、回车符是否存在的验证方法、命令管道中的信息放入数据管道中、回显二进制数据以及生成一行数据和多行数据。
2.一步最优推荐代码的性能测试
以上实现的一步最优推荐计算引擎位于服务器上,为降低服务器并发处理的负荷,计算引擎还可以用JavaScript实现在前端浏览器上。现代浏览器运行高性能矩阵运算库Math.js时可以用GPU加速,对于一般配置的计算机在性能上可能不输于多人共用的服务器[5]。利用Math.js库在浏览器端作矩阵运算,实测性能大约7秒遍历所有49个知识点,即完成一步最优推荐(配置:Intel 酷睿i5-3230M、内存4GB、64位Chrome浏览器),能够满足学生个性化学习推荐的实时性要求。关键JavaScript代码如下:
links = this.responseText.split('\n');
seq49 = Array.from(new Array(49), (item, index) => index + 1);
seq49.map( N =>{
allLinks = links.concat(links.filter(b=>b.includes(" "+N+" ")||b.endsWith(" "+N)).map(a=>{
return "1 "+a.split(' ')[1]+" "+a.split(' ')[2]; }) );
allDegrees = seq49.map( a=> {
return allLinks.filter(b=>b.includes(" "+a+" ")||b.endsWith(" "+a)).map( b=>{
return b.split(' ')[0]; }).reduce( (a, b) => parseInt(a)+parseInt(b)); });
D = math.matrix( math.evaluate("diag([".concat(allDegrees).concat("])")) );
var pA= [];
seq49x49 = seq49.map( a=>{ return seq49.map( b=>""+b+" "+a); }).flat();
seq49x49.map( a=>{ Edges= allLinks.filter( b=>b.endsWith(" "+a));
if( Edges.length!=0)
pA.push("" +Edges.map(b=>{return b.split(' ')[0]}).reduce((a, b)=> (a-0)+(b-0)));
else pA.push("0"); });
mA = math.multiply(math.matrix(math.evaluate("[["+arrTrans(49,pA).join("],[")+"]]")),-1);
eigs= math.eigs( math.add( D, math.add( mA,math.transpose(mA))) ).values;
console.log( N ); console.log( eigs._data[1] );
});
以上代码中的输入文件links是Ajax異步访问固有权值文件zlap.2的结果,节点度矩阵与邻接矩阵的算法与之前Linux脚本的实现完全相同,最终求取矩阵特征值时调用的不再是Linux服务器上的octave命令,而是Math.js库提供的函数。代码的难点在于“(a-0)”和“(b-0)”使用了JavaScript的弱类型特性将字符串转为数值,另外,定制的函数arrTrans将一维数组转换成二维数组,类似Linux脚本中的xargs -n功能。
通过在教学中着重对比引入同一功能的Linux脚本实现和JavaScript语言实现,大多数学生从常见功能上获取了从Linux脚本语言向JavaScript语言的自主学习迁移能力:map类似xargs–i、filter类似grep、push相当于sed–i、concat相当于cat、reduce相当于tr '\n' ' ' | bc。学生在对比Linux脚本语言和JavaScript语言的过程中,以很小的学习成本从顶层上掌握了JavaScript语言,创造力得到了极大锻炼,对编程语言类课程实现了一定程度的融会贯通。
3.针对学生个体的多步最优推荐
以学生个体的一步最优推荐为基础,实现多步最优推荐只需要将待练习的知识点号写入zlap.input.1文件,不同仅在于前者只写一个知识点号而后者写多个知识点号。例如,基于49个知识点号的信息扩充,即得到2401种两步学习的可能性,要在这里找学生个体的两步最优推荐,关键代码如下:
seq 49 | xargs -i bash -c "sed 's/^/{} /g' <(seq 49)" \
| xargs -i bash -c "echo {}| tr ' ' '\n' > zlap.input.1 ; echo {}; ./zlaplacian.cmd"\
| grep ans -A 3 -B 1 | awk '{if(NR%6==5 || NR%6==1) print $0 }' | xargs -n 3 | sort -k 3
其中,第1行代码再次用到知识点号的信息扩充策略生成所有学习方案;第2行把每个两步学习可能方案的知识点号写入zlap.input.1文件,然后显示此学习方案并求取连通性指标。
代码的运行结果如表2所示,可见两步最优推荐的知识点就是前几个一步最优推荐知识点的组合。因此,针对此题库两步最优推荐完全可以拆分成两次一步最优推荐。此外,遍历2401种两步学习方案耗时也超过5分钟,目前尚不适合作实时推荐。
4.针对班级或学习小组的最优推荐
针对班级或学习小组作最优推荐仅是针对学生个体最优推荐的简单扩展。学生个体练习过的知识点存放在其单独的zlap.learned文件中,每行有一个知识点,只要求取这些知识点对应的已练习权值并全合并到总的权值文件zlap.2.all即可,其余的工作完全等同于针对学生个体推荐的情况,实现过程不存在任何技术难度,性能上也没有引入任何瓶颈,不再赘述。
五、教学实践分析
笔者在2019年春季学期、2019年秋季学期和2020年春季学期试用了Linux脚本的知识点网络电子题库。人数和班级数依次是3个班级共70人、6个班级共244人和4个班级共173人,大约按1∶1的人数比组织对比教学。结合教师的统一授课,学生在课堂上用一半时间巩固复习,按随机推荐知识点练习或基于一步最优推荐的最优知识点开展练习。实际测试结果表明,按最优推荐知识点学习的学生有很强的主动性,课堂学习效果如图3所示,学习的目标也更明确。师生问答法测试结果表明,学生掌握整体知识结构的速度明显更快,学生反映“很快能看懂并能略微修改多级组合的复杂Linux脚本”并且“能简单创造两三级脚本的组合”。由此可见,基于知识点网络的实时一步最优推荐系统,可以很好地满足巩固复习阶段对知识点的最优练习策略。
图3还反映出学生喜欢使用手势来分析知识点之间的连接关系。实际上,多使用手势这种具像的动作有助于引导大脑内部强化特定知识点之间的联系,手势可以提高创造力是心理学界近年的研究成果[6]。在细节方面,学生喜欢用手指类似走迷宫的方式探索低级知识点向高级知识点的进化过程,厘清相似知识点的差异和应用场合的区别。学生整体上喜欢在小组学习时用双手的不同手势向同伴展示某些知识点的类别划分,加速小组的互学互助。小组讨论和创造的氛围很好,自我认知内驱力得到极大增强。例如,针对“生成两列数1到5”这个知识点,明显不满足于电子题库中的一种实现方法,并在教师的引导下得到了以下多种解法(此处略去简单的变体):
方法一:seq 5 | sed p | xargs -n 2即生成5行数,然后每行复制一次再两行合并为一行。
方法二:seq 5 | xargs -i echo {} {}即生成5行数再每行显示两次。
方法三:paste <(seq 5) <(seq 5)即利用嵌入输入数据管道直接拼接为两列。
方法四:seq 5 | cat -n即生成5行数再加行号。
方法五:seq 5 | sed 's/\(.*\)/\1 \1/g'即用sed将每行内容复制一次。
方法六:seq 5 | grep . -o -n | sed 's/:/ /g'即用grep只显示匹配的内容和行号,并删除多余的冒号。
方法七:seq 5 | awk '{print $0" "$0}'即用awk将每行内容复制一次。
方法八:echo {11..15} | tr ' ' '\n' | sed 's/^\(.\)/\1 /g'即生成11到15再把每个数放一行,最后把每个数字分开。
方法九:echo {11..15} | sed 's/\(.\)\>/ \1 /g' | xargs -n 2即先把每个数字分开再两行合并为一行。
方法十:seq 5 | xargs -i echo -e "\x3{} \x3{}"即用16進制转换的方式把\x31显示为数字1,\x32显示作数字2,以此类推。
方法十一:用octave作矩阵的转置,具体脚本为echo {1..5} | sed p | sed '1i a=[' | sed '$a ]'\''' | octave。
六、结语
全面应用信息技术推动教育信息化是“三教”改革的研究重点。本文基于知识点网络形式的电子题库,研究了待学习知识点的最优推荐策略,为巩固复习阶段进行个性化练习提供了最优指引。此外,本文在学生创造力培养方面做了积极有益的探索。学生切实体验了功能块对编程语言的细节屏蔽性、功能块少而精和复杂算法靠人来创造的学习策略。强化练习少数编程语言细节无关的功能块,并以此创造问题的多种解法,而不同编程语言的差别只在于用该编程语言相关的细节实现这些功能块。
事实上,使用任何编程语言,在功能块层面上组合创造的思路都是一样的。因此,功能性编程作为Linux脚本语言和大数据Spark环境原生Scala语言的最大优势,逐渐也引入到JavaScript语言和Java语言中,优势在于程序易测试、易掌控和易并行化,算法实现上需要对功能块作创造性组合,而对语言细节的依赖程度更低。学生在对比Linux脚本语言和JavaScript语言的过程中,以很小的学习成本从顶层上掌握了JavaScript语言,创造力得到了极大锻炼,对编程语言类课程实现了一定程度的融会贯通。
本文所述的最优知识点推荐策略尚有几个值得深入研究的方向。一是类似英语这种大型的知识点网络,例如,基于Oxford 3000单词表及例句库作最优推荐算法的耗时太长,不但要研究知识点网络的最优切分,还需要用Scala/Spark在服务器上开展多机并行计算,甚至还要性能更强的芯片时序分析软件(PrimeTime)实现全路径的学习过程分析。芯片中各级触发器之间的时序路径类似知识点网络中的连线路径,值得深入研究。二是在关键代码之上扩展更多的实用功能,例如,与个人的遗忘曲线联系起来以全面记录学生的练习过程,还要与人工智能技术相结合,让集体学习过程历史大数据驱动的规则推荐和知识推荐更有益于学生个体的学习过程,让班级整体学习力更有效地推动个体学习。实现更加符合学生个体学习力的定制化最优知识点推荐。三是研究固有权值可动态改变并反映知识点创造过程的知识点网络。当前电子题库中每个知识点只提供了一种解决方法,实际上,一个问题可以有很多解决方法。另外,好的学生可以边学习“旧”方法,边创造“新”方法,更难的情况是尚不明确如何设定知识点网络的固有权值,可能需要借鉴异步电子设计中组合逻辑环的破环技术或者控制理论中的多步动态优化问题[7]。
参考文献:
[1]国发[2019]4号.国务院关于印发国家职业教育改革实施方案的通知[Z].
[2]赵鸿昌.基于芯片仿真验证软件实现的一种试题库与试卷库建设方法[J].中国教育信息化,2018(14):89-92.
[3]Chris Godsil,Gordon Royle..Algebraic Graph Theory[M].New York:Springer,2001.
[4]Michael M. Zavlanos, Magnus B. Egerstedt, George J. Pappas. Graph-Theoretic Connectivity Control of Mobile Robot Networks[J].Proceedings of the IEEE,2011(9):1525-1540.
[5]Math.js.An extensive math library for JavaScript and Node[EB/OL]. https://mathjs.org/,2020.
[6]刘秀英.新闻月评[J].少年儿童研究,2017(1):61-62.
[7]Svetlozar T. Rachev, Ludger Ruschendorf.Mass Transportation Problems Volume I[M].New York: Springer,1998.
(编辑:王晓明)