夏竹青 王竹婷
摘要:采用POI的XWPFDocument對(duì)docx文件內(nèi)容提取,用NLPIR漢語(yǔ)分詞系統(tǒng)進(jìn)行分詞處理,計(jì)算詞頻生成向量,用余弦相似度算法計(jì)算向量間的相似度,最終實(shí)現(xiàn)了一個(gè)C/S的實(shí)驗(yàn)報(bào)告管理系統(tǒng),該系統(tǒng)提供了檢測(cè)報(bào)告缺交情況、班級(jí)內(nèi)報(bào)告的查重、分?jǐn)?shù)匯總等功能,讓教師將更多精力投入到報(bào)告批改的工作中。系統(tǒng)投入使用后,有效減輕了教師的實(shí)驗(yàn)報(bào)告管理工作負(fù)擔(dān),且查重的結(jié)果,也為批改提供了依據(jù),同時(shí)及時(shí)反饋缺交、查重和分?jǐn)?shù)等情況,督促學(xué)生端正態(tài)度認(rèn)真完成實(shí)驗(yàn),獨(dú)立撰寫(xiě)報(bào)告,有效提升了教學(xué)效果。
關(guān)鍵詞:NLPIR;余弦相似度;查重
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2019)07-0100-03
Abstract: XWPF Document of POI is used to extract docx file content, NLPIR Chinese word segmentation system is used to segment words, calculate word frequency generating vectors, and cosine similarity algorithm is used to calculate similarity between vectors. Finally, a C/S experimental report management system is Implemented. The system provides functions of detecting missing reports, reports Duplicate checking in class and summarizing scores, so that teachers can get more Efforts have been devoted to report corrections. After putting the system into use, it effectively lightens the burden of teachers' experimental report management, and the results of the review also provide a basis for the correction. At the same time, it timely feedback the absence of submissions, the check-up and scores, and urges students to complete the experiment correctly and write reports independently, which effectively improves the teaching effect.
Key words:NLPIR; cosine similarity algorithm; duplicate checking
1 背景
由于電子文檔便于保存,查找和維護(hù),目前高校學(xué)生提交的實(shí)驗(yàn)報(bào)告逐步由紙質(zhì)版轉(zhuǎn)向電子版。電子文檔在帶來(lái)便利的同時(shí),也為學(xué)生的抄襲提供了極大方便。為了防止學(xué)生實(shí)驗(yàn)報(bào)告出現(xiàn)抄襲現(xiàn)象以及教師批改完報(bào)告之后需要人工匯總分?jǐn)?shù),統(tǒng)計(jì)缺交情況,這些工作費(fèi)時(shí)費(fèi)力,且容易出錯(cuò),教師急需有效的查重和統(tǒng)分工具來(lái)減輕負(fù)擔(dān),把寶貴的精力投入到更有意義的工作中去。但市場(chǎng)上的查重軟件主要是用來(lái)對(duì)論文進(jìn)行查重的,收費(fèi)昂貴,且無(wú)法檢查班級(jí)內(nèi)部的抄襲情況。為了解決上述問(wèn)題,設(shè)計(jì)了一個(gè)針對(duì)高校電子版實(shí)驗(yàn)報(bào)告特點(diǎn)的桌面軟件,輔助進(jìn)行實(shí)驗(yàn)報(bào)告的管理,實(shí)現(xiàn)班級(jí)內(nèi)的查重、匯總分?jǐn)?shù)和統(tǒng)計(jì)缺交情況,結(jié)果自動(dòng)以excel形式導(dǎo)出,有效降低了教師的實(shí)驗(yàn)報(bào)告管理工作工作量,杜絕學(xué)生抄襲現(xiàn)象,督促學(xué)生認(rèn)真完成實(shí)驗(yàn),獨(dú)立撰寫(xiě)實(shí)驗(yàn)報(bào)告。
2 主要技術(shù)介紹
2.1 余弦相似度算法
余弦相似度算法是最常用的計(jì)算文本相似度的算法。余弦相似度在計(jì)算文本相似度時(shí),首先需要對(duì)文本進(jìn)行分詞,計(jì)算詞頻,然后文本可以用詞頻向量來(lái)表示,它通過(guò)計(jì)算兩個(gè)向量之間的夾角余弦值來(lái)度量向量之間的相似程度[1],文本相似度計(jì)算效果很好,在文本相似度計(jì)算方面獲得廣泛應(yīng)用[2]。計(jì)算方法如公式1所示。
2.2 NLPIR漢語(yǔ)分詞系統(tǒng)
采用中科院的NLPIR漢語(yǔ)分詞系統(tǒng)[3],對(duì)實(shí)驗(yàn)報(bào)告文本進(jìn)行分詞,NLPIR基于交叉信息熵算法,能自動(dòng)計(jì)算并提取關(guān)鍵詞,并實(shí)現(xiàn)了自適用分詞和標(biāo)注詞性,因此是文本分詞的不二選擇,得到了廣泛認(rèn)可和應(yīng)用。
2.3 POI
本系統(tǒng)采用apache放入POI中對(duì)word進(jìn)行讀寫(xiě)操作,POI支持office2003和2007,Excel2003和2007[4]。apache的開(kāi)發(fā)團(tuán)隊(duì)一直對(duì)POI進(jìn)行更新維護(hù),功能豐富且完備。其中的hwpf模塊可以實(shí)現(xiàn)word的doc文件的讀寫(xiě)操作。xwpf模塊可以實(shí)現(xiàn)word的docx文件的讀寫(xiě)操作[5]。本系統(tǒng)處理的是docx文件,需要用到xwpf模塊,在讀寫(xiě)操作中涉及到幾個(gè)重要的對(duì)象,這里做個(gè)簡(jiǎn)單介紹,XWPFDocument的對(duì)象表示一個(gè)docx文檔。XWPFDocument又由下面幾個(gè)重要對(duì)象組成的,其中XWPFParagraph對(duì)象表示文檔中的一個(gè)段落。XWPFRun對(duì)象則表示一段具有相同屬性的文本。而XWPFTable對(duì)象表示文檔中的一個(gè)表格。XWPFTableRow表示表格的一行。XWPFTableCell則對(duì)應(yīng)表格的一個(gè)單元格。
3 系統(tǒng)設(shè)計(jì)
3.1 系統(tǒng)功能模塊設(shè)計(jì)
系統(tǒng)主要由五大模塊組成,學(xué)生信息管理和實(shí)驗(yàn)報(bào)告模板管理兩個(gè)模塊維護(hù)基本信息,為檢測(cè)缺交名單、查重和成績(jī)匯總?cè)齻€(gè)模塊的運(yùn)行提供基礎(chǔ)數(shù)據(jù)。系統(tǒng)功能結(jié)構(gòu)如圖1所示。
3.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
采用開(kāi)源數(shù)據(jù)庫(kù)的MySql存儲(chǔ)學(xué)生、班級(jí)和實(shí)驗(yàn)報(bào)告模板信息,具體表的定義如下。
4 系統(tǒng)核心功能實(shí)現(xiàn)
4.1 讀取實(shí)驗(yàn)報(bào)告內(nèi)容
實(shí)驗(yàn)報(bào)告要求學(xué)生統(tǒng)一提交docx文檔,POI可以通過(guò)XW PFWord Extractor和XWPF Document兩種方式讀取docx文檔。 XWPF Word Extractor的內(nèi)部也是引用XWPF Document的,但只能獲得簡(jiǎn)單的文本內(nèi)容和文檔屬性,無(wú)法獲取文檔內(nèi)容的屬性,所以系統(tǒng)使用XWPF Document對(duì)象,它可以獲取文本內(nèi)容的精確屬性信息,比如可以獲取到某一個(gè)XWPF Paragraph,它的字體、字號(hào)和行距等屬性。下面是使用XWPF Document遍歷XWPF Paragraph,讀取實(shí)驗(yàn)報(bào)告文本的主要代碼:
private static String readDocx(String filePath) {
StringBuffer text = new StringBuffer();
OPCPackage pack;
try {
pack = POIXMLDocument.openPackage(filePath);
XWPFDocument doc = new XWPFDocument(pack);
List
for (XWPFParagraph paragraph : paragraphs) {
text.append(paragraph.getText());}
} catch (Exception e) {
}
return text.toString();}
4.2 檢測(cè)缺交名單
可以指定班級(jí)或者選定學(xué)生名單的excel文件,并且選定作業(yè)所在的文件夾,根據(jù)作業(yè)文件的命名格式,提取學(xué)號(hào)和姓名與系統(tǒng)里存儲(chǔ)的班級(jí)學(xué)生進(jìn)行比對(duì),檢測(cè)出沒(méi)有提交作業(yè)的學(xué)生,生成缺交名單。部分實(shí)現(xiàn)代碼如下:
public static List
List
File f = new File(fileDir); //作業(yè)所在文件夾
String[] fileNames = f.list();
List
students = readExcel(nameListFile); //讀取excel中的學(xué)生名單
boolean flag = false;
for (Student s : students) {
flag = false;
for (String fileName : fileNames) {
if (fileName.contains(s.getName()) && fileName.contains(s.getSnum())) {
flag = true;
break; //檢測(cè)到提交了作業(yè),跳出循環(huán)體。
}}
if (!flag) {//如果沒(méi)有提交,則加入缺交列表
absentStus.add(s);}}
return absentStus;}
4.3 報(bào)告查重
報(bào)告是在本班級(jí)范圍內(nèi)進(jìn)行查重,要將每個(gè)學(xué)生的報(bào)告與其他學(xué)生的報(bào)告進(jìn)行相似性檢測(cè),對(duì)相似度大于設(shè)定閾值的報(bào)告寫(xiě)入查重報(bào)告。具體實(shí)現(xiàn)過(guò)程:
第一步:選擇查重的班級(jí)、作業(yè)模板和實(shí)驗(yàn)報(bào)告所在的文件路徑。
第二步:根據(jù)班級(jí)按照序號(hào)查詢(xún)出學(xué)生信息,包含序號(hào),學(xué)號(hào)和姓名
第三步:對(duì)學(xué)生列表進(jìn)行循環(huán), 從指定文件路徑找到學(xué)生的作業(yè),讀取作業(yè)的內(nèi)容;對(duì)內(nèi)容進(jìn)行分詞處理,計(jì)算詞頻,循環(huán)結(jié)束后,生成詞頻矩陣。
第四步:用余弦算法計(jì)算這些詞頻向量之間的相似度,生成相似度矩陣。
第五步:篩選大于閾值的作業(yè),生成查重結(jié)果文件。
4.4 報(bào)告成績(jī)導(dǎo)出
電子實(shí)驗(yàn)報(bào)告中,通常在文檔的最后一行有打分的位置,一般會(huì)設(shè)定得分關(guān)鍵字,測(cè)試數(shù)據(jù)中是“得分(百分制)”。但是部分學(xué)生在實(shí)驗(yàn)撰寫(xiě)過(guò)程中,會(huì)不小心刪除得分的關(guān)鍵字,或者在得分之后又附上一些實(shí)驗(yàn)中的數(shù)據(jù)。這里事先約定,如果文檔中有得分的位置,則在此處打分,否則在文檔的最后一段打分。本模塊首先選定作業(yè)的模板,獲得得分關(guān)鍵字,然后讀取word文件,獲取所有的段落集合,然后依次遍歷段落中是否有得分關(guān)鍵字,有則利用正則表達(dá)式獲得分值,否則,取文檔的最后一段,提取其中的分值。最后將匯總的分?jǐn)?shù)生成excel文件。
下面是讀取某一份報(bào)告得分的部分代碼:
OPCPackage pack = POIXMLDocument.openPackage(filePath);
XWPFDocument doc = new XWPFDocument(pack);
List
for (XWPFParagraph paragraph : paragraphs) {//遍歷各個(gè)段落,查找有打分關(guān)鍵字的段落
String text = paragraph.getText();
if (text != null && text.contains(keyWord)) {
int pos = text.indexOf(keyWord) + keyWord.length();
result += "," + text.substring(pos).trim();
}
}
if (result == "") result = doc.getLastParagraph().getText().trim();
5 結(jié)束語(yǔ)
系統(tǒng)在eclipse平臺(tái)上采用java語(yǔ)言開(kāi)發(fā),用POI提供的API讀取word文檔的文本內(nèi)容。采用中科院的NLPIR漢語(yǔ)分詞系統(tǒng)對(duì)文本分詞,然后用余弦相似度算法計(jì)算相似度,進(jìn)行查重。系統(tǒng)實(shí)現(xiàn)了實(shí)驗(yàn)報(bào)告缺交檢測(cè),在本班級(jí)內(nèi)進(jìn)行報(bào)告內(nèi)容查重并生成查重報(bào)告,讀取報(bào)告中的成績(jī)并生成excel匯總表。系統(tǒng)有效協(xié)助了教師對(duì)實(shí)驗(yàn)報(bào)告的管理,使教師可以集中精力批改實(shí)驗(yàn)報(bào)告。下一步工作,希望采用B/S模式實(shí)現(xiàn)報(bào)告的線(xiàn)上提交,批閱和學(xué)生交互等操作。
參考文獻(xiàn):
[1] 朱浩,連德富,左志宏,等.余弦相似度在高校綜合信息系統(tǒng)中的應(yīng)用[J].東南大學(xué)學(xué)報(bào): 自然科學(xué)版, 2017(A1).
[2] 許浩,周亞萍,趙亞慧.基于余弦文本相似度計(jì)算的英語(yǔ)作文評(píng)分算法的應(yīng)用研究[J]. 教育教學(xué)論壇,2018(6).
[3] NLPIR:在信息檢索中運(yùn)用自然語(yǔ)言處理的理論框架[J].圖書(shū)情報(bào)工作動(dòng)態(tài),2003(3).
[4] 馬杰,魏寧,王霄,等.基于 POI 的 Android 閱讀器設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)與軟件工程, 2013(15).
[5] 黃青云,裴冬菊.POI在Word文檔不同顏色文本分離中的應(yīng)用[J].南昌工程學(xué)院學(xué)報(bào), 2014(3).
【通聯(lián)編輯:謝媛媛】