摘要:在數(shù)據(jù)庫教學(xué)中,SQL(結(jié)構(gòu)化查詢語言)實踐是核心內(nèi)容。為了提高SQL代碼評價的準(zhǔn)確性和便捷性,亟須建立一個SQL代碼自動評分程序。首先,使用學(xué)習(xí)通平臺收集SQL代碼作業(yè)集;然后,利用Python程序整理作業(yè)集,分解每個學(xué)生提交的SQL代碼。接著,對SQL代碼進(jìn)行預(yù)處理和規(guī)范化,分析其語義結(jié)構(gòu)以提取特征,按關(guān)鍵字和特征值進(jìn)行分段處理。最后,采用編輯距離算法實現(xiàn)自動評分策略,從而實現(xiàn)SQL代碼的自動評分。該程序有效提高了SQL代碼評分的自動化水平,進(jìn)一步促進(jìn)了數(shù)據(jù)庫教學(xué)效果。
關(guān)鍵詞:SQL代碼;編輯距離;數(shù)據(jù)庫;自動評分;Python
中圖分類號:TP311.51文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2024)35-0059-03開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
0引言
隨著互聯(lián)網(wǎng)、大數(shù)據(jù)和人工智能技術(shù)的快速發(fā)展,數(shù)據(jù)庫課程已成為計算機(jī)專業(yè)的必修課。掌握SQL語言(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)是學(xué)好數(shù)據(jù)庫課程的關(guān)鍵,而編碼實踐則是掌握SQL語言的核心。因此,SQL語言實訓(xùn)作業(yè)的完成質(zhì)量直接影響學(xué)生對數(shù)據(jù)庫實踐操作的掌握能力[1]。然而,由于實訓(xùn)作業(yè)工作量大且答案可能不唯一,教師采用人工批改的方式不僅工作量繁重,而且消耗大量精力,效果往往事倍功半。
目前,SQL代碼自動評分主要分為動態(tài)判斷和靜態(tài)分析兩種方法。動態(tài)判斷通過直接執(zhí)行SQL代碼并對結(jié)果進(jìn)行判讀,結(jié)果正確則評分為正確,結(jié)果不正確則得0分。靜態(tài)分析則通過評判SQL代碼的結(jié)構(gòu)和特征,對關(guān)鍵字、關(guān)鍵值等進(jìn)行評分。全國計算機(jī)等級考試中的MySQL科目采用了靜態(tài)分析進(jìn)行評分。
本文借鑒了自動評分技術(shù)的相關(guān)理論,采用靜態(tài)分析方法,使用Python編寫程序?qū)崿F(xiàn)SQL代碼的自動評分。
1SQL代碼自動判定
目前,數(shù)據(jù)庫課程的教學(xué)主要在學(xué)習(xí)通、職教云等平臺進(jìn)行,這些平臺上的相關(guān)數(shù)據(jù)是教學(xué)評價的重要支撐。因此,在收集SQL代碼時,無須單獨開發(fā)程序,而是直接使用教學(xué)平臺進(jìn)行收集。在收集SQL代碼作業(yè)集后,使用Python程序?qū)ψ鳂I(yè)進(jìn)行分解,以便對每一份作業(yè)進(jìn)行單獨評判。本文以學(xué)習(xí)通教學(xué)平臺為例進(jìn)行分析。
完成SQL代碼作業(yè)的整理后,進(jìn)行SQL代碼的預(yù)處理,刪除SQL代碼中的無義字符和多余空格,并將間隔統(tǒng)一為1個空格,然后對各關(guān)鍵字的子句進(jìn)行排序等操作,規(guī)范SQL的基本格式[2-3]。隨后使用Python中的sqlparse庫根據(jù)SQL代碼的關(guān)鍵字或特征進(jìn)行分段,分段后替換SQL同義子句。最后使用編輯距離算法[4]對分段后的SQL代碼子句進(jìn)行相似度檢查,以實現(xiàn)完成效果的自動判定。
基于學(xué)習(xí)通與Python語言的關(guān)系數(shù)據(jù)庫SQL代碼自動評分程序總體流程如圖1所示。
1.1收集SQL代碼作業(yè)集
由于教學(xué)過程在學(xué)習(xí)通平臺進(jìn)行,因此直接使用學(xué)習(xí)通中的作業(yè)模板發(fā)布功能。對于簡單的SQL代碼填空題,可以直接使用學(xué)習(xí)通完成評分。但對于完整的SQL代碼語句或程序,學(xué)習(xí)通平臺無法完成自動評分。此時,需要將其發(fā)布為簡答題,學(xué)習(xí)者在學(xué)習(xí)通中提交答案。隨后直接從學(xué)習(xí)通下載作業(yè)集,并通過自動評分程序進(jìn)行評判。收集SQL作業(yè)集流程如圖2所示。
1.2整理SQL代碼作業(yè)集
下載的作業(yè)集為一個壓縮包,其中包含所有學(xué)習(xí)者的SQL作業(yè),這些作業(yè)以DOC格式的Word文檔存儲。因此,需要使用Python程序?qū)⒚恳环葑鳂I(yè)分別分解出來。作業(yè)將根據(jù)學(xué)習(xí)者的登錄信息(通常為學(xué)習(xí)通賬號或手機(jī)號)進(jìn)行命名,并將DOC格式轉(zhuǎn)換為DOCX格式,以便在Python中使用docx庫進(jìn)行處理。整理SQL代碼作業(yè)集流程如圖3所示。
1.2.1解壓SQL代碼作業(yè)集
SQL代碼作業(yè)集為一個包含所有學(xué)習(xí)者SQL作業(yè)的ZIP壓縮包,可以在Python中使用zipfile庫進(jìn)行解壓。以下是部分核心代碼示例。
1.2.2重命名SQL代碼作業(yè)
由于學(xué)習(xí)者提交的SQL作業(yè)可能未按規(guī)定命名,這將影響后續(xù)評分時與學(xué)習(xí)者的身份對應(yīng)關(guān)系。因此,程序?qū)⒏鶕?jù)學(xué)習(xí)者的登錄信息進(jìn)行統(tǒng)一重命名。如果登錄名為學(xué)號,則按照學(xué)號-姓名格式命名;如果登錄名為手機(jī)號,則按照手機(jī)號-姓名格式命名。其部分核心代碼如下所示。
1.2.3轉(zhuǎn)換SQL代碼作業(yè)格式
由于Python中的docx庫只能處理DOCX文檔,因此需要將重命名后的SQL作業(yè)從DOC格式轉(zhuǎn)換為DOCX格式。需在Python中使用win32com.client庫完成操作。其核心代碼如下所示。
1.3讀取SQL代碼作業(yè)
每份SQL代碼作業(yè)均為一個Word文檔,使用Py?thon中的docx庫可以獲取所有段落信息。通過遍歷段落中的固定格式(如“第一空”“第二空”等),可以提取學(xué)習(xí)者提交的每個SQL代碼作業(yè)[5]。本文以每份SQL作業(yè)僅包含一個SQL代碼語句為例,其獲取SQL作業(yè)的核心代碼如下。
1.4預(yù)處理SQL代碼作業(yè)
由于學(xué)習(xí)者書寫SQL代碼時存在不規(guī)范性以及同一結(jié)果語句的多樣性,為了更準(zhǔn)確地判定SQL代碼的正確性,需要對SQL代碼進(jìn)行規(guī)范化處理。規(guī)范化處理主要包括刪除無意義內(nèi)容和字符、將所有字母轉(zhuǎn)換為大寫、刪除多余空格、將間隔統(tǒng)一為一個空格以及對子句進(jìn)行排序等操作。預(yù)處理SQL代碼作業(yè)流程如圖4所示。
1.4.1刪除無義內(nèi)容
注釋在程序設(shè)計中只是一個備注性的說明,對程序運(yùn)行沒有任何作用。因此刪除SQL代碼注釋相關(guān)的無義的內(nèi)容,使SQL代碼更簡潔。
1.4.2刪除無義字符
SQL代碼書寫時,有時添加了一些回車鍵來對關(guān)鍵字或?qū)傩灾颠M(jìn)行換行,以使語句顯示美觀,對SQL代碼的比較準(zhǔn)確性是無意義的。為了便于比較,應(yīng)刪除回車鍵字符,并用1個空格來代替。
1.4.3整理空格
SQL代碼在書寫時,關(guān)鍵字,屬性值等特征值間用空格間隔,可以為1個或多個空格。為了相似度比較更為準(zhǔn)確,應(yīng)刪除多余的空格。使代碼更為簡潔,提高相似性比較的準(zhǔn)確度。
1.4.4整理語句中字母
SQL代碼是不區(qū)分大小寫的,但有的書寫是用的小寫,有的大寫,有的大小寫混寫。為了統(tǒng)一SQL代碼,將SQL代碼中所有字母轉(zhuǎn)換成大寫形式。
1.4.5排序SQL子句
SQL代碼中各關(guān)鍵字后的子句里面的屬性值是不分先后順序的,因此應(yīng)對其子句中的內(nèi)容進(jìn)行以下排序,以便在相似性比較時,得到更準(zhǔn)確的相似度比較。例如,整理過后的SQL子句為“SELECTD1,D3,CDO2NF2R=O2;M”,為TB了W便H于E相RE似C度O比N1較=1,將AN子D句C進(jìn)ON行3排=3序A,N排D序子句后的SQL語句為“SELECTD1,D2,D3FROMTBWHERECON1=1ANDCON2=2ANDCON3=3;”。
1.5分段子句
在對SQL代碼進(jìn)行預(yù)處理后,SQL代碼已基本規(guī)范,可按關(guān)鍵字等特征進(jìn)行提取和分段記錄,然后對分段后的語句進(jìn)行相似度比較。例如:
這樣在對SQL代碼進(jìn)行判定時,可單獨對關(guān)鍵字和子句或?qū)傩灾颠M(jìn)行分類確定分值比重,從而更符合對SQL代碼完成效果的教學(xué)評價。
1.6轉(zhuǎn)換同義子句
在SQL代碼中,兩個完全不同的代碼可能執(zhí)行相同的結(jié)果,因此在評分時,應(yīng)將這兩種代碼均評定為正確。為便于進(jìn)行相似度檢查,應(yīng)對實現(xiàn)結(jié)果一致的子句進(jìn)行替換。例如子句“Agt;=1ANDAlt;=9”和“ABBEETTWWEEEENN11AANNDD99””執(zhí)進(jìn)行行結(jié)替果換是。一還致有的類,似因于此I應(yīng)N將子“句A可替換成OR子句進(jìn)行連接等可相互替換的子句。
1.7使用編輯距離進(jìn)行相似度檢查
編輯距離(EditDistance)是一種衡量兩個字符串相似度的方法,通過計算將一個字符串轉(zhuǎn)換為另一個字符串所需的最少操作次數(shù)(插入、刪除或替換字符)來得出結(jié)果。在進(jìn)行相似度比較時,按分段后的子句進(jìn)行分類比較,然后對分類比較后的結(jié)果進(jìn)行分類按權(quán)重賦分。編輯距離算法部分核心代碼如下所示。
1.8使用運(yùn)行結(jié)果完成自動判分
為提高SQL代碼自動評分的準(zhǔn)確度,在對SQL代碼子句進(jìn)行分段分類自動判定的基礎(chǔ)上,增加了直接運(yùn)行SQL代碼以檢查運(yùn)行結(jié)果的步驟。這一方法有助于完善SQL代碼在同義轉(zhuǎn)換時未能完全替換所有同義子句的問題。若直接運(yùn)行的分值大于分段分類自動判定的分值,則采用直接運(yùn)行的判分結(jié)果作為最終結(jié)果。
2結(jié)論
本文針對關(guān)系型數(shù)據(jù)庫教學(xué)中的SQL代碼自動評分,不僅基于常用的學(xué)習(xí)通教學(xué)平臺,還確保所有教學(xué)評價數(shù)據(jù)保留在平臺中。同時,通過Python編程實現(xiàn)了自動評判功能。通過對SQL代碼的預(yù)處理、分段、同義子句轉(zhuǎn)換和相似度檢查等步驟,最終實現(xiàn)了SQL代碼的自動評分。該程序有效提高了SQL代碼的評分效率,減輕了教師的工作負(fù)擔(dān),并提升了教學(xué)質(zhì)量。未來研究可考慮引入更多機(jī)器學(xué)習(xí)算法,以進(jìn)一步提高評分的準(zhǔn)確性和智能化水平。
參考文獻(xiàn):
[1]吳嬌嬌,何小衛(wèi),趙洋.關(guān)系數(shù)據(jù)庫SQL代碼的自動評分算法研究[J].計算機(jī)技術(shù)與發(fā)展,2018,28(4):114-118.
[2]莫曉琨.面向SQL習(xí)題的智能評判技術(shù)的研究與實現(xiàn)[D].南寧:廣西大學(xué),2020.
[3]吳嬌嬌.面向關(guān)系數(shù)據(jù)庫SQL代碼的自動評判算法研究[D].金華:浙江師范大學(xué),2018.
[4]葛文馨.SQL代碼相似度檢測算法研究[D].青島:山東科技大學(xué),2020:8-9.
[5]朱鵬偉,黃偉.快學(xué)Python自動化辦公輕松實戰(zhàn)[M].北京:電子工業(yè)出版社,2022:179-184.
【通聯(lián)編輯:謝媛媛】
基金項目:2024年校級白酒生態(tài)智能釀造產(chǎn)教融合專項項目:面向MySQL實訓(xùn)作業(yè)的智能評判技術(shù)的研究與實現(xiàn)(項目編號:LZZX-C-03);全國高等院校計算機(jī)基礎(chǔ)教育研究會計算機(jī)基礎(chǔ)教育教學(xué)研究項目:課程思政與教育評價實踐研究(項目編號:2024-AFCEC-440)