裴志松
(长春工业大学人文信息学院,长春130122)
毕业论文是本科人才培养的重要实践性教学环节,也是学士学位评定的重要依据。但是随着互联网的普及,网络资源方便易得,毕业论文成段复制也给学生的抄袭带来了极大的方便。本文研究和分析了开源的搜索引擎工具Lucene的原理,将Lucene技术应用于毕业论文选题系统中,对上传论文的相似性进行检测,及时发现抄袭论文,防止学生抄袭,进而提高论文质量。
Lucene是Apache软件基金会Jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包。Lucene有两个主要的服务:索引和检索,两者任务是相互独立的。Lucene提供了丰富的API,可以与存储在索引中的信息方便地交互。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便地在目标系统中实现全文检索的功能,这使得开发人员可以根据需要对它们进行扩展。在实际应用中,Lucene只是一个java.jar包。即若想让Lucene真正起作用,还需在其基础上做一些必要的二次开发[1]。
Lucene的系统由基础结构封装、索引核心、对外接口3大部分组成[2],如图1所示。
图1 Lucene体系结构
由图1所示Lucene体系结构可以看出,Lucene代码的组织结构主要包括7个包,每个包都完成特定的功能[3],如表1所示。
Lucene的核心技术包括分词技术、倒排索引技术和检索技术。
表1 Lucene包结构功能表
1.3.1 分词技术
Lucene中所包含的文本分析接口不依赖任何文件格式及语言,索引器若要创建索引文件只需获取到Token流即可。因为Lucene具有良好的可扩展性,用户若要实现中文检索功能只需扩展Lucene中所包含的语言及词法分析接口[4]。
1.3.2 倒排索引技术
Lucenc使用了众所周知的索引结构:倒排索引。因为通常索引是描述某文档包含了某词项。但是用户查询是通过词项来查找文档,需要遍历所有文档才能找到包含该词项的文档。因此,如果以词项为中心,记录每个词项出现的文档,就能更有效率地完成查询过程。
Lucene索引index由若干段(segment)组成,每一段由若干的文档(document)组成,每一个文档由若干的域(field)组成,每一个域由若干的项(term)组成。项是最小的索引概念单位,它直接代表了一个字符串及其在文件中的位置、出现次数等信息。域是一个关联的元组,由一个域名和一个域值组成。文档是提取了某个文件中的所有信息之后的结果,这些组成了段,或者称为一个子索引。子索引可以组合为索引,也可以合并为一个新的包含了所有合并项内部元素的子索引。我们可以清楚地看出Lucene的索引结构在概念上即为传统的倒排索引结构。
1.3.3 检索技术
当用户提交查询请求后,检索程序会从索引数据库中找出所有符合关键词的相关文档。按照现成的相关度数值进行排序,因为跟该关键词相关的所有文档早已计算好。相关度越高的数据,排名就会越靠前。最后将搜索结果页面的内容摘要、链接地址等内容组织起来呈现给用户。这个过程就是检索的基本流程,包括查询词的预处理、文本索引库匹配、相似度和排序计算、文档结果排重和生成结果页。
毕业论文选题系统除了包含教师出题、学生选题、教师审核、学生上传论文等基本功能外,还具有论文检测功能。论文检测,就是对自然语言文本进行相似度计算,在指定论文库中找出两两相似的论文。论文检测主要包括抄袭的界定、倒排索引、随机特征码提取、针对提取的特征码进行搜索、相似度计算并排序等过程。该检测所有排序后的结果均以超链接方式显示,检测人员可通过超链接直接打开论文。本系统中的论文检测是基于Lucene工具包进行索引与检索并进行相似度计算的。
抄袭很难用一个量化指标来确定,目前比较通用的判断方法是:如果文本有10%的内容相似,即认定为抄袭。但是在教学领域,考虑到学生们论文的书写水平和查找参考资料的途径,本系统将相似度阈值暂定为20%,日后可根据实际情况设定合适的阈值。本系统只针对字面上的抄袭进行判定,无法识别对文档思想抄袭的情况。系统的判断结果仅仅作为一种建议,最后由系统管理员对是否抄袭进行确认。
Lucene的检索原理是搜索索引,是一种典型的用空间换时间的做法。检索的时候,需要先对检索内容建立索引,检索词只在索引上进行搜索。所建立的索引是倒排索引,也就是针对关键词,记录该关键词出现的位置、次数、关键词所对应的文件名等信息,这样能快速得到检索结果。相对于检索速度得到的回报,所付出的空间代价是微不足道的,因为文本文件所占用的磁盘空间少,而索引文件大概只占内容大小的30%。主要代码:
采用随机特征码提取算法,提取特征码。该算法将随机算法和特征码向量聚类算法相结合,利用对文档某些位置的词串进行抽样来发现相似的论文。通常特征码会选取多个,每个特征码的取位是随机数,而特征码长度固定[5]。
由于毕业论文文章较长,且题目相似性较大,因此特征码选取不能太少,否则,大量文章的检索关键词相差不多,会造成很高的误判率。特征码长度L即要能区分不同论文,又要考虑到论文间的相似性,因此L一般不小于10个词。特征码由一系列词串组成,从选取位置自左向右,忽略大小写与标点。
特征码选取的位置可以是普通段落也可以是标题或关键词等重要位置。特征码首词位置随机产生,即随机数是在(SminSmax)之间的整数。由于特征码选取的位置对文章检索意义有较大区别,因此采用特征码位置具有不同权值来区分其检索的关键性。
当抽取一定数量和长度的特征码后,对所有特征码进行组合,构成特征向量。Lucene将特征向量在记录中出现的次数、频率、位置的映射来检索,大大提高检索效率。同时,Lucene使用了一套非常优秀的评分机制来对检索出的文档进行相似性排序。这套评分机制综合了检索词的词频、逆文档频率、激励因子(权重)等因素来衡量文档间的相似性,根据预先设定好的阈值进行判断,将相似度大于阈值的论文判定为抄袭论文,以使结果更为合理。搜索分为以下4个部分[6]:
(1)计算特征码词串在各个索引的得分,排序得分确定需要查询的索引集合。选择超过特定阈值的簇或者根据得分排序选取特定数目的簇。假设特征码词串为Q={tq1,tq2,……tqk},索引簇index-1的簇心PC={tq1:w1,tq2:w2,……tqk:wk}。根据式(1)计算特征码词串在索引中评分
(2)计算各特征码的全局文档频率DF值然后再计算全局IDF,主要代码如下:
(3)IndexSearcher是Lucene搜索中最主要的类,Similarity类会调用IndexSearch中的统计函数来获取特征码的DF值和文档总数,本文方法继承并覆盖IndexSearcher中相应的方法docFreq()和maxDoc(),分别返回对应的全局IDF值和文档数,主要代码如下:
实验的论文数据来自2009级毕业生的489篇毕业论文。下面用传统的文本聚类与本文提出的基于Lucene的随机特征码算法进行论文抄袭对比试验,用以确定这2种方法在论文抄袭识别中的效果,见表2。试验所用的计算机配置为CPU2.91,3G内存。
表2 两种方法检测雷同的比较
实验表明,随机特征码算法在查准率和查全率上均有较好结果,且算法随着数据量的增加基本呈线性结构,具有较好的时间复杂度。
针对毕业论文可能出现的抄袭现象,本文探讨了基于Lucene的毕业论文检测方法。在使用Lucene进行检索时,采用随机特征码提取算法,降低了偶然性,提高抄袭检测的查全率和查准率。而且该检测方法复杂性为线性,适合大批量论文的抄袭检测。
需要说明的是本文提出的检测方法只能针对字面抄袭现象,对于思想抄袭无法进行检测。同时,本文只能认定某篇论文为疑似抄袭,即起到一定的筛选和提示作用,最终确定是否为抄袭还需人工慎重辨别。
[1]李永春,丁华福.Lucene的全文检索的研究与应用[J].计算机技术与发展,2010,20(2):13-15.
[2]管建和,甘剑峰.基于Lucene全文检索引擎的应用研究与实现[J].计算机工程与设计,2007,28(2):489-491.
[3]Gospodnetic O,Hatcher E.Lucene in action[M].[s.l.]:Marrning Publications Co,2005.
[4]周凤丽,林晓丽.基于Lucene的Web搜索引擎的研究和实现[J].计算机技术与发展,2012,1(22):140-142.
[5]秦颖,文秋芳,梁茂成.应用随机特征码检测雷同译文[J].外语电化教学,2009,11(130):14-17.
[6]冯汝伟,谢强,丁秋林.基于文本聚类与分布式Lucene的知识检索[J].计算机应用,2013,33(1):186-188.