本发明涉及评分领域及机器学习领域,它特别涉及一种基于随机森林的c语言源代码静态评分的构建方法。

背景技术:

c语言源代码静态评分是指对根据一定的题目描述做出解答的c语言源代码进行评分。目前,主要流行的评分方法为样例评测方法,即对所做出解答的c语言源代码测试一定的样例,根据所输出正确答案的所占比例进行评分。这种方法忽略了源代码内在的逻辑性得分,只能针对最终的答案进行评分,这对于非计算机专业以及编程初学者并不友好,对于部分正确的代码不能给出相应的分数。为此,我们提出了一种基于随机森林的c语言源代码静态评分方法。

技术实现要素:

本发明的目的是为了解决现有技术中存在的缺点,而提出的一种基于随机森林的c语言源代码静态评分方法。

为了实现上述目的,本发明采用了如下技术方案:

一种基于随机森林的c语言源代码静态评分方法,包括以下步骤:

s1:定义c语言源代码特征为由行结点构造成的关系表;

s2:建立c语言源代码的语法树;

s3:分析c语言源代码的特征种类;

s4:根据s2中的语法树对c语言源代码进行特征提取;

s5:构建随机森林分类器;

s6:对c语言源代码进行静态评分。

优选的,所述s1中c语言源代码特征行结点为:对c语言源代码的每一行构建行结点,行结点信息包括:行号,行源代码,变量列表,函数列表,结点类型;关系表为由行结点信息构建成的二维关系表。

优选的,所述s2中c语言源代码的语法树为:一个由行结点根据代码嵌套关系构造而成的多叉树,语法树中每一层结点为同一个花括号中的结点;构建方法为:首先,对c语言源源代码进行预处理,预处理操作包括分行,去除注释,去除头文件等操作;其次,对预处理过的c语言源源代码进行构建行结点;接着,由c语言入口函数main为根节点进行构造语法树,每一个行结点的父亲结点为当前树的根节点,每进入一个左花括号则开始构建一棵子树,子树的根节点为左花括号所在的结点,遇到右花括号则当前子树构建完毕,直至c语言代码最后一行,则c语言源代码的语法树构建完成。

优选的,所述s3中c语言源代码的特征种类为:行结点本身的特征,包括赋值,声明,调用,控制,单路分支,多路分支,循环;行结点与行结点之间的特征关系,包括顺序,并列,进入,跳出。

优选的,所述s4的c语言源代码的特征提取方法为:对于结点本身的特征可以通过对c语言的关键字检测实现,如:检测循环语句时可以通过对当前行检索for,while关键字进行确定;对于结点与结点之间的关系特征则需要通过s2中的语法树进行实现,操作为:同一层的兄弟结点的关系为顺序或者并列,直系子树与父亲结点的关系为进入或者跳出,语法树的存在可以很方便快捷的处理存在多层嵌套的代码。

优选的,所述s5随机森林分类器为:随机森林是机器学习中一个分类算法,使用已标注好的数据进行训练,属于监督学习和集成学习的一种;构建方法为:在此我们的标注数据为人工评分过的c语言源代码,人工评分等级为a,b,c和d,将人工评分的c语言源代码按照s3所述的方法提取出特征,将特征送入随机森林分类器进行训练,待模型收敛后得到随机森林模型。

优选的,所述的s6的c语言源代码静态评分操作为:将待测的c语言源代码进行预处理,对预处理后的c语言源代码按照s5所示进行特征提取,将提取后的特征送入s5得到的随机森林分类器后,即可得到最终的评分结果。

本发明提出的一种基于随机森林的c语言源代码静态评分方法,有益效果在于:本发明在应用的过程中,解决了c语言源代码特征的定义、c语言源代码特征的提取及c语言源代码特征的评分,与现有的评分方法相比,本方法可以对未通过全部测试样例的源代码进行评分,可以对c语言源代码内在的逻辑性进行评分,十分适合初学者以及需要锻炼编程的人;本方法使用随机森林分类器,计算开销小,且模型的抗扰动效果较好,误差较小,为静态评分提供了较好的结果。

附图说明

图1是本方法一种基于随机森林的c语言源代码静态评分方法的流程图;

图2是本方法一种基于随机森林的c语言源代码静态评分方法的随机森林分类器构建的流程图。

图3是本方法一种基于随机森林的c语言源代码静态评分方法的随机森林模型构建说明图。

图4是本方法一种基于随机森林的c语言源代码静态评分方法的随机森林基分类器决策树的说明图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。

实施例1

如图1,一种基于随机森林的c语言源代码静态评分方法,步骤包括:s1:选择待评测的c语言源代码文件;s2:对带评测的c语言源代码进行预处理;s3:对待评测的c语言源代码进行特征提取;s4:将提取到的特征送入训练好的随机森林分类器;s5:得到最终的对选定的c语言源代码文件的评分结果。

