古文断句器13307130309 唐义祺
本工作以维基文库为基础,通过爬虫程序抓取数据,经过python字符串处理构建古文语料库,并简要分析了语料的特点;使用rnnlm库通过回归神经网络训练语言模型,并通过修改神经网络参数说明参数的作用;在此基础上,本工作使用一种动态规划方法对古文进行断句,并对时间复杂度进行了分析。##INTRODUCTION古书一般是不断句的,前人读书时要自己断句[1]。所以,断句能力在整理古籍时有着重要的作用。如果能实现机器断句,古籍整理的效率将大为提高。同时,古人很重视句读的训练,因为明辨句读是读懂古书的起点[1]。假使断句没有错误,也就可以证明对古书有了初步的了解。语文高考中的断句题的设置也是出于考察学生对古文的理解而设置的。所以,机器断句也可以展现机器对于语言的处理能力,为进一步处理更难的问题奠定基础。##PRE-PROCESSING本文选择选取维基文库作为语料库,因为维基文库里古文资源集中,而html格式比较规则,便于用爬虫程序进行处理。本文语料尽量选取有代表性的文本,主要是史书和唐朝以后的文章。之后,运用正则表达式把文章按逗号及句号进行切分,并去处冗余的标点。处理后的文件共有37.2M。下表显示了词频排前二十位的字以及出现次数。><table> <tr> <td>337702 之 166622 以</td> </tr> <tr> <td>152447 不 119395 於</td> </tr> <tr> <td>118876 而 116437 為</td> </tr> <tr> <td>105932 其 91008 人</td> </tr> <tr> <td>82150 有 73535 也</td> </tr> <tr> <td>73297 者 65112 曰</td> </tr> <tr> <td>62231 子 61911 王</td> </tr> <tr> <td>60951 大 53089 無</td> </tr> <tr> <td>52554 所 51750 下</td> </tr> <tr> <td>47877 天 47012 中</td> </tr></table>##TRAINING&TESTING本工作使用rnnlm库实现语言模型的训练。相对常见的N-grams语言模型,神经网络有记忆能力,这样就摆脱了N-grams里当前词片面地由之前几个词决定的问题。rnnlm toolkit 是一个基于时间递归神经网络 (Recurrent Neural Network)的语言模型工具,下面从原理及使用两方面介绍rnnlm库。####原理 - 人工神经元人工神经元是一种模拟生物神经元的学习模型,由若干输入$x_i$及其权重$w_{ki}$和一个中间函数$\phi$和输出$y_k$组成,$y_k$可以看作关于$x_i$的函数:><a href="http://www.codecogs.com/eqnedit.php?latex=y_k&space;=&space;\phi(\displaystyle{\sum_{i=1}^{n}}x_iw_{ki}-\theta)" target="blank"><img src="http://latex.codecogs.com/gif.latex?y_k&space;=&space;\phi(\displaystyle{\sum{i=1}^{n}}x_iw_{ki}-\theta)" title="y_k = \phi(\displaystyle{\sum_{i=1}^{n}}x_iw_{ki}-\theta)" /></a>人工神经元可以形象地表示如下图。>
- 人工神经网络由于单个人工神经元所能表示的函数有限,所以需要将人工神经元连结起来,并在输入层和输出层之间加入若干隐藏层。可以证明一个隐藏层就可以表示输入信号的任何连续函数,两个及以上的隐藏层可以表示更加复杂的不连续函数。人工神经网络可以形象地表示如下图。> - 时间递归神经网络 (Recurrent Neural Network)时间递归神经网络和一般神经网络的区别在于:一般神经网络是前馈的,也就是说,是单向的;而递归神经网络会有指向自己的边。有研究表明,递归神经网络在自然语言处理领域表现得比前馈神经网络更好[2]。rnnlm中使用的时间递归神经网络(Elman网络,或简单递归神经网络)如下图所示:> 输入层是经1-of-N编码的词(在中文信息处理中是字)。隐藏层的神经元采用sigmoid函数,并指回自己,形成过去对记忆的影响。输出层和输入层神经元数目相同,表示词对应的概率[3]。####使用在python中通过os库执行以下命令通过rnnlm训练数据>./rnnlm -train XXX.txt -valid XXX.txt -rnnlm XXX.txt -hidden XX -rand-seed X -debug 2 -class XXX -bptt 4 -bptt-block 10 -direct-order 3 -direct 2 -binary解释部分关键参数: -trian 训练集路径 -valid 效验集路径 -rnnlm 训练结果路径 -hidden 隐藏层数目 -rand-seed 随机种子 -debug 决定输出信息格式 -class 词类数,把词分为若干类,可以减少计算量。在python中通过os库执行以下命令通过rnnlm测试数据,可以得到测试数据的总概率log并取负后的值>./rnnlm -rnnlm XXX.txt, -test, XXX.txt解释部分关键参数: -rnnlm 训练模型路径 -test 测试数据路径 ##SEGMENTATION不妨定义测试数据的概率log并取负后的值为“不靠谱度”,把单个句子作为一个测试数据。我们知道:>-lgAB=-lgA-lgB那么这个“不靠谱度”就有了个很好的性质,就是两个句子一共的“不靠谱度”就等于两个句子各自“不靠谱度”的简单相加。最小化总的“不靠谱度”就是断句方案的目标。受到维特比算法(Viterbi algorithm)的启发,我决定设计一个动态规划的方法进行断句。状态f(i,j)表示到位置i被分为j段所获得的最小的,cost为i+1开始取k个字组成的句子的“不靠谱度”,则可以得到状态转移方程如下:>f(i,j)=max{f(i - k - 1,j - 1) + cost(i,k)}在状态转移的过程里,记录每个状态的最优来源状态,存到next数组里。状态转移完成后,找到最小的f假设文本长度为n。可以发现状态大小为$n2$,在预先算好cost的情况下,转移耗时max{k}为n。故总时间复杂度为O($n3$),设计算cost的平均时间为ave,则预处理cost的复杂度为O($n2*ave$)我们知道,古文里句子一般不长,所以可以进行以下优化:设窗口值m(实验中设m=15)为预先设定的最大句长。则总时间复杂度为O($n2m$),预处理cost的复杂度为O($nm*ave$)在实际操作里,可以发现预处理cost为时间瓶颈。##RESULTS本文拟以《岳阳楼记》为例,形象地展现工作的性能,如下所示:原文:>慶曆四年春滕子京謫守巴陵郡越明年政通人和百廢具興乃重修岳陽樓增其舊制刻唐賢今人詩賦於其上屬予作文以記之予觀夫巴陵勝狀在洞庭一湖銜遠山吞長江浩浩湯湯橫無際涯朝暉夕陰氣象萬千此則岳陽樓之大觀也前人之述備矣然則北通巫峽南極瀟湘遷客騷人多會於此覽物之情得無異乎若夫霪雨霏霏連月不開陰風怒號濁浪排空日星隱耀山岳潛形商旅不行檣傾楫摧薄暮冥冥虎嘯猿啼登斯樓也則有去國懷鄉憂讒畏譏滿目蕭然感極而悲者矣至若春和景明波瀾不驚上下天光一碧萬頃沙鷗翔集錦鱗游泳岸芷汀蘭郁郁青青而或長煙一空皓月千里浮光躍金靜影沉璧漁歌互答此樂何極登斯樓也則有心曠神怡寵辱皆忘把酒臨風其喜洋洋者矣嗟夫予嘗求古仁人之心或異二者之為何哉不以物喜不以己悲居廟堂之高則憂其民處江湖之遠則憂其君是進亦憂退亦憂然則何時而樂耶其必曰先天下之憂而憂後天下之樂而樂乎噫微斯人吾誰與歸時六年九月十五日取隐藏层数为15,窗口值为15后的结果:>慶曆四年春 \ 滕子京謫守巴陵郡越明年 \ 政通人和 \ 百廢具興 \ 乃重修岳陽樓 \ 增其舊制刻唐賢 \ 今人詩賦於其上屬 \ 予作文以記之 \ 予觀夫巴陵 \ 勝狀在洞庭 \ 一湖銜遠 \ 山吞長江浩浩 \ 湯湯橫無際 \ 涯朝暉夕 \ 陰氣象萬千 \ 此則岳陽樓之大觀也 \ 前人之述備矣 \ 然則北通 \ 巫峽南極瀟湘 \ 遷客騷人多 \ 會於此覽物之情 \ 得無異乎 \ 若夫霪雨霏霏 \ 連月 \ 不開陰風 \ 怒號濁浪 \ 排空日星 \ 隱耀山岳潛形 \ 商旅不行 \ 檣傾楫摧薄暮冥冥 \ 虎嘯猿啼 \ 登斯樓也 \ 則有去國懷鄉 \ 憂讒畏譏 \ 滿目蕭然 \ 感極而悲者矣 \ 至若春和景明 \ 波瀾不驚 \ 上下天光 \ 一碧萬頃 \ 沙鷗翔集錦鱗 \ 游泳岸芷 \ 汀蘭郁郁 \ 青青 \ 而或長煙一空 \ 皓月千里 \ 浮光躍金 \ 靜影沉璧 \ 漁歌互答 \ 此樂何極 \ 登斯樓也 \ 則有心曠神 \ 怡寵辱 \ 皆忘把酒 \ 臨風其喜 \ 洋洋者矣 \ 嗟夫予嘗求 \ 古仁人之心 \ 或異二者之為何哉 \ 不以物喜不以己悲 \ 居廟堂之高 \ 則憂其民處江湖之遠 \ 則憂其君 \ 是進亦憂退亦憂 \ 然則何時而樂耶 \ 其必曰 \ 先天下之憂而憂 \ 後天下之樂而樂乎 \ 噫微斯人 \ 吾誰與歸 \ 時六年九月十五日 \ ##源码解释 - config.py 各种全局的常量 - downloadTexts.py 下载并筛选语料 - textProcessor.py 处理语料 - Train.py 训练语料 - Test.py 测试语料 - textPartition.py 利用Test.py 进行断句##REFERENCE[1]王力.《古代汉语》[2]T. Mikolov, S. Kombrink, L. Burget, J. Cernock´y, and S. Khudanpur.“Extensions of recurrent neural network language model,” in Proceedings of ICASSP, 2011.[3]T Mikolov, S. Kombrink, A. Deoras, L Burget, J Cernocky. RNNLM - Recurrent Neural Network Language Modeling Toolkit
网友评论