随机森林c语言编程,一种基于随机森林的C语言源代码静态评分方法与流程
本發明涉及評分領域及機器學習領域,它特別涉及一種基于隨機森林的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语言源代码静态评分方法与流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c调用易语言串口,易语言串口API源码
- 下一篇: c语言如何给阻塞函数加超时,在代码中写一