对c语言源代码的预处理的步骤为:将选定的c语言代码按照分号换行,每一行只有一句代码,并去除头文件与注释。

对c语言源代码的特征提取步骤为:对每一行代码建立行结点,再由行结点构建语义树,最终通过构建的语义树得到c语言源代码的流程特征。

对随机森林分类器的构建为:建立随机森林分类器模型,通过输入已评好分的c语言源源代码模板进行训练随机森林分类器。

对c语言源代码的评分步骤为:当由随机森林分类器得出的评分在90分以上评定为a,评分在80~90范围内评定为b,评分在70~80范围内评定为c,评分在60~70分评定为d,小于60分视为不及格。

实施例2

如图2,一种基于随机森林的c语言源代码静态评分方法,其随机森林算法分类器的决策步骤为:s1:选择一个c语言题目;s2:导入已评好分的c语言源代码;s3:对所有评好分的c语言源代码进行预处理和特征提取;s4:随机森林分类器开始训练;s5:随机森林分类器达到训练标准,结束训练,最终得到了该题目的随机森林分类器。

对c语言源代码的预处理的步骤为:将选定的c语言代码按照分号换行,每一行只有一句代码,并去除头文件与注释。

对c语言源代码的特征提取步骤为:对每一行代码建立行结点,再由行结点构建语义树,最终通过构建的语义树得到c语言源代码的流程特征。

对随机森林分类器的训练步骤为:将提取到的c语言源代码的特征作为输入,输出为对输入的c语言源代码的评分,每次迭代时将模型的输出评分的损失进行反向传播调整模型分类器的参数,迭代直至模型收敛,即误差小于设定的阈值或者迭代次数大于设定的阈值,训练结束后即得到本题目的随机森林分类器。

实施例3

如图3,一种基于随机森林的c语言源代码静态评分方法,其随机森林模型构建步骤包括:s1:选择已评好分的c语言源代码数据集;s2:对选择的数据集进行bootstrap采样生成若干份子数据集;s3:对若干份子数据集进行特征提取;s4:将提取到的特征集分别送入决策树中进行训练;s5:根据每个决策树的输出结果投票选择出投票数最多的评分等级为输出结果。图中①②③④分别为在训练过程中选择的特征,可能依次为:顺序,分支,并列,跳出等。

对已评好分的c语言源代码数据集的数据集为:数据集为c语言源代码以及人工评定本源代码的评分等级。

对选择的数据集进行bootstrap采样,采样步骤为:bootstrap为随机有放回采样,即从原始样本中进行有放回采取k个子数据集。

对若干份子数据集进行特征提取步骤为:对每一个c语言的代码进行预处理,然后对每一行代码建立行结点,再由行结点构建语义树,最终通过构建的语义树得到c语言源代码的流程特征。

对将提取到的特征集分别送入决策树中进行训练,训练步骤为:将提取到的特征集送入决策树训练直至训练结束,训练结束的条件为决策树生长到了设定的高度,或者误差小于一定的阈值,决策树为一个根据特征数据集进行分类的分类树。

对根据每个决策树的输出结果投票选择出投票数最多的评分等级为输出结果,投票步骤为:对k个决策树的评分结果进行统计,选择最多的统计结果,作为最终随机森林的结果。

例如:有10棵决策树,其中5棵决策树将代码评定为a,3棵评定为b类,1棵评定为c类,1棵评定为d类,则最终选择出现次数最多的a类作为最终输出结果。

实施例4

如图4,一种基于随机森林的c语言源代码静态评分方法,其随机森林基分类器决策树的决策流程为s1:提取选定的c语言源代码的代码特征;s2:将提取到的特征输入到当前的决策树中;s3:根据决策树的决策流程输出当前决策树的决策结果。

对c语言源代码的特征提取步骤为:对每一行代码建立行结点,再由行结点构建语义树,最终通过构建的语义树得到c语言源代码的流程特征。

对选取到的特征输入到当前的决策树步骤为:在随机森林分类器中有众多的决策树模型,由初始数据集划分而成的子数据集对应一个决策树模型,将选取的特征集合输入当对应的决策树模型中。

对根据决策树的决策流程输出当前决策树的决策结果步骤为:根据所输入的特征集合计算每个决策树结点的划分结果然后进入下一层的决策树结点直至到决策树的叶子结点(即决策树的最后一层结点),根据叶子结点的输出概率划分当前决策树的决策结果。在0.9~1内评定为a,在0.8~0.9范围内评定为b,在0.7~0.8范围内评定为c,在0.6~0.7分评定为d,小于0.6分视为不及格。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。

