- 5.03 MB
- 2022-06-17 15:54:22 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
中国科学技术大学硕士学位论文面向中国学习者的英语语法检错系统的设计与实现作者姓名:学科专业:导师姓名:完成时间:王全斌教育技术学吴敏教授二O一三年五月
UniversityofScienceandTechnologyofChinaAdissertationformaster’SdegreeDesignandImplementationofanEnglishGrammarCheckingSystemforChineseLe,a。rnersAuthor’sName:Speciality:Supervisor:FinishedTime:lnlshed1lmeQuanbinWangEducationalTechnologyProf.Min跚JMay,2013
中国科学技术大学学位论文原创性声明本人声明所呈交的学位论文。是本人在导师指导下进行研究工作所取得的成果。除已特别加以标注和致谢的地方外,论文中不包含任何他人已经发表或撰写过的研究成果。与我一同工作的同志对本研究所做的贡献均已在论文中作了明确的说明。作者签名:三越签字日期:≯幔一乡中国科学技术大学学位论文授权使用声明作为申请学位的条件之一,学位论文著作权拥有者授权中国科学技术大学拥有学位论文的部分使用权,即:学校有权按有关规定向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅,可以将学位论文编入《中国学位论文全文数据库》等有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。本人提交的电子文档的内容和纸质论文的内容相一致。保密的学位论文在解密后也遵守此规定。匦开口保密(——年)作者签名:量坌亟.导师签名签字日期:丝堕堇:垒!签字日期
摘要随着中国对外开放的程度不断扩大化,英语作为世界通用语言在国内得到了广泛的重视,而语法作为英语学习过程中的一项极重要的基础,又往往较难掌握。在教学实践中,由于学生人数众多,学生在语言学习中的一些习作往往得不到及时的批改和反馈。而当前的主流语法检查系统几乎没有针对中国学习者的特点进行语法检查,总体效果不佳。因此,本文的目标就是根据中国学习者在英语语法学习过程中的常见问题,建立一个适合中国学习者使用的语法检查系统。本文通过对当前主流语法检查系统的研究比较,从适合中国英语学习者的角度出发,研究、设计并实现了一个语法检查系统,该系统可以对学习者的习作进行语法检查并给出反馈。为了实现这一目标,本文尝试从以下三个方面着手:第一,通过调研和访谈的形式从用户的角度进行系统需求分析,并从检查效果和算法实现两个方面对当前主流语法检查系统进行研究,以确定本系统的技术解决方案,并对系统进行了整体设计;第二,根据中国学习者的易犯错误,抽取出四百多个错误实例,并以此为基础建立了实例语法检查引擎,其后根据整理错误实例过程中的经验,设计并实现了辅助添加实例的工具,使该引擎更易于扩展;第三,本文实现了基于BNC和Brown语料库的N-gram语法检查引擎,并建立了一个词典工具辅助进行系统对用户的反馈工作,在一定程度上弥补了N-gram反馈能力弱的缺点,使系统更加完善。通过实验验证,本系统对于中国学生习作样本进行语法检错的整体效果优于两种主流语法检查器(MicrosoftWord内置的语法检查器及LinkGrammarParser),而且通过辅助工具的设计,使得该检查系统能方便地进行扩展以取得更好的效果。关键词:中国学习者英语语法检错系统设计实现
摘要Ⅱ
AbstractEnglishasauniversallanguagehasbeenattractingextensiveattentioninChina,alongwiththecontinuousopeningupofthecountry.However,thegaspmgofgrammar,whichisafundamentalpartinEnglishlearningprocess,isalwayscomplicatedandplaysasahugeobstacleinthelanguagestudypractice.Inactualclassteaching,studentsusuallycannotgettheirexercisesmarkedandreceivefeedbackfromthelecturertimelyduetothelargesizeofacommonclass.ThehelptheyCangetfromcurrentmainstreamgrammarcheckingsystemsisalsolimitedbecausenoneofthemisexpresslydesignedtomeetChineselearners’features.Inthispaper,basedonthecomnlonproblemsChineselearnersencounteredintheirstudies,agrammarcheckingsystemforChineselearnersisdesignedtofitthegap.Bycomparingtheeffectofcurrentmainstreamgrammarcheckingsystem,wedesignandimplementagrammarcheckingsystemfromthepointofsuitingforChineselearners.Thissystemcallcheckgrammarerrorsandgiveappropriatefeedback.Toachievethisgoal,weattempttoproceedfromthefollowingthreeaspects:Firstly,weanalyze01117system’Srequirementfromtheuser’spointofview,anddeterminethetechnicalsolutionofoursystembyresearchingboththeeffectandalgorithmsofthecurrentmainstreamgrammarcheckingsystem,basedonthesejobs,thesystem’Soveralldesignisaccomplished.Secondly,weextractOVerfourhundrederrorinstancesaccordingtothecomnlonerrorsofChineselearners,andestablishallinstancegrammarcheckingenginebasedontheseerrorinstances.Then,weimplementanauxiliarytool,whichmakestheengineeasiertoextend.Finally,tomakeOursystemmoreperfect,weachieveanN-GramgrammarcheckingenginebasingonBNCandBrowncorpus,andcreateadictionarytohelpthesystemdofeedback,whichmakeuptheshortcomingsoftheweakfeedbackcapabilityofN.Gram.Theexperimentalresultshowsthat,forChinesestudents’samples,theoveralleffectofoursystemisbetterthanthetwomainstreamgrammarchewers(MicrosoftWordbuilt-ingrammarcheckerandLinkGrammarParser).AndthedesignofauxiliarytoolsmakesiteasiertoextendOursystemtoachievebetterperformance.III
AbstractKeyWords:ChineseLearners,English,GrammarCheckingSystem,Design,ImplementIV
目录第1章绪论⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.11.1问题的引入⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯...11.2国内外研究现状⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..11.2.1自然语言处理研究现状...⋯⋯⋯⋯⋯⋯.⋯⋯...⋯.⋯...21.2.2语法检查研究现状.⋯⋯⋯⋯⋯⋯⋯⋯⋯.⋯.⋯........21.3研究意义⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..41.4本文的主要工作及章节结构⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.41.4.1本文的主要工作⋯⋯..⋯⋯⋯....⋯⋯..⋯⋯...⋯.....41.4.2本文的章节结构⋯⋯⋯⋯⋯⋯..⋯⋯.⋯⋯⋯⋯⋯....5第2章相关理论与技术分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..72.1语言学基础⋯⋯.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..72.1.1传统的上下文无关语法及分析.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯....72.1.2N元语法模型⋯....⋯....⋯⋯⋯⋯⋯⋯⋯⋯..⋯⋯..82.2语法检查相关的基础技术⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯...92.2.1英语中的分句分词.⋯⋯...⋯⋯.⋯⋯⋯⋯⋯⋯⋯⋯⋯92.2.2词性标注技术⋯..⋯⋯.....⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.102.2.3语料库技术.⋯⋯.⋯......⋯⋯.⋯.⋯⋯⋯.⋯⋯.⋯112.3语法检查的主要算法⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯一⋯⋯.112.3.1链语法的原理⋯..⋯⋯⋯⋯⋯⋯⋯...⋯⋯⋯⋯⋯⋯112.3.2基于统计的语法检查⋯⋯.⋯⋯⋯⋯⋯.⋯⋯...⋯⋯...132.3.3基于错误实例的语法检查算法⋯⋯⋯⋯⋯.⋯.⋯⋯⋯⋯..132.4本章小结⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.14第3章系统的总体设计与分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..153.1系统的需求分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.153.2系统所用技术方案分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.153.2.1语法检查方案的选择⋯⋯⋯⋯..⋯⋯⋯⋯⋯⋯⋯⋯⋯16V
目录3.2.2系统开发语言选择及交互方式⋯⋯⋯..⋯⋯.⋯⋯⋯⋯⋯.163.3系统的总体设计⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.仃3.3.1系统的输入输出及工作流程⋯.⋯...⋯.........⋯⋯........173.3.2句子模型设计⋯⋯⋯⋯⋯..⋯⋯....⋯⋯⋯⋯....⋯.183.3.3数据存储方式选择⋯.⋯.⋯⋯⋯..⋯.⋯.⋯⋯⋯⋯⋯.203.4本章小结⋯⋯⋯⋯⋯⋯⋯⋯.⋯⋯⋯⋯⋯⋯⋯⋯..。20第4章实例语法检查模块的设计与实现⋯⋯⋯⋯⋯⋯⋯⋯..214。1实例文件的表示形式⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯214.2核心类的设计⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.⋯⋯⋯⋯..224.2.1ExceptlonOass类⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.234.2.2Token类....⋯⋯⋯⋯⋯..⋯...⋯.⋯⋯.⋯⋯.⋯..244.2.3Instance类⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯254.2.4Inst钏IcE舭k管类⋯⋯....⋯⋯⋯⋯.⋯⋯..⋯⋯⋯..254.3实例语法检查的匹配算法设计⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.264.3.1实例的命名策略⋯⋯⋯⋯..⋯⋯⋯⋯.⋯⋯⋯..⋯⋯.264.3.2实例匹配的两种方法实现⋯.....⋯.⋯⋯.⋯⋯⋯⋯⋯⋯.274.3.3两种匹配方法效率的比较⋯...⋯...⋯⋯⋯⋯⋯⋯⋯⋯..294.4实例的获取⋯⋯⋯⋯....⋯⋯....⋯...⋯.⋯⋯⋯⋯..294.4.1实例的获取方式⋯.⋯......⋯..⋯⋯..⋯⋯⋯⋯⋯⋯.304.4.2实例的有效性与误判性验证⋯⋯⋯....⋯..一.⋯......⋯...304.4.3辅助添加实例的工具⋯.⋯⋯.⋯....⋯⋯...⋯⋯...⋯..304.5本章小结⋯⋯⋯⋯⋯一⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..32第5章NOam语法检查模块的设计与实现⋯⋯.。..⋯⋯⋯335.1NGam语法检查的设计⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.335.1.1G图匝中的NQam语法检查....⋯⋯.⋯⋯⋯....⋯⋯⋯...335.1.2数据库设计⋯⋯⋯.......⋯....⋯⋯⋯⋯⋯⋯⋯⋯.345.2训练阶段的算法实现⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯355‘2.1训练阶段的主要流程⋯⋯⋯-⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..355.2.2训练阶段内存中数据存储形式设计.⋯.⋯⋯⋯⋯⋯⋯.⋯⋯.375.2.3训练阶段的代码实现⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯。。39Ⅵ
目录5.2.4GCSQ.中的语料库训练功能..⋯.⋯⋯⋯⋯.......⋯⋯⋯..425.3检查阶段的算法实现⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯435.3.1检查阶段的主要流程⋯⋯......⋯⋯.⋯⋯⋯⋯⋯⋯....435.3.2检查阶段的代码实现.....⋯⋯⋯⋯⋯...............⋯⋯445.4词典工具的实现⋯...⋯...⋯⋯⋯.....⋯⋯⋯⋯⋯⋯..485.5本章小结⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.49第6章系统的用户晁面与检错效果验证⋯⋯⋯⋯⋯⋯⋯⋯..516.1系统的用户界面⋯...⋯.⋯⋯⋯⋯⋯⋯⋯....⋯⋯.⋯.516.2系统的检错效果验证⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯536.2.1语法检查效果评测标准⋯⋯⋯⋯.⋯⋯⋯⋯⋯..⋯.⋯...536.2.2系统的检错效果评测⋯⋯⋯⋯.⋯⋯⋯...⋯⋯....⋯...546.3本章小结⋯⋯⋯⋯⋯⋯⋯⋯⋯.⋯⋯⋯⋯⋯⋯⋯⋯55第7章总结与展望⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..577.1本文的工作总结⋯...⋯...⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.577.2后续的工作展望⋯..⋯⋯.⋯⋯⋯...⋯⋯⋯..⋯⋯⋯..57参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..59致谢⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..61在读期间发表的学术论文与取得的研究成果⋯⋯⋯⋯⋯⋯⋯⋯⋯..63Ⅵl
目录ⅥlI
第1章绪论1.1问题的引入随着全球化浪潮的不断发展,中国对外开放的程度也越来越大,英语作为一种世界通用语言逐渐得到了广泛的重视。在英语学习过程中,语法的学习可谓是极其重要的一个环节。而在实际教学中,一方面,语法本身的细节十分繁杂,导致大多数学习者很难短时间内很好地掌握,需要不断的强化训练;然而,另一方面,由于英语学习者数量的不断增加,教师对学生大量习作进行反馈的压力也越来越大,大多数学习者的习作往往得不到人工及时的修改批注,从而导致学习者进步缓慢。在这样的大环境下,英语教学实践中就需要一个能够快速对英语语法问题进行自动批注的计算机辅助系统。当前的主流语法检查算法主要分为两类:基于规则的语法检查系统和基于统计的语法检查系统【l】。这些语法检查系统在判断整个句子正误方面的能力尚可,但对于错误所在的具体位置往往不能有效的指出,更不能提供给学习者有效的反馈,对学习者英语能力的提高不能起到很好的指导作用。另外,中国学习者有很多相似的语法使用习惯,很多相同类型的错误高频率地出现在学习者的习作中。而主流语法检查系统并未针对中国学习者的这一特点来设计实现,很多中国学习者易犯的错误并不能有效的指出,而且大多数开源系统的扩展性不佳,不能方便地通过扩展规则来达到检查特定错误的效果。针对上述现象,本文尝试针对中国学习者在英语语法学习过程中出现的常见问题,建立一个适合于中国学习者使用的语法检查系统,该系统在文中简称为GCSCL(GrammarChokingSystemforChineseLearners)。该系统不仅能识别一些基本的英语语法错误,更能高效精确地检测出中国学习者的易犯错误,包括“中国式”风格英语的使用等。1.2国内外研究现状本文所研究的算法主要针对英语的语法检查,其属于自然语言处理的范畴,因此在本节中首先介绍自然语言处理的历史和现状作为铺垫,在此基础上再介绍英语语法检查算法和技术的现状。
第1章绪论1.2.1自然语言处理研究现状自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行通信的各种理论和方法。在历史上,自然语言处理曾经在许多不同的领域进行研究,其中包括计算机科学、电子工程、语言学及心理认知语言学等【21。自然语言领域的研究最早可以追溯N-十世纪四五十年代,期间比较有影响力的研究主要集中在两个方向:一是自动机的研究,二是概率或信息论模型的研究。之后,在二十世纪五六十年代,自然语言处理明显地分成两个阵营:一个是符号派,一个是随机派。符号派的主要工作是针对形式语言理论、生成句法及人工智能的研究;而随机派则主要是一些来自统计学专业和电子学专业的研究人员,他们当时所做的工作主要是基于贝叶斯方法。其后,在二十世纪七十年代到八十年代中期,自然语言处理取得了令人瞩目的进展,其中有代表性的包括:(1)随机范型(隐马尔可夫模型等)在语音识别相关领域中起到了极其重要的作用;(2)基于逻辑的范型(包括变形文法、定子句文法等)的研究也在这一阶段取得了重大的成就;(3)基于自然语言理解的范型也逐渐崛起,如LUNAR问答系统的建立;(4)话语模型范型方面的成就则有如子结构和话语焦点、自动参照消解及BDI框架等。八十年代中期到九十年代中期,自然语言处理的研究又回到了经验主义和有限状态两种模型上。而二十世纪末,该领域发生了很大的变化。首先,概率和数据驱动的方法几乎成为自然语言处理的标准方法;其次,自然语言处理算法开始被应用于增强交替通信中;最后,web的发展使进一步加强基于语言进行信息检索的需求更加突出。当前,自然语言处理的发展趋势主要体现在以下几个方面:第一,传统的基于句法规则的方法受到质疑,大规模真实文本的处理成为主要战略方向;第二,统计数学方法、机器自动学习方法越来越受到重视;第三,混合式系统逐渐形成,如浅层处理与深层处理并用、统计方法与规则方法并用的系统;第四,自然语言处理越来越重视词汇的作用,词汇库的构建成了普遍关注的问题。1。2.2语法检查研究现状语法检查系统的作用是通过程序将目标文本中的语法错误标注出来,其属于自然语言处理的一个分支,因此其实现主要是充分运用自然语言处理的各种理论和方法进行的。传统的主流语法检查系统主要归结为两大类:基于规则的方法和基于统计的方法,在此基础上,近些年又出现了基于错误实例语法检查的一些应2
第1章绪论用。下面介绍三种典型的语法检查算法:(1)MierosoRWord是微软公司的一个文字处理应用程序,其中包含了对拼写和语法进行检查的辅助工具。Word早期版本中的语法检查功能是基于规则实现的,之后,逐渐加入了统计的方法。Word对于部分语法错误检测非常准确,同时还能有效地给用户提供修改建议,另外,检测效率高也是它的优势之一。正是由于它各方面的性能均较为优越,因此成为了许多语法检查系统的标杆。(2)LinkGrammarParser[3】是一个基于链语法实现的语法检查器,它在大类别上属于基于规则的语法检查系统,但是它与传统的基于规则的检查系统又有所区别,它的基本思想将句子中每两个可以构成链接的单词相连,取代传统方法中的树状结构的分析。经过实验验证,LinkGrammar在对句子进行正误判断能力上具有较高的准确率。另外,根据不同链接的定义,LinkGrammar本身也间接的提供了对句子进行评价的工具。(3)LanguageTool[4】是一个开源的风格和语法检查程序,目前支持英语、波兰语、德语、法语等20多种语言,它采用的是基于错误实例和规则相结合的方式实现的。LanguageTool能检测出很多种类型的错误,并且能给出有效的修改意见,它的另外一个优势还体现在它的易于扩展性上。包括上述几个系统在内的部分优秀语法检查系统在英语语法检错方面虽然整体效果不错,但想要真正应用到国内英语教学中其缺点很明显,具体表现为以下几个方面:’(1)基于规则的语法检查系统虽然可以很好地判断句子正误并分析句子结构,但是其对错误位置的确定并不具备很高的准确性,使得其对英语学习者不能起到很好的指导作用,而且由于基于单纯的规则语法检查系统处理特例的能力较差,因此不能很好地识别一些固定搭配的错误。另外,大部分规则语法检查系统需要进行递归分析,处理效率较差。(2)基于统计的语法检查一般采用N元语法模型从大量语料库中提取统计信息,其对于局部错误的识别能力较佳,但是对于长距离的语法错误略显无力。(3)在教学应用中,一方面我们希望语法检查系统能够检测出目标文本的语法错误,另外,我们更希望系统能够对用户进行反馈,提供给用户合适的修改意见。而基于规则和基于统计的语法检查对用户的反馈能力均比较差。(4)基于实例的语法检查有很多优势,可以有针对性的识别特定的错误,基本做到弹无虚发,而且在识别错误的基础上能提供有效的反馈,给出修改意见。但是,它也面临几个重要的问题:第一,实例集本身出现的问题,在人工进行错误实例化的过程中易产生冲突,另外,也可能由于实例考虑不周导致出现误判;第二,随着实例集规模的增大,匹配的效率明显变低:第三,在实例集形成一定3
第1章绪论规模以前,该检查系统所能识别的错误较少。本文充分考虑到各类语法检查方法的缺陷,在详细分析用户的需求后,确定我们的技术方向,来尽量克服上述缺点。1.3研究意义英语语法本身十分复杂,想要运用自如需要大量的写作练习,然而由于教师的精力有限,往往不能对学生的练习给予足够的反馈,此时就需要借助计算机来对学生的习作进行语法批阅,然而目前的语法检查系统对中国学习者常见错误的识别能力往往差强人意,因此,构建一个适合中国学习者使用的语法检查系统能够给教学双方带来很大的便利。本检查系统主要有以下优势:(1)本系统采用基于实例和基于统计相结合的实现方式,通过实例语法检查引擎来检查中国学习者易犯的常见错误,在此基础上,通过基于统计的方法来进行潜在错误的识别,从而起到一定的补充作用。(2)系统不仅具有指出句子正误的能力,还能精确指出错误的位置,并部分给出详细的修改意见,帮助学习者提高自己的英语语法水平。(3)实例语法检查引擎实现过程中添加了二分匹配算法,在一定程度上解决了随实例集规模增大所引起的匹配效率严重下降的问题。(4)系统内置了词典工具,对一些潜在错误通过搜索引擎检索出它们的用法及例子,以此来供用户自己进行参考判断。(5)系统内置了扩展工具,其中包括实例验证工具及新语料库训练工具,·、更方便的进行语法检查系统的扩展,使系统能逐步完善。1.4本文的主要工作及章节结构1.4.1本文的主要工作本文通过对主流语法检查系统的比较分析,从中国英语学习者的角度出发,建立了自己的语法检查系统,该系统能高效地检测出中国学习者的常见语法错误并给出适当的反馈。针对这一目标,本文的主要工作集中在以下四个方面:第一,确定所用技术方向及语法检查系统的整体设计。通过调研和访谈的形式从用户的角度了解其对于本系统的需求方向,通过了解用户具体的需求来确定4
第1章绪论符合该需求的整体技术方向,并在此基础上进行系统的整体设计。第二,根据中国学习者的易犯错误,建立高效的实例语法检查引擎。笔者从书籍及网络中整理出大量的中国学生易犯错误,以此为基础抽取出四百多个高度概括化的实例作为资源,实现了自己的实例语法检查引擎,并对抽取的错误实例进行了详细的验证。其后,建立了辅助验证实例的工具,使得该引擎更易于扩展。第三,实现了基于BNC和Brown语料库的N.Gram语法检查引擎。为了使我们的语法检查系统更加完善,笔者实现了基于BNC和Brown语料库的N.gram语法检查,并设计了一个词典工具来辅助系统对用户进行反馈,在一定程度弥补了该引擎对用户反馈能力弱的缺点。第四,将两个语法检查模块结合并实现相应的图形化界面,以方便用户的使用。1.4.2本文的章节结构基于1.4.1中所述的主要工作,本文分七章详细介绍了语法检查系统的实现,具体安排如下t第一章,绪论。本章首先陈述了课题研究的背景、介绍了自然语言处理及语法检查技术现状,然后,通过分析现有语法检查系统的缺点,来说明研究面向中国学习者的英语语法检查系统的意义。第二章,相关理论与技术分析。本章首先介绍了语言学上相关的基础理论,之后对与语法检查相关的一些基础技术进行了陈述,最后通过前面的铺垫,分析了几种效果较好的语法检查算法。第三章,系统的总体设计与分析。本章通过调研和访谈的方式分析了语法检查系统的需求,确定了语法检查系统的技术方向并对系统的输入输出、数据存储等进行了总体设计。第四章,实例语法检查模块的设计与实现。本章的内容主要针对实例语法检查引擎,在前一章技术方向分析的基础上,首先进行了引擎核心类的设计,之后介绍了匹配算法的具体实现及实例的获取方式,最后通过设计辅助工具来方便该引擎的扩展。第五章,N.Gram语法检查模块的设计与实现。本章阐述了N.Gram语法检查的设计思路,并基于BNC和Brown语料库进行了引擎的实现,对该引擎的两个阶段(训练阶段和检查阶段)进行了详细的介绍,最后给出了词典工具的实现方式。第六章,系统的用户界面与检错效果验证。本章首先介绍了系统的用户界面5
第1章绪论设计,之后阐述了语法检查系统的评测标准,在此基础上,通过具体的实验,进行了系统的检查效果与性能的分析评测。第七章,总结与展望。该章对本文的研究工作做了总结,并提出了后续的工作方向及改进思路。6
第2章相关理论与技术分析本章首先介绍了与本论文相关的语法检查方面的语言学基础,包括传统的上下文无关语法及统计学上的语言模型,之后阐述了与语法检查相关的基础理论和技术,最后,在前述理论基础上,分析了几种语法检查算法的实现。2.1语言学基础2.1.1传统的上下文无关语法及分析传统的句法分析主要有两个目标:第一,判断一个句子是否符合给定的语法;第二,识别句子中各部分间的关系,构成语法树【51。要实现这样一个语法分析器,首先,我们要对目标语言定义一套语法(其中包括词典和句子的构成规则),其次,我们需要实现一个句子分析器,根据所定义的语法将输入句子分析成树的形式。上下文无关文法是形式语言理论中一种应用十分广泛的变换文法。为了描述上下文无关文法,首先需要定义一些重写规则,每个重写规则中包含多个符号,这些符号分为终结符和非终结符两类,其中终结符不能被重写,非终结符又可以S·≯NPVPNP-》J|盯N橐终VP啼V盼NPNP·≯灯辩NAT。>lhe瓣NS诊children、强O·≯翻I|!【麓K冷cake图2.1一套简单的重写规则及其对例句的分析结果被重写为一个或多个符号的组合,另外,语法中有一个特殊的非终结符S来表示7
第2章相关理论与技术分析句子,它一般作为句法分析的开始或结束标志。如重写规则S一>NPVP,表示一个句子可以被重写为一个名词短语和一个动词短语。在一套语法中包含多个重写规则,我们通过这些重写规则来定义句子的组成方式,并可以根据句法分析器来将一个合理的输入句子分析为一颗语法树。图2.1中例子为一套简单的重写规则及对输入句子“Thechildrenatethecake”的分析结果。在完成重写规则的定义后,我们的句法分析算法就可以描述为一个搜索过程,其搜索空间为所定义的规则集,搜索目的是找到一种规则的组合方式,通过它们能够将输入句子表示成一棵语法树的形式。这种搜索过程可以分为不同的形式:自项向下和自底向上的分析算法。二者的基本思想相同,都是基于弧扩展算法来实现的,仅仅是分析方向不同而已。运用上下文无关文法来分析自然语言有几个明显的缺陷:(1)重写规则集很难做到尽善尽美。不同于机器语言,自然语言中旬子的构成十分复杂,因此其规则集很难概括所有的方式,另外,随着规则规模的扩大,规则之间的冲突也是很难处理的一个问题;(2)该种分析器对于错误句子的局部分析能力较差。对于分析器不能正确分析的句子,较难有效地通过现有规则进行高效的局部分析;(3)分析过程需要不断地进行递归分析,处理效率较低;(4)自然语言是上下文有关的,同一个单词或同一种用法往往有很多例外,上下文无关分析器在处理这种情况时往往显得很无力。2.1.2N元语法模型语言模型【6’7】是描述自然语言内在规律的数学模型,是计算语言学的核心。语言模型分为基于文法的和基于统计的两种。文法型语言模型主要依赖于人工编制的文法规则,不适用于处理大规模真实文本,在这种环境下,基于统计的模型应运而生。基于统计模型的核心思想是,运用大量语料统计出的参数来估计句子出现的可能性,常用统计模型包括N元语法模型、隐马尔可夫模型、最大熵模型,其中最为典型且应用最广的是N元语法。统计语言模型的作用就是根据统计信息来计算一个句子出现的概率,假设句子s由1个基元Ⅵ,w2,⋯w,组成,根据链式规则,该句子的概率可以表示为:j—p(s)=P(wOp(w2lⅥ)⋯p(ⅥlM⋯嵋-1)=lIp(嵋IM⋯W,-I)i=1这样,一个句子的概率即表示为多个条件概率的乘积,第i个词相关的条件概率与前i-1个词有关,我们把前i.1个词称为第i个词的历史。随着历史数目的不断增加,计算难度也越来越大,因此需要对该模型中的历史数目做一定的简化,8
第2章相关理论与技术分析当第i个词仅于邻近的前N.1个词有关时,该模型即为N元语法模型,以二元语法为例,由N元语法的定义知,二元语法中每个词的概率仅依赖于它的前一个词,因此有,jp(占)=兀p(w,I嵋⋯Mli-1)≈兀p(w,I嵋一,)i=l为了使p(Ⅵ1wf.。)在边界位置有意义,在句子前后各加一个标签作为句子的开始与结束标志。我们仍以上节中句子“Thechildrenatethecake”为例,则该句子的概率可表示为:p(s)=p(TheI)木p(childrenI刀z力宰p(atechildren)水p(theIate)幸p(cakelthe)幸p(Icake)为了计算整个句子的概率,我们需要计算每个条件概率值,N元语法乘积中每一个条件概率可以通过下式来求得:p(%h。Wr,-。)=墨坠竺p【Ⅵ⋯w,卜lJ由于语料库中的内容都是有限的,所以不可避免的会出现一些零概率的语法特性,这就是N元语法的稀疏性。在我们进行最大似然估计(MLE)时,需要使用一些特殊的处理技术使得该模型变得平滑,有代表性的技术包括:加1平滑、Witten.Bell打折法、Good.Turing打折法。直觉上,我们希望N元语法中的N越大越好,这样可以更好地表现文本中的上下文关系,但是随着N的增大,训练出的语法模型会愈发变得稀疏,估计效果会因此变得很差,实际运用较多的是二元语法t三元语法及四元语法。2.2语法检查相关的基础技术大多数的语法检查技术依赖于其他一些自然语言处理的基础技术,如分词、词性标注系统、语料库技术等,因此,在介绍语法检查前,本节先对这几种基础技术作一定的阐述。2.2.1英语中的分句分词自然语言处理的一般过程可以分为三个阶段:词法分析、句法分析、语义和语用分析。在自然语言中,词是最小的、独立的语言单位,分词技术【81就是将一段文本分解成为一系列单词或标点的集合,而完成这种处理过程的程序即被我们9
第2章相关理论与技术分析称为分词器。由于英文中的单词之间用空格自然分割,其分词相对中文来说较为简单,一般可将分词分句放在一起进行处理。作为自然语言处理的首个重要环节,分词分句的准确性对自然语言处理的效果有着很大的影响。这其中最主要的挑战在于鉴别句子和单词的边界【91。在英语中,一般情况下我们认为将“.”、“!’’、“?"作为句子的结束标志,但是他们往往还有一些其他的作用,如“.”不仅可以当句号来标示句子结束,还能用来表示小数点、缩写等,因此不能简单地通过某个符号来作为句子的结束标志,另外,一些特殊符号(如引号)也会给分句造成一定的困难。而对于分词,一般我们认为单词问通过空格进行分割,但是有很多例外的情况,例如,对于缩写can,t进行分词,我们既可以将它本身作为一个词,也可以将其分为ca和n’t两个词,还可以分解为can和’t两个词,甚至可以将其还原为call和not,具体采用哪种分词结果依不同的分词器自行决定。2.2.2词性标注技术词性标注技术就是根据句子上下文中的信息给句子中的每一个词一个正确的词性标记,它也是自然语言处理技术的重要基础之一,应用于许多领域,包括如文本索引、文本分类、语料库加工、语言合成等。词性标注有很多种方法,如基于规则的词性标注、基于隐马尔科夫链的词性标注、基于最大熵模型的词性标注等。该技术在英文方面的应用已较为成熟,效果较好的标注算法可以使准确率保持在95%以上。下面介绍几个常用的词性标注方法:(1)StanfordPOSTagger[10】是由斯坦福大学的自然语言处理组开发的基于最大熵模型的词性标注系统,其源语言为.iava。它通过训练己标注的文本来获得条件概率模型,并运用该模型进行词性标注。该标注系统中不仅包含训练好的英语模型,还包括中文、德语模型等,另外由于该系统独立于语言,可以用其训练自己的语言模型。本文中标注功能的实现就是运用该系统来完成的。(2)BrillTagger是1995年由EricBrill在其博士论文中提出的,它是错误驱动和基于转换的标注系统:一方面,它依赖于有监督的学习;另一面,它会预先给每个单词赋予一个初始的词性,并通过一系列己定义的规定去改变该词性,通过不断的应用这些规则来改变不正确的词性以得到相当高的准确率。(3)TnT是Trigrams"n’Tags的简写,是一个高效的基于统计的语法检查器,它运用隐马尔科夫链来实现词性标注。系统本身提供了两个语言模型:英语和德语,由于该系统也是独立于语言的,可以通过训练已标注的语料库来获得自己的语言模型。10
第2章相关理论与技术分析2.2.3语料库技术语料库(corpus)是经过科学取样和加工的大规模电子文本库,一般的语料库由以下三个成分组成:文本内容数据本身、描述文本内容的元数据以及一些语言学上的注释。语料库是经验主义语言研究方法的主要资源,通过计算机工具进行分析处理,其可应用于词典编纂、语言教学及自然语言处理的统计方法等很多方面。接下来笔者简要地介绍一下本文所用到的几个语料库:(1)BrownCorpus是由HenryKucora和W.NelsonFrancis于20世纪60年代从1961年美国出版的材料中编辑整理的语料库,它包含了500个英文语料样本,共100万个单词。该语料库有6个不同的版本,他们所包含的基本文本是相同的,但是具有不同的格式和组成形式。如今,该语料库的规模显得略微偏小并且内容有些过时,但是仍被部分研究者使用,另外,它最大的价值在于其编排方式给了其他语料库一定的借鉴意义。(2)BritishNationalCorpus(BNC)【ll】是一个由来源广泛的书面语和口语组成的语料库,大约包含10亿个单词。该语料库覆盖了20世纪后期不同类型英式英语的例子,它的目标是对当时的口语和书面语的运用起到一个代表作用。BNC中的90%是书面语,这些例子是从报纸、出版的杂志及各领域的期刊等文本中抽取;另外10%是口语,它们是通过笔录整理得到的。BNC属于现有的较大规模的语料库,在统计自然语言处理中应用较为广泛。(3)中国学习者英语语料库(CLEC)是以中国学生的实际语料编写的语料库。CLEC收集了包括中学生,大学英语四、六级,专业英语低年级和高年级在内五种学生的语料,共一百多万词,而且对语料的错误进行了标注。通过该语料库的分析,可以很好地了解中国学生的常见错误,并为实际的英语教学提供有效的指导。2.3语法检查的主要算法在上一节中,笔者陈述了语法检查相关的基础技术,本节则在此基础上分析效果较好的三种语法检查算法:链语法、实例语法检查及N.Gram语法检查。2.3.1链语法的原理链语法(LinkGrammar)是DavyTemperley和DanidSleator提出的句法分析理论,不同于传统的树型分析法,链语法的分析是对每两个单词间构建链接。
第2章相关理论与技术分析例如,对于英语中最简单的主谓宾的句子,动词可以左连一个单词形成主谓链并可以右连一个单词形成动宾链,而名词则可以右连单词形成主谓链或左连单词形成动宾链。事实上,一部链语法可以理解为一个词典,它是由多个单词组成的集合,其中每个单词的后面记录着该单词的链接要求,每个链接要求代表其在句子中可以充当的一种成分。图2.2表示只含五个单词的一部简单的链语法。图2.2一部简单的链语法链语法分析就是根据词典中各单词的链接要求,按照特定的方式,对所有单词进行链接匹配分析,最后根据分析结果判断该句子是否符合链语法定义。图2.3的内容为根据图2.2中链语法对于输入“111eboypaintedapicture"进行分析的结果。实现一个链语法分析器需要做两个方面的工作:整理词典文件和编写句子分析算法。LinkGrammarParser是一个开源的英语链语法分析器,它拥有一个约6万词的词典,能有效地对大部分英语句子进行分析。图2.3链语法对于例句的分析结果链语法属于词汇主义的语法系统,它的一个明显优点是构建大型语法系统比较容易,词典中_二个单词的描述只对包含该单词的句子分析有影响,这就允许我们逐步来建设我们的整个词典。另外,由于每个单词可以在词典中独占一个条目,因此这种语法系统在处理不规则形式的词语(如某些词的特定用法)方面具有明显的优势。但是,它在复杂句子的分析中,对错误位置的指出不够准确,而且不能对错误句子提供有效的修改建议,因此,将其直接应用于英语教学尚显不妥。12
第2章相关理论与技术分析2.3.2基于统计的语法检查统计语法检查【12】的实现大多是基于N元语法(N.Gram)模型,该模型可以很好地反应单词间的上下文关系,理论上N元语法模型中N的个数越大,上下文关系体现得越好,但由于语料库的稀疏性,实际情况并非如此,在实际应用中,二元、三元语法应用最广。N元语法检查系统通常分为两个阶段:训练阶段和检查阶段。在训练阶段,系统对语料库按照模型的需求统计信息并保存。在检查阶段,应用这些统计信息对输入句子进行分析,判断是否存在语法错误。不同的检查系统运用N元语法进行语法检查的方式也有所不同,一般可分为两种,我们仍以上节的句子“Theboypaintodapicture.”作为例子来具体说明这两种方式(为介绍方便,此处均采用二元语法):第一种,首先计算输入句子中所有二元语法的概率,并将它们的值相乘由此计算出句子的概率,公式如下:P(Theboypaintedapizture.)=P(Thc[)*P(boyIThe)水P(paintcdIboy)·P(aIpainted)·P(pizturela)·P(.Ipicture)最后,通过将句子的概率与系统预设的阈值进行比较来判断句子是否符合语法。第二种,对于特定的输入句子,系统抽取出其包含的所有二元语法,本例子中为“Theboy”、“boypainted”、“painteda”、“apicture”、“picture.",并逐个查询这些二元语法,如果某个二元语法在训练语料中不存在或者频次小于特定的阈值,则系统认为此处存在错误。两种方法均可以实现判断句子的正误,不同的是第二种方法可以有效地指出错误位置,而第一种不能。由于它们都是采用N元语法的模型进行训练,所以两种方法的有效性均在很大程度上取决于其所用的语料库。2.3.3基于错误实例的语法检查算法早期的语法检查系统多是基于规则和基于统计的,基于规则的语法检查系统在实际应用中所能检查出的错误类型较为有限,而基于统计的语法检查则往往对长距离错误显得十分无力,在这种情况下,基于错误实例的语法检查[13j4]应运而生。基于实例的语法检查系统能够有效地检测出各种复杂类型错误的同时可以很好地给用户提供反馈,另外,它的扩展性很好,因此,逐步被应用到很多语法检查系统中。13
第2章相关理论与技术分析所谓的实例就是用单词串来表示英语的语法规则,但是,这种用单词串来表示实例的方式概括性不高,往往会导致实例集无限扩大,使匹配效率降低。负实例模式的产生使我们可以在一定程度上解决这一问题,我们采用一些词性标记来代替概括能力不强的单词,使我们的实例概括性大幅度提高。基于错误实例的语法检查器实际上就是两方面工作的集合:错误实例集的收集整理和匹配算法的实现。由于错误实例大多不是简单的单词串,使用计算机自动获取往往不能达到很好地效果,因此一般都需要人工介入进行整合。而传统的实例匹配算法也相对简单有效,一般采用逐个匹配的方式。基于实例的语法检查器的缺点主要体现在三个方面:第一来自于实例集的整理,由于英语中存在大量的例外情况,当人工产生的错误实例达到高度概括化时,不可避免地会匹配到某些正确用法上,因此需要大量的真实文本进行验证,另外,实例问的冲突及重复也是需要不断解决的问题;第二个缺点体现在检查器的效率上,随着实例集规模的不断扩大,采用逐个匹配的方式,其效率不可避免地会大幅度降低。第三,实例语法检查器所能检查出的错误较少,因此,其主要用于针对特定人群及特定类型的错误来使用,另外,可以在应用时采用其他类型的检查器进行辅助完善。2.4本章小结在本章中,笔者首先概括了语法检查相关的基础:上下文无关语法及语言模型,其后介绍了语法检查的基础技术:分词分旬、词性标注及语料库技术,并以此为基础,分析了当前效果较好的几种语法检查算法及各自的优缺点,为下一章中笔者根据需求来确立GCSCL的技术方向选择作了一定的铺垫。14
第3章系统的总体设计与分析本章首先论述语法检查系统的具体需求,之后针对这些需求进行了技术分析并根据各语法检查方法的特点进行技术选型,最后,对语法检查系统中包括工作流程、句子模型及数据存储格式等方面进行了设计。3.1系统的需求分析GCSCL的目标是为中国英语学习者提供一个高效地自动进行语法检查的平台,通过这个平台,学习者可以自主地检查自己的习作,在没有教师帮助的情况下,可以由系统指出其中的语法错误,帮助学习者提高自己的英语水平。基于这个设计目标,GCSCL的功能性需求【15】具体表现在以下几个方面:(1)系统能尽可能多地识别出输入文本中的语法错误,并尽可能准确地给出反馈(包括错误详细信息及修改建议等)。这样,才能在检错的同时更有效地帮助学习者提高英语语法能力。(2)系统能有效地识别中国英语学习者易犯的共性错误。本系统面向的主要用户人群是中国英语学习者,而他们在使用英语时存在许多相似的错误,系统的一个重要特性就是对这些共性错误具有很好地识别能力。(3)系统能方便地进行扩展改进。由于自然语言语法的复杂性,一个语法检查系统不可能概括其全部文法,因此,我们需要逐步完善我们的检查系统,这就需要系统必须具有良好的扩展性。。、(4)系统需要提供给使用者友好的图形界面,使学习者能够快速方便地使用系统中的各种功能。(5)系统需要提供方便高效的扩展工具。由于检查系统本身需要我们不断地完善,因此必须建立一个方便进行系统扩展的工具。(6)系统需要提供词典功能。用户使用系统进行语法检查时,系统会对用户的错误进行反馈,当用户需要更多信息时,可通过查阅词典来进行学习,实际上,词典功能的设置归根结底是为了辅助实现系统对学习者的反馈。3.2系统所用技术方案分析上一节中,我们针对系统的目标提出了六个方面的需求,本节则根据这些具体需求进行分析,并选择系统各方面所用的解决方案。15
第3章系统的总体设计与分析3.2.1语法检查方案的选择在前一节对需求的分析中我们己述,我们的语法检查系统面向的主要用户是中国英语学习者,其核心目标包括以下几个方面:(1)检查出输入文本中所包含的中国学习者易犯的共性错误。(2)对句子中错误所在的位置进行精确的定位。(3)系统能对错误的详细信息进行反馈并给出修改意见。通过分析,实例语法检查方法正好符合上述的核心功能,具体表现在:(1)通过对错误实例文件的整理,可以使系统的语法检查引擎有效地针对中国学习者的常见错误。(2)实例在与输入文本匹配成功后可以很方便地返回错误的位置。(3)实例文件中可以加入很多错误信息及修改意见等,可以很好地对用户进行反馈。虽然实例语法检查方法与我们的核心需求契合度很高,但是,我们需要解决的一个问题是,实例语法检查方法所能识别的错误个数较其他类型的检查方法相比偏少,这点在实例规模尚小的情况下表现得尤为明显。为了克服这一缺点,GCSCL在采用实例语法检查的同时加入了基于N.Gram语法检查功能来进行错误识别的补充,并加入词典来辅助该检查功能的反馈。3.2.2系统开发语言选择及交互方式本系统的实现分为两个部分:核心部分为语法检查引擎,在兼顾效率和方便调用两方面的情况下,该引擎采用来C++实现;另一部分为用户界面,该部分以B/S(Browser/Server)结构来实现,采用的是Djangotl6】(Python的一个W曲框架)来实现的。Web端与语法检查引擎的交互以调用动态链接库的形式,Web服务器端将输入的文本以参数的形式传递给检查器引擎ml,在ml中进行基本处理与语法检查操作,并返回带有错误标注的字符串,该字符串的形式设计为HTML元素,这样可以很方便地直接在Web前端进行展示。例如对于输入句子“Thetwoshirtsaleofonesize.”j其输出形式为“Thetwoshirtsareofonesize</a>.”。由于检查引擎是采用两种方法结合来实现的,通过链接的class属性来区分错误的来源,而message属性是该错误的详细信息,也即点击错误单词时所显示的信息。16
第3章系统的总体设计与分析3.3系统的总体设计前面我们已经根据需求确定了系统的基本实现方案,本节则对系统的工作流程、句子模型及数据存储方式进行合理地设计。3.3.1系统的输入输出及工作流程GCSCL具有友好的用户界面,因此可以很方便地与系统进行交互,系统的输入即为输入框中的待检测文本,输出则为经过CSS渲染过的HTML页面,该页面包括输入的文本、文本中的语法错误及各错误的详细信息等。在用户提交输入文本后,GCSCL进行语法检查具体分为以下几个步骤:(1)用户在Web端输入英文文本,服务器将该输入以参数的形式传递给语法检查引擎。(2)语法检查引擎完成对输入文本的预处理工作,其中包括:对输入文本进行分词分旬、词性标注及词干分析,并通过分析结果建立句子模型。(3)根据上一步所建立的句子模型调用实例语法检查模块来进行检查并返回错误信息。(4)根据句子模型调用N.Gram语法检查并返回错误信息。(5)语法检查引擎将前两步所得到的错误信息整合到文本中,并将结果文本传递给Web前端。(6)W曲前端对服务器传递来的结果文本进行渲染并展示给用户。进行语法检查时的流程图如图3.1所示。17
第3章系统的总体设计与分析3.3.2句子模型设计卜—臣受圈图3.1语法检查流程图当待检测文本输入到语法检查引擎时,引擎所做的第一步工作就是根据输入字符串建立句子模型(Sentence)。句子模型以单词模型(Word)为基础,由于GCSCL的检查引擎本身包括实例与统计两种检查方法,因此模型中需要囊括所有的必要信息,Word模型的具体设计如下:(为简化起见,本文中所有模型均省略了属性存取等相关辅助函数,仅列出了核心属性和方法)classWord{public:Word0{};18
第3章系统的总体设计与分析Word(stringword,stringpostag,stringstem);一WordO{);set_word_and_tag_id(stringword_id,stringtagid);private:stringword;stringword_id;stringpostag;stringtag_id;stringstem;);Word类中包含5个属性,其中word属性表示单词字符串本身,postag属性表示该单词的pos标签(本文所用的标签集是PennTreebanktagset,所用的标注工具为StanfordPOSTagger),stem表示该单词的词干,这三个属性是在预处理阶段进行分析赋值,是实例语法检查的三个核心属性:而word—id和tagjd是在统计语法检查中应用的两个属性,其赋值也在统计语法检查模块内部进行。另外,句子模型中还要保存错误信息,错误信息中包括错误的起止位置ffom_pos和topos、错误的详细信息message及错误的类型type(值为1表示实例错误,为2表示N.gram错误),对应的模型设计如下:classGrammarError{public:GrammarError0{};GrammarError(stringmessage,inttype,intfrom_pos,hattopos);~G_rrammarErrorO{};private:stringmessage;inttype;intffom_pos;inttopos;);句子模型中除了包含单词串和错误外,还包括属性checked(表示是否进行过语法检查)i受.grammm"OK(表示句子是否正确),句子模型的具体设计如下:classSentence{public:SentenceO{);19
第3章系统的总体设计与分析Sentence(con,stvector&sent)~SentenceO{};)private:vectorsent;boolgrammarOK;boolchecked;vectorerrors;);语法检查引擎通过调用两个语法检查模块,完善句子模型中除单词以外的其他信息,最后根据这些句子信息将输出结构组织成html元素,并返回前端渲染展示。3.3.3数据存储方式选择在GCSCL的语法检查引擎中,有两个方面的数据需要存储:实例语法检查模块的实例集和统计语法检查模块的N.gram信息。事实上,两种语法检查的相关数据的特点迥异,因此采用不同的存储方式来进行存储:(1)由于实例语法检查模块中的实例采用负模式表示,它对于语法特点的概括能力较强,但同时也造成了其表示的复杂性,另外,实例的数量相对于统计语法检查中的信息的规模较少,因此GCSCL中采用XML文件的形式来存储实例。(2)统计语法检查中要存储N.gram信息的特点则不同于实例,其信息本身较为简单,但信息的规模较大,因此GcSCL通过数据库来存储相应的统计信息。3.4本章小结本章首先对语法检查的需求做了系统的分析,在此基础上确定了GCSCL中语法检查引擎的实现方法为基于实例与基于统计相结合的方式,并确定了系统的开发方式及开发语言。之后,笔者对GCSCL进行了总体设计,这其中包括:系统工作流程的设计,句子模型的设计及数据存储方式选择等几个方面。接下来两章的内容分别介绍两个语法检查模块的设计与实现。
第4章实例语法检查模块的设计与实现前一章中,我们对GCSCL中语法检查引擎进行了整体设计,本章则主要介绍其中的实例语法检查模块的设计与实现。该模块设计的核心内容包括两个方面:第一,实例文件的表示形式。实例的表示不但要求能高效地实现匹配,还要看起来明确清晰,且易于扩展;第二,设计实例语法检查的核心类,这其中包括实例文件的读入及其在内存中的存储方式、语法检查实现的方式等。4.I实例文件的表示形式在3.3.3节中笔者已述,实例语法检查模块中我们采用负实例的形式,并且通过XIVIL文件来存储实例集。例如,对于短语“stickto”,其后一般要求接动词的动名词形式,如果其后直接动词的其他形式,我们就认为该处存在错误,这就是一个错误实例。该实例表示成XML形式如下:stick</token>to</token></token></match>Stickto做坚持讲,其后如果接动词需要接动名词</message>Theysticktosolvetheproblem.</example></instance>该实例中,id属性是自增长的,作为实例的唯一标识符;而name属性值稍微复杂些,其值由实例的第一个token中单词或pos标签及数个下划线组成,其目的主要是提高实例匹配时的效率。match标签中的内容是该实例的核心匹配部分,它包含一个属性casesensitive用来表示匹配时大小写的敏感性,另外,其里面包含数个token用以实现匹配。每个token对应于一个单词,其匹配的内容可以是单词本身或pos标签,token的值为匹配的单词,若为空则不匹配单词,另外,它还包含几个属性:inflected属性表示是否允许匹配该单词的所有曲折形21
第4章实例语法检查模块的设计与实现式,在实际匹配时,若inflected属性为yes,则匹配单词的词干信息;reg属性表示在匹配单词时是否接受正则表达式匹配;postag属性表示匹配的postag标签:postagreg表示匹配pos标签时是否接受正则表达式匹配;skip属性则表示匹配到下个token允许跳过的单词个数,默认值为0,若值为.1,表示可以不限距离匹配下个token。每个token中包含数个exception标签,表示该token匹配时的例外情况,exception较为特殊的一个属性是scope,该属性值为current、previous或next,分别表示例外情况的位置,例如,上面实例中第三个token标签即表示匹配除pos标签为VBG以外的所有动词。4.2核心类的设计在前一节中我们介绍了实例的形式及存储方式,本节则在此基础上完成实例语法检查模块中核心类的设计。实例语法检查模块主要涉及五个核心类,加上与句子模型相关的另外两个类共七个,它们的相互关系如图4.1所示。其中,Sentence类为3.3.2节中的句子模型,此处不再进行介绍,一个Instance类的实例即为读入内存的一条错误信息,Token类是与XML文件中的token标签对应的类,ExceptionClass类对应于XML中的exception标签中的内容,InstanceChecker类是检查器的核心类,其中实现了实例的匹配及测试方法等。接下来我们将逐个介绍除Sentence以外的四个核心类(以下类介绍仍只列出核心属性和方法,省略了属性存取及其他一些辅助方法)。
第4章实例语法检查模块的设计与实现4.2.1ExceptionClass类图4.1实例语法检查的类图ExccptionClass类的核心属性及方法设计如下:classExceptionClass{public:Exc圮ptionClass(stringscope,stringexception,stringpostag,boolreg,boolpostag__reg);——ExceptionClassO;boolmateh(eonstSentence&sent,hatindex);private:stringscope;stringexception;stringpostag;boolreg;
第4章实例语法检查模块的设计与实现boolpostagreg;);ExceptionClass类中的属性对应于实例文件中的exception标签,其含义与XML文件中一致,此处不再重复。此外,该类中包含一个matchO方法,该方法实现目标单词与自身进行匹配的情况,由于exception本身scope属性可能包含值“previous”及“next",在匹配时需要考虑句子的整体情况,因此该方法的参数设置为两个,第一个参数是要检测的句子,为提高效率,采用常引用的形式,第二个参数是当前检测的单词在句子中的下标。match方法的返回值说明了匹配的结果。4.2.2Token类Token类的定义如下:classToken{public:Token(stringtoken,boolreg,boolinflected,stringpostag,boolpostagreg,intskip,vectorexceptions);-TokenO;boolmatch(constSentence&sent,intindex);private:stringtoken;boolreg;。boolinflected;stringpostag;boolpostag_reg;hatskip;vectorexceptions;);Token类对应于XML文件中的token标签,它的主要功能是实现单词和一个token之间的匹配。Token类中的match0方法是该类的核心方法,在匹配过程中,此方法会调用ExceptionClass中的matchO方法,只有当前单词与Token类的基本属性匹配并且与exceptions中的所有例外都不匹配时,该方法才会返回true,标示此token匹配成功。24
第4章实例语法检查模块的设计与实现4.2.3Instance类Instance类的核心属性及方法设计如下:classInstance{public:Instance(stringid,stringname,vectortokens,stringmessage,stringexample,boolcase_sensitive);——nastance0;boolmatch(constSentence&sent);private:stringid;stringname;vectortokens;stringmessage;stringexample;boolcase_sensitive;);Instance类表示一个完整的实例,其除了包含一些基本属性及函数外,还包括一个实现检测本实例与目标句子是否匹配的matchOi蚕l数,该函数传入参数为一个句子,返回值表示该句子是否与本实例匹配。该函数执行过程中需要多次调用Token类中的matchOi函数。4.2.4InstanceChecker类InstaneeChecker类的设计如下:classInstanceChecker{public:InstanceChecker(stringxmlme);—。InstanceCheckerO;boolcheck(eonstSentence&sent);b001sortlmtanceO;boolcheckBinary(constSentence&sent);booltestChecker(stringtestFile,stringoutputFile);
第4章实例语法检查模块的设计与实现private:vectorinstances;hatcatgorylnum;intcatgory2num;一一一);hastanceChecker类表示一个检查器,该类的构造函数传入实例的XML文件,解析并将其中的实例存入到instances属性中。实例集被分为三类,他们采用不同的命名方式(在4.3.1中详细介绍分类方式及命名),属性catgoryl_num及catgory2_num分别表示第一类及第二类实例的数量。另外,该类中还包括三个核心方法:sortlnstanceO函数表示对实例集按特定方式进行排序,以方便进行匹配;checkO方法和checkBinaryO方法在功能上都实现了根据instances进行语法检查的功能,不同的是checkO方法采用的是逐个匹配的方式,而eheckBinm:O采用的是二分匹配的方式。而testCheckerO方法实现了批量验证实例集的功能,参数testFile是进行验证的源数据文件,而outputFile是匹配结果存储的文件,返回值则标示是否完成验证。4.3实例语法检查的匹配算法设计4.3.1实例的命名策略在实例语法检查中,虽然负实例的模式能大大减少实例的规模,但实际上,想要实例语法检查算法达到很好的效果,实例数量仍然需要很大。在实例匹配时,传统的逐个匹配方式,随着实例规模及待检查句子中单词数量的增加,匹配时间大幅度增加。而GCSCL中实现了全新的实例匹配算法,通过对实例进行特殊的命名,在匹配时采用二分查找技术,使得实例规模较大时匹配时间较传统方法明显缩短。经过分析,在匹配过程中,大部分的时间消耗在第一个token的匹配上,因此提高第一个token的匹配效率是减少匹配时间的关键。因此,本检查器根据实例中第一个token的特性将实例分为三类:第一类,token匹配的是单词本身,且不接受正则表达式匹配,此类token的名称为第一个token的值,如name=”stick”;第二类,第一个token匹配的是单词的pos标签,且不接受正则表达式匹配,此类token的命名为一个下划线加上token中postag的值,如nanlo.=”IN"’;除了这两种情况以外的错误我们称为第三类错误,第三类错误的命名为两个下划线加上
第4章实例语法检查模块的设计与实现token或postag的值,如name=’’.-aI耐’。按照此种方式命名后,初始化检查器时我们可以预先对实例按照name属性进行排序,在进行语法检查时,由于第一类和第二类错误实例的name属性中不包含正则表达式,对第一个token的匹配可以采用二分查找技术,而第三类错误则采用逐个匹配的方式。通过对实例的整理研究发现,大部分情况下,实例中的第一个token是该实例的核心词汇,因此绝大部分实例集中在第一类错误中,而检查器的执行效率也主要取决于第一类错误的匹配时间。这种利用二分查找技术对匹配过程进行优化的方式,理论上可以大大地减少匹配所需要的时间。4.3.2实例匹配的两种方法实现在上一节中,我们知道检查器类中包含两个方法:checkO和cheCkBinarYO,他们采用不同的方式实现了实例的匹配过程,接下来我们对这两种匹配方式进行详细的介绍。(1)checkO方法是采用传统的逐个匹配方式进行的,其匹配方式较为简单,该方法实现如下:boolChecker::check(Sentence&sent){for(unsigncdinti-O;iArcList。具体的匹配过程如下:1、定义一个弧列表ArcListarcli(为方便,后面用words直接表示sent.words);2、fori=0towords.size0—1do:2.1尝试用words[i]来扩展arcli的所有活动弧,若成功,更新弧信息,若不成功,删除该弧。2.2对第一类错误集以name属性进行二分查找匹配当前词words[i]的单词属性,若匹配成功,将新弧加入到arcli中。2.3对第二类错误集以name属性进行二分查找匹配当前词words[i]的postag属性,匹配成功则加入新弧。2.4对所有弧进行扫描,若已匹配成功,则标记为非活动弧。3、arcli中所有非活动弧即为匹配成功的弧,将相应的实例保存在sent.errors中。4、以逐个匹配方式匹配第三类错误,并将错误信息加入至lJsent.e鹏rS中。
第4章实例语法检查模块的设计与实现4。3.3两种匹配方法效率的比较在4.3.2中笔者介绍了传统匹配与二分匹配两种方法,本节的内容主要是对这两种方法的执行效率在理论与实践两个方面进行对比。假设实例集中的实例个数为m,待检测句子的长度为n,由于传统的实例匹配对每个实例要进行一次双层循环,因此其时间复杂度为O(m宰1"12);而二分匹配中每个句子仅需要作一次扫描,另外前面己述,匹配时间主要取决于第一类错误的匹配时间,因此仅考虑第一类错误,由于该类错误采用二分查找的方式,故时间复杂度为O(n幸109,而。由此可以看出,理论上,二分匹配的时间复杂度远远低于传统匹配,但实际上,二分匹配有包括维护弧列表信息等的额外开销,因此,在实例规模不大的时候,采用二分匹配,其匹配效率并不一定有明显的提升。在测试集中随机选择100个句子,由于目前实例个数有限,通过程序生成部分测试实例进行补充,比较不同实例规模下两种匹配方式所用时间如表4.1所示,其中有两点需要说明:(1)由于实际情况下,第一类实例占据了实例集的绝大部分,为方便起见,测试实例集均为第一类实例。(2)该表中列出的时间仅仅是完成匹配所消耗的时间,其他的预处理工作(如建立句子模型及读入实例等)的耗时已由程序过滤掉。表4.1100个句子在两种匹配方法下所用时间随实例规模变化表蠢热.1010050010002000传统匹配(ms)74396201632875968二分匹配(ms)157272293307316从上图中我们可以看出,单从匹配时间来看,当实例规模较少时,二分匹配并不能在效率上有明显的优势,但随着实例数量的不断增加,其优势愈发表现得明显起来。在实际匹配中,当实例规模不大时,检查系统中其他工作的开销(预处理等)相对于匹配耗时往往不能忽略,这就使得系统总体执行时间差别不大,因此传统的匹配方式由于其简单易用性尚有一定的应用余地。4.4实例的获取在前一节中,笔者详述了GCSCL中实例语法检查模块中两种匹配算法的实29
第4章实例语法检查模块的设计与实现现,本节的内容则主要针对该模块中实例文件的获取。4.4.1实例的获取方式在实例语法检查的实现中,实例文件的收集整理工作占据了极其重要的地位。实例的获取一般有以下两种方式:第一,通过人工方式收集语言教学材料中的常见错误,并从中抽取实例;第二,通过计算机对具有错误标注的语料库进行分析归类,再通过人工整理其结果来抽取实例。完全通过计算机自动整理的实例不能达到很高的概括性,因此,在实例整理工作中,目前计算机主要起归类辅助作用,最终的抽取概括工作还需要人工介入。GCSCL中目前约有九百多条可用实例,其来源主要有三个方面:第一,在借鉴其它语法检查器的部分现有实例的基础上,按照我们的需求进行完善以供使用;第二,笔者研究了国内部分英语教学类书籍,并从中找出了具有代表性的三本(《英语语法常见问题详解》【17】、《薄冰英语常见共性问题解答》【18】及《大学生英语写作指南》tlg]),通过对三本书中描述的英语常见错误的研究,笔者进行归类分析,在此基础上整理了三百多条具有一定概括性的实例;第三,笔者从中国科学技术大学的学生习作(约三百篇作文)中整理出了一百多条具有代表性的实例,并加入到系统中。4.4.2实例的有效性与误判性验证由于系统中的实例大多数是由人工整理的,虽然具有高度概括性,但并不能保证其绝对正确性。因此,在获取实例后,需要对这些实例进行验证,这其中包括两个方面:有效性和误判性验证。有效性验证的主要目标是程序及实例的书写是否符合意图,有效性验证一般需要根据实例的要求,手工书写一些测试用例,测试用例要尽可能概括到实例的多个方面,事实上,这些测试用例一般可以直接通过example标签写在实例文件中,系统会自动读取相应的例子来实现有效性验证的功能。误判性验证一方面针对由于实例的高度概括性所导致的被忽略的特例情况,另一方面则用以修正由基础模块的错误(如pos标注错误)所导致的误判。误判性验证的方式主要是通过目标实例集去匹配大量的正确语料,通过记录匹配成功的句子来分析原因,不断地完善实例。4.4.3辅助添加实例的工具GCSCL中的实例语法检查模块内置了辅助添加实例的工具,其作用有两个:
第一,提供添加实例的页面,并在此页面中验证XML的语法正确性;第二,对于输入的实例自动进行有效性和误判性验证,为实现高质量的实例提供了有效保证。GCSCL内置了两个语料库进行验证,分别是CLEC和BNC。GCSCL中实例添加的页面如图4.2所示。添加实例添加的实例图4.Z添加实例页面‘insist</token>on</token>‘诎enskip=i"O"pos.te:a。g="VB.*"。po。ststag_regex....p=:y“nes1le=pOs【nupo。。4旨一。u”o</pattern>insist01%做坚持将correct“>They成功匹配的句子其后如果接动词鄯需要接动名i司</message>insisted01%solvingtheproblem.</example>They通8Jstonsolvetheproblemthemselves·lanyreadersstillinsistonreadphysicalbooks·图4.S实例验证页面31
第4章实例语法检查模块的设计与实现当页面上添加了XML实例后,点击“验证”,若所输入的实例合理,系统会随机从语料中抽取一些句子进行验证,并将匹配结果展示给用户,如图4.3所示。用户可以通过匹配结果不断地改进该实例,直到满意为止。4.5本章小结本章的核心内容是语法检查引擎中实例语法检查模块的设计与实现,笔者首先阐述了GCSCL中实例文件的表示形式,并对实例语法检查的核心类进行了设计。然后,笔者介绍了两种匹配算法的实现,并在理论和实验礴个方面对它们的效果进行了比较。最后,介绍了实例的获取及验证方式,并对GCSCL中实例辅助添加工具的功能进行了说明。
第5章N.Gram语法检查模块的设计与实现前一章中,笔者详细介绍了GCSCL中实例语法检查模块的设计与实现。实例语法检查能有效地识别各种特定类型的错误,并反馈给用户合理的修改意见,其效果很符合我们的需求,但是它存在一个明显的缺点:能发现的错误数相对较少,在检查器中实例数目尚少的情况下这一点尤为明显。因此,GCSCL的语法检查引擎引入N.Gram模块来补充进行语法检查,以完善实例语法检查器的缺点。5.1N.Gram语法检查的设计5.1.1GCSCL中的N.Gram语法检查N.Gram语法检查实际上就是根据语料库中的统计信息来确定输入句子是否符合语法,在GCSCL中,我们考虑的主要是二元语法和三元语法,由于N.Gram的主要缺点就是对一些长距离的错误显得无能为力,因此,我们采集句子中所有pos标签的信息作为补充,来发现一些句子整体结构的语法问题。基于统计的检查分为两个阶段:训练阶段和检查阶段【引。在训练阶段中,输入是选定的语料库,输出为其中包含的统计信息(GCSCL的检查器中包括二元语法、三元语法及句子所有pos标签),并将这些信息存入到数据库中以备用。例如对于句子“111etwoshirtsaleofasize.”来说,系统首先对其进行标注,其结果为“TheDTtwoCDshirtsNNSareVBPofINaDTsizeNN..”。然后将相应的二元语法信息(“Thetwo”,“twoshirts”,“shirtsare”等)、三元语法信息(“Thetwoshirts",“twoshirtsale”,“shirtsaleof"等)、句子全部pos标签信息CDTCDNNSVBPINDTNN.”)存入数据库。在检查阶段,输入为待检测句子,系统根据数据库中的有用信息来分析输入句子,确定句子中是否包含语法错误以及错误的位置,并以此作为输出。检查二元及三元语法错误的方式类似,方法是将句子中所有的相关统计信息与数据库内的数据进行比较,如果数据库中不存在对应的二元语法及三元语法,则我们认为该处存在错误,二者的不同之处在于,系统对于不存在的二元语法判定为错误,而对于不存在的三元语法判定为警告。检查句子整体错误时,则通过该句子的全部pos标签信息与数据库中的信息进行比较来实现,若该句子的pos标签序列在数据库中不存在,则认为句子整体结构有误。不同于实例语法检查,统计语法检查是具有语言独立性的,即它可以应用到33
第5章N.Gram语法检查模块的设计与实现任何语言,不同点只在于其训练语料和预处理工作。通过使用不同的语料库进行训练,我们可以得到不同的模型,并运用它们进行语法检查。S。1。2数据库设计N.Gram语法检查中所存储的主要是大量的统计信息,包括单词二元语法、三元语法及句子全部pos标签,系统中采用mysql数据库来存储这些数据。为方便起见,系统额外添加单词表wordset和pos标签表tagset来存储单词和pos标签信息。wordset表中的信息包括单词本身和它在语料库中出现的频次(本模块中所有的统计表中都加入了频次字段,方便系统进行其它统计方法的扩展),tagsct表中的信息包括pos标签及其出现的频次,两个表的具体设计如表5.1和表5.2所示。表5.1数据库中的单词表vordset字段数据类型描述idhatwordset表的主键,自增长wordvarchar存储单词的字符串frequencyint表示该单词在目标语料库中出现的频次表5.2数据库中的标签表tagsei字段数据类型描述idintta铲et衾酌主键,’自增长tagvarchar存储tag字符串frequencyint存储该tag在语料库中出现的频次建立了这两个基本表之后,其它表的信息均以这两个表中的信息为基准,二元语法信息保存在2_gram表中,三元语法信息保存在3...gram表中,句子全部tag信息保存在all_tag中,各表的设计如表5.3、表5.4、表5.5所示。表5.3数据库中的二元语法信息表幻ram字段数据类型描述idint2._.gram表的主键,自增长Istwordidint二元语法中第一个单词的id,参考wordset表中的id
第5章N.Gram语法检查模块的设计与实现字段二元语法中第二个单词的id,参考wordset表中的id2ndwordidint字段frequencyint二元语法在语料库中出现的频次表5.4数据库中的三元语法信息表柚ram字段数据类型描述idint3_gram表的主键,自增长三元语法中第一个单词的id,参考wordsct表中的id1stwordidhat字段三元语法中第二个单词的id,参考wordsct表中的id2ndwordidint字段三元语法中第三个单词的i‘l,参考wordset表中的id3rdwordidhat字段frequencyint三元语法在语料库中出现的频次表5.5数据库中的全部t妁信息表翻Ij89字段数据类型描述idintall_tag表的主键,自增长tags_idvat"char句子中所有pos标签id的组合,以下划线进行连接frequencyint此种tag组合在语料库中出现的频次5.2训练阶段的算法实现在5.1节中我们讨论了GCSCL中N.Gram语法检查模块的整体思路及数据库设计,本节则重点讲述其训练阶段的设计与实现。5.2。1训练阶段的主要流程对于统计语法检查,在进行检查之前需要对N.Gram模型进行训练,该阶段即称为训练阶段。训练阶段中的核心工作就是计算语料库中的相关统计信息,并将这些信息存入到数据库中,GCSCL中N-gram语法检查的训练阶段主要流程如图5.1所示。35
第5章N.Gram语法检查模块的设计与实现图5.1NOami吾法检查训练阶段的流程图下面逐一介绍流程中各步骤的工作:1、选择原始语料库。本系统允许采用不同的语料库进行训练并保存到相应模型,供进行语法检查时选择使用,另外,也可以用多个语料库训练一个模型。理论上来说,语料库越大,其所能涵盖的语法信息越多,那么,用它进行语法检查的效果就越好。2、语料库的预处理工作。考虑到训练阶段与检查阶段所用标注方法的一致性,系统需要的是单纯的句子文本形式的语料库,其中不包含标注等其他信息。因此,对于包含额外信息的语料库需要首先进行预处理工作,过滤掉多余的信息供训练使用。3、对语料库进行POS标注。由于我们要获得的统计信息中包括pos标签信息,因此在训练时首先要对纯文本语料进行pos标注工作。本系统中所有的标注工作使用的标注工具都是StanfordPOSTagger。
第5章N-Cmma语法检查模块的设计与实现4、统计语料库中的单词与标签信息。由于系统中的二元语法、三元语法及句子全部pos标签信息中所存储的内容关联的是词和标签的id,因此,在计算这些统计信息前,需要首先统计出单词(包括单词及其频次)与标签(包括标注本身及其频次)的信息。5、将单词与标签信息写入数据库。将第4步中得到的信息写入到数据库中,将相应的记录在数据库中的id返回并放入内存,供下一步中使用。6、计算语料库中的其他信息。将单词及标签信息统计存储完成后,计算训练阶段中需要存储的其他语料信息,这些信息包括二元语法信息、三元语法信息及句子全部pos标签信息。7、将第6步中得到的统计信息写入数据库中。此为训练阶段的最后一步,具体的计算及写入方式由语料库的规模来决定,若语料库过大,由于内存的限制,很难一起将上述三种统计信息计算完成,需要对三种信息进行逐个计算并逐个写入数据库。S.2.2训练阶段内存中数据存储形式设计训练阶段的主要任务是计算目标语料库的统计信息,并将这些统计信息存储到数据库中。事实上,程序与数据库不断进行交互的效率较低,因此,GCSCL中训练阶段采用的是一次性的将一种统计信息在内存中计算完成,然后再批量写入数据库的方式。首先,需要定义的是各统计信息在内存中的存储形式,由于本模块中包含的统计信息数量往往较大,并且系统需要不断地查找及增加新纪录,因此训练阶段中统计信息的存储容器采用c++中map容器来实现,以信息内容本身(如二元语法中的第一个和第二个单词)和其出现的频次作为键值对进行存储。下面以二元语法存储为例来说明其在内存中的存储方式,首先需要定义类TwoGram,其具体内容如下:classTwoGram{public:Two_OramO{}.Two_Gram(stringfirst,stringsecond);booloperator<(constTwo—Gram&t曲const{if(first_wordtg.fLrst_word)
第5章N-Gram语法检查模块的设计与实现returnfalse;if(secondwordtg.first_word)returnfalse;if(second_wordtg.second__word)rctlll"nfalse;if(third_wordString_Int_Map;typedefmapTwo_Gram_Map;typedefmapThree_Gram_Map;typedefmapAll_Tag_Map;其中单词与标签统计采厍jStinghatMap,二元语法统计采用TwoGramMap,三元语法统计采Three_Gram_Map,句子所有标签统计采用灿1TagM印。5.2-3训练阶段的代码实现在5.2.1节中己述,在统计信息前需要先对语料进行标注,GCSCL中通过systcmO函数以命令行的方式调用StanfordPOSTagger对目标文件夹下的所有文件进行标注。标注过后,方可在此基础上进行统计信息的计算,具体流程可分为三个部分来执行:1、统计单词及标签信息并写入数据库。首先,定义两个nlap容器分别用来存储单词和标签:String.IntMapwordsforsave;和StringIntMaptagsforsave;,之后,对所有文件中的每个句一一⋯一一子进行循环,统计其中出现的单词及标签信息,核心部分代码如下:for(inti=0;i::iteratorwfs=words—for—save.fmd(word_i);if(wfs!--wordsforsave.endO)wfs->second++;elsewordsforsave[word_]]=l;wfs=tags_for._save.find(tag_i);if(wfs!--tags,forsave.endO)wfs一>second++;elsetags_forsave[tag_i】_1;)上面代码实现的内容是,针对句子中的每个单词,以对应的单词或标签为关键字去相应的map容器中搜索,若找到相应的记录,则将对应的频次值加1,若没找到,则将该记录添加到map中。最后,将统计好的信息批量写入数据库。2、从数据库中一次性读出所有单词和标签的信息。由于各统计信息中所存储的内容均关联于id,因此在将单词和标签信息批量导入数据库后需要再次读出以获得单词和标签的完整信息(主要运用它们在数据库中的id),二者在内存中所用。的容器为mapall_tags和mapallwords,其中map容器的键值对中第一个string表示特定的单词或标签字符串,而第二个string表示字符串所对应的id值。all和.tagsallwords两个容器完成初始化后,即可进行之后统计的工作。3、根据单词和标签信息计算其他统计信息并写入数据库。首先,计算二元语法的相关信息,定义容器Two_Gram_Mapmap_2__gram,对所有文件中的每个句子进行循环处理,其核心代码如下:for(inti-O;i::iteratormtgi=40
第5章N.Gram语法检查模块的设计与实现map._2_gram.find(Two_Gram(first_id,secondid));if(mtgil--map_2_gram.end0)mtgi->second++;elsemap_2__gram[Two_Gram(firstid,secondid)]_1;)此段代码实现了保存句子中的二元语法信息,计算完成后,将map_2gram容器中的内容批量写入到数据库中,并清空该容器。三元语法信息的计算方式与二元语法基本相同,预先定义容Three_Chain_Mapmap_3_gram;,相关核心代码如下:foronti=0;i::iteratormtgi=map_3_gram.find(Three_Gram(first_id,second_id,thirdid));if(mtgi!--rnap_3__gram.end0)mtgi一>second++;elsemap_3_gram[ThreeGram(first_id,second_id,third_id)]-1;)最后,统计句子全部tagf言g,定义容器砧lJag_Mapmap_all_tag;,其实现的核心代码如下:stringtags_result;for(inti—O;i::iteratormarl=map_all_tag,fmd(tagsresul0;if(mafit--map_aU_tag.end0)marl一>second++;else41
第5章N.Gram语法检查模块的设计与实现map_aU_tag[tagsresult]-1;)此步中,首先对句子进行循环,计算出要存储的全部标签值,其后在map容器中查找,并根据查找结果完成相应的动作。对所有文件中的所有句子循环完成后,将结果写入数据库,训练阶段的主要任务已完成。5.2.4GCSCL中的语料库训练功能GCSCL中内置了以BNC和Brown语料库作为原始语料进行训练的模型,该模型是系统进行语法检查时所用的默认模型。另外,该系统还提供TiJll练新语言模型的接口,通过该接口的应用,用户可以训练自己的模型并通过传入参数的形式选择不同的模型进行语法检查。系统中训练模型的图形化界面如图5.2所示。训练新模型语料目录:数据库用户名:数据库密码:数据库主机:数据库端口:数据库名:[二二二二二二二二二二二二】r——?——1}训练I图5.2语料库训练需要输入参数的界面该图中输入包括六个属性,它们分别是训练语料目录、数据库用户名、数据库密码、数据库主机口、数据库所用端口及存放模型的数据库名称。此处值得注意的是:GCSCL要求训练语料为纯英文文本,其中不包含任何的标记,也就是说,如果训练语料中包含一些额外的信息,要求用户在预处理阶段提前完成去标记工作。在提交相应的输入后,系统会建立对数据库的连接,并对语料目录所有文件中的统计信息进行训练,若用户输入的数据库名在系统中已存在,系统会完善相应数据库名所对应的模型;若数据库名不存在,系统则会新建数据库,并在该数据库中训练相对应的模型。
第5章N.Gram语法检查模块的设计与实现5.3检查阶段的算法实现5。3.1检查阶段的主要流程经过训练后的语法检查器在数据库中保存了相应的语法模型,根据这些N.Gram数据我们可以对任何输入句子进行语法合理性判断。N.Gram语法检查模块在检查阶段的核心任务就是根据模型来找出句子中存在的潜在错误,检查阶段的主要流程如图5.3所示。图5.3NG"mqi吾法检查检查阶段的流程图43幸
第5章N-Gram语法检查模块的设计与实现以下逐一介绍各步骤中的具体内容:1、从语法引擎中接受句子模型。在语法检查时,GCSCL中的语法检查引擎已经提前进行了必要的预处理工作(包括分词、分句及标注等),并由此建立了基本的句子模型供两个检查模块使用。因此,本模块只需要直接接受建立好的句子模型。2、初始化单词id和标签id。虽然在进行语法检查前基本的句子模型己建立,但是由于我们的N.Gram信息中所关联的是单词和标签的id属性,因此在进行具体的语法检查工作前应先初始化各单词的wordid与tagid。3、二元语法检查。针对目标句子中每个二元语法,在数据库中查询相应的记录,若记录中出现的频次值小于特定阈值,则我们认为此处存在语法错误,将该错误的信息写入到句子信息中。阂值的不同体现了对语法检查性能要求的不同,理论上来说,阈值偏高会导致检查器过于敏感,从而导致很多错判;阈值偏低则会使检查器所能识别的错误较少。因此,设置合理的阈值在检查器的性能上影响很大。GCSCL以运行参数方式更改阈值,由于默认语言模型规模的限制,系统默认值为1。4、三元语法检查。对于句子中的所有三元语法,语法检查程序依次查询数据库中相关数据,若某个三元语法在数据库中不存在,则认为该处存在潜在错误,并以警告的形式添加到句子信息中。5、,全部句子标签检查。根据句子中的标签信息,将各标签id以下划线连接组成目标格式,并以该字符串为关键词查询数据库相关表,若不存在相关记录,则认为句子整体结构存在问题,将错误加入到句子信息中。5.3.2检查阶段的代码实现在5.3.1节中已述,N.Gram语法检查模块不需要自己建立句子基本模型,而是直接从语法引擎中作为参数传入,因此,检查阶段涉及到代码实现的部分主要包括以下几个方面:1、初始化单词和标签id。该部分工作的目标主要是完善句子模型中每个单词的word—id与tag_id,核心代码如下所示:MYSQLmyCont;MYSQL_RES木result=NULL;for(roti_O;i