随机森林c语言编程,一种基于随机森林的C语言源代码静态评分方法与流程相关推荐

  1. python随机森林筛选变量_一种基于随机森林的改进特征筛选算法

    刘云翔 陈斌 周子宜 摘  要: 肝癌是一种我国高发的消化系统恶性肿瘤,患者死亡率高,威胁极大.而其预后情况通常只能通过医生的专业知识和经验积累来粗略判断,准确率较差.因此文中在分析随机森林算法的基本 ...

  2. java调试生命周期,一种基于JAVA的智能合约生命周期的管理方法与流程

    本发明涉及区块链技术,尤其涉及一种基于JAVA的智能合约生命周期的管理方法. 背景技术: 区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改,区块链上的交 ...

  3. FLAC3D可视化后处理matlab,一种基于Matlab的由Midas导入Flac3D的模型识别方法与流程...

    本发明涉及岩土工程的仿真模拟研究领域,具体涉及一种基于Matlab的由Midas导入Flac3D的模型识别方法. 背景技术: 随着我国近几年经济的快速发展和基础设施等的大力投资,涉及复杂地质环境下的岩 ...

  4. java头像交互式差分演变_一种基于交互式差分进化计算的用户知识需求获取方法与流程...

    本发明属于知识服务领域,具体涉及一种基于交互式差分进化计算的用户知识需求获取方法. 背景技术: 在多数企业拥有庞大的知识数量和优质的知识资源的情况下,如何利用推送系统将知识主动推送给设计人员以提高企业 ...

  5. Android布局动态化,一种基于堆积木思想的卡片式Android动态布局方法与流程

    本发明涉及android界面布局,特别是一种基于堆积木思想的卡片式Android动态布局方法. 背景技术: 在Android流行的今天,android App在生活中使用日益广泛,相对PC,手机由于界 ...

  6. 距离矢量算法matlab实现,一种基于最小费用距离模型的城市生态网络构建方法与流程...

    本发明涉及生态网络构建技术领域,特别是涉及一种城市网络的构建方法. 背景技术: 最小费用距离是网络分析的一种计算方法,这种方法被用于物种保护.自然保护区功能规划.动物栖息地的确定.区域生态安全格局设计 ...

  7. dbpedia知识图谱java_一种基于DBpedia的水务领域概念知识图谱构建方法与流程

    本发明涉及的是领域知识图谱构建技术领域,涉及到一种基于DBpedia的水务领域概念知识图谱构建方法,特别涉及到一种基于Jaccard相似度算法与随机游走相似度算法结合的协同过滤模型框架,用于补全概念模 ...

  8. matlab 重叠峰分解 算法,一种基于粒子群算法的光谱重叠峰分解方法与流程

    本发明涉及一种基于粒子群算法的光谱重叠峰分解方法. 背景技术: 由于探测器能量分辨率等原因,峰位接近且峰宽较大的不同谱峰之间常常出现严重重叠干扰的现象,要对光谱作进一步较为准确.全面的成分定量和定性分 ...

  9. 手机室内地磁定位软件_一种基于手机地磁和场景图像的室内定位方法与流程

    本发明属于室内定位领域,具体涉及一种利用地磁和场景图像搭建地图,并用卷积神经网络提取出位置特征,以粒子滤波算法进行动态定位的方法. 背景技术: 室内定位技术在现在的提高我们的日常生活便利中起着非常重大 ...

最新文章

  1. Thinkpad产品预装Win7系统一键恢复方法介绍
  2. slider控件控制文本框字体大小
  3. MyEclipse 8.5安装Aptana
  4. checkboxlist与数组结合用的技
  5. 2016年2月流量入口占比动态:搜索引擎大涨2.14%
  6. 2018-08-03北大青鸟S1结业 项目MyKTV的总结
  7. shll脚本带参数输入给导出的数据库文件命名以及创造路径
  8. mybatis分页应用
  9. 基础SQL第二课:约束
  10. 如何解决切换双系统导致windows没声音的问题
  11. Spring-IOC与AOP是解决什么问题的?
  12. opencv基础笔记
  13. 有什么样的将军就有什么样的兵
  14. 电脑管家卸载后留下的一个叫 电脑管家-安全注册 的进程,无法关闭。展开的服务是 qmbsrv
  15. cnpm 淘宝镜像下载安装图文
  16. matlab距离判别分析的应用
  17. 3d建模基础入门教程,3D建模各行业之间的发展趋势
  18. 1数据类型、ER图、范式
  19. BUUCTF [INSHack2018]Tricky-Part2
  20. DHT网络原理制作bt采集蜘蛛,开源版

热门文章

  1. Rabbit的Windows安装
  2. c语言日期编程,C语言编程计算第二天日期示例代码
  3. python opencv 界面按钮_PyAutoGUI:自动化键鼠操作的Python类库
  4. 一款神仙接私活儿软件,吊到不行!
  5. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL
  6. Linux最常用命令:简单易学,但能解决95%以上的问题
  7. java基础提升篇:synchronized同步块和volatile同步变量
  8. java基础(三) 加强型for循环与Iterator
  9. 蓝桥杯java第三届决赛第四题--DNA比对
  10. 综合应用题:多线程复制文件(知识点:多线程、随机读写流)