古文斷句器13307130309 唐義祺
本工作以維基文庫(kù)為基礎(chǔ)奄毡,通過(guò)爬蟲(chóng)程序抓取數(shù)據(jù),經(jīng)過(guò)python字符串處理構(gòu)建古文語(yǔ)料庫(kù)贝或,并簡(jiǎn)要分析了語(yǔ)料的特點(diǎn)吼过;使用rnnlm庫(kù)通過(guò)回歸神經(jīng)網(wǎng)絡(luò)訓(xùn)練語(yǔ)言模型,并通過(guò)修改神經(jīng)網(wǎng)絡(luò)參數(shù)說(shuō)明參數(shù)的作用咪奖;在此基礎(chǔ)上盗忱,本工作使用一種動(dòng)態(tài)規(guī)劃方法對(duì)古文進(jìn)行斷句,并對(duì)時(shí)間復(fù)雜度進(jìn)行了分析赡艰。##INTRODUCTION古書(shū)一般是不斷句的售淡,前人讀書(shū)時(shí)要自己斷句[1]。所以慷垮,斷句能力在整理古籍時(shí)有著重要的作用揖闸。如果能實(shí)現(xiàn)機(jī)器斷句,古籍整理的效率將大為提高料身。同時(shí)汤纸,古人很重視句讀的訓(xùn)練,因?yàn)槊鞅婢渥x是讀懂古書(shū)的起點(diǎn)[1]芹血。假使斷句沒(méi)有錯(cuò)誤贮泞,也就可以證明對(duì)古書(shū)有了初步的了解楞慈。語(yǔ)文高考中的斷句題的設(shè)置也是出于考察學(xué)生對(duì)古文的理解而設(shè)置的。所以啃擦,機(jī)器斷句也可以展現(xiàn)機(jī)器對(duì)于語(yǔ)言的處理能力囊蓝,為進(jìn)一步處理更難的問(wèn)題奠定基礎(chǔ)。##PRE-PROCESSING本文選擇選取維基文庫(kù)作為語(yǔ)料庫(kù)令蛉,因?yàn)榫S基文庫(kù)里古文資源集中聚霜,而html格式比較規(guī)則,便于用爬蟲(chóng)程序進(jìn)行處理珠叔。本文語(yǔ)料盡量選取有代表性的文本蝎宇,主要是史書(shū)和唐朝以后的文章。之后祷安,運(yùn)用正則表達(dá)式把文章按逗號(hào)及句號(hào)進(jìn)行切分姥芥,并去處冗余的標(biāo)點(diǎn)。處理后的文件共有37.2M汇鞭。下表顯示了詞頻排前二十位的字以及出現(xiàn)次數(shù)凉唐。><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 無(wú)</td> </tr> <tr> <td>52554 所 51750 下</td> </tr> <tr> <td>47877 天 47012 中</td> </tr></table>##TRAINING&TESTING本工作使用rnnlm庫(kù)實(shí)現(xiàn)語(yǔ)言模型的訓(xùn)練。相對(duì)常見(jiàn)的N-grams語(yǔ)言模型霍骄,神經(jīng)網(wǎng)絡(luò)有記憶能力熊榛,這樣就擺脫了N-grams里當(dāng)前詞片面地由之前幾個(gè)詞決定的問(wèn)題。rnnlm toolkit 是一個(gè)基于時(shí)間遞歸神經(jīng)網(wǎng)絡(luò) (Recurrent Neural Network)的語(yǔ)言模型工具腕巡,下面從原理及使用兩方面介紹rnnlm庫(kù)玄坦。####原理 - 人工神經(jīng)元人工神經(jīng)元是一種模擬生物神經(jīng)元的學(xué)習(xí)模型,由若干輸入$x_i$及其權(quán)重$w_{ki}$和一個(gè)中間函數(shù)$\phi$和輸出$y_k$組成绘沉,$y_k$可以看作關(guān)于$x_i$的函數(shù):><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>人工神經(jīng)元可以形象地表示如下圖煎楣。>
- 人工神經(jīng)網(wǎng)絡(luò)由于單個(gè)人工神經(jīng)元所能表示的函數(shù)有限,所以需要將人工神經(jīng)元連結(jié)起來(lái)车伞,并在輸入層和輸出層之間加入若干隱藏層择懂。可以證明一個(gè)隱藏層就可以表示輸入信號(hào)的任何連續(xù)函數(shù)另玖,兩個(gè)及以上的隱藏層可以表示更加復(fù)雜的不連續(xù)函數(shù)困曙。人工神經(jīng)網(wǎng)絡(luò)可以形象地表示如下圖。>
- 時(shí)間遞歸神經(jīng)網(wǎng)絡(luò) (Recurrent Neural Network)時(shí)間遞歸神經(jīng)網(wǎng)絡(luò)和一般神經(jīng)網(wǎng)絡(luò)的區(qū)別在于:一般神經(jīng)網(wǎng)絡(luò)是前饋的谦去,也就是說(shuō)慷丽,是單向的;而遞歸神經(jīng)網(wǎng)絡(luò)會(huì)有指向自己的邊鳄哭。有研究表明要糊,遞歸神經(jīng)網(wǎng)絡(luò)在自然語(yǔ)言處理領(lǐng)域表現(xiàn)得比前饋神經(jīng)網(wǎng)絡(luò)更好[2]。rnnlm中使用的時(shí)間遞歸神經(jīng)網(wǎng)絡(luò)(Elman網(wǎng)絡(luò)妆丘,或簡(jiǎn)單遞歸神經(jīng)網(wǎng)絡(luò))如下圖所示:>
輸入層是經(jīng)1-of-N編碼的詞(在中文信息處理中是字)锄俄。隱藏層的神經(jīng)元采用sigmoid函數(shù)局劲,并指回自己,形成過(guò)去對(duì)記憶的影響奶赠。輸出層和輸入層神經(jīng)元數(shù)目相同鱼填,表示詞對(duì)應(yīng)的概率[3]。####使用在python中通過(guò)os庫(kù)執(zhí)行以下命令通過(guò)rnnlm訓(xùn)練數(shù)據(jù)>./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解釋部分關(guān)鍵參數(shù): -trian 訓(xùn)練集路徑 -valid 效驗(yàn)集路徑 -rnnlm 訓(xùn)練結(jié)果路徑 -hidden 隱藏層數(shù)目 -rand-seed 隨機(jī)種子 -debug 決定輸出信息格式 -class 詞類(lèi)數(shù)毅戈,把詞分為若干類(lèi)剔氏,可以減少計(jì)算量。在python中通過(guò)os庫(kù)執(zhí)行以下命令通過(guò)rnnlm測(cè)試數(shù)據(jù)竹祷,可以得到測(cè)試數(shù)據(jù)的總概率log并取負(fù)后的值>./rnnlm -rnnlm XXX.txt, -test, XXX.txt解釋部分關(guān)鍵參數(shù): -rnnlm 訓(xùn)練模型路徑 -test 測(cè)試數(shù)據(jù)路徑 ##SEGMENTATION不妨定義測(cè)試數(shù)據(jù)的概率log并取負(fù)后的值為“不靠譜度”,把單個(gè)句子作為一個(gè)測(cè)試數(shù)據(jù)羊苟。我們知道:>-lgAB=-lgA-lgB那么這個(gè)“不靠譜度”就有了個(gè)很好的性質(zhì)塑陵,就是兩個(gè)句子一共的“不靠譜度”就等于兩個(gè)句子各自“不靠譜度”的簡(jiǎn)單相加。最小化總的“不靠譜度”就是斷句方案的目標(biāo)蜡励。受到維特比算法(Viterbi algorithm)的啟發(fā)令花,我決定設(shè)計(jì)一個(gè)動(dòng)態(tài)規(guī)劃的方法進(jìn)行斷句。狀態(tài)f(i,j)表示到位置i被分為j段所獲得的最小的凉倚,cost為i+1開(kāi)始取k個(gè)字組成的句子的“不靠譜度”兼都,則可以得到狀態(tài)轉(zhuǎn)移方程如下:>f(i,j)=max{f(i - k - 1,j - 1) + cost(i,k)}在狀態(tài)轉(zhuǎn)移的過(guò)程里,記錄每個(gè)狀態(tài)的最優(yōu)來(lái)源狀態(tài)稽寒,存到next數(shù)組里扮碧。狀態(tài)轉(zhuǎn)移完成后,找到最小的f假設(shè)文本長(zhǎng)度為n杏糙∩魍酰可以發(fā)現(xiàn)狀態(tài)大小為$n2$,在預(yù)先算好cost的情況下宏侍,轉(zhuǎn)移耗時(shí)max{k}為n赖淤。故總時(shí)間復(fù)雜度為O($n3$),設(shè)計(jì)算cost的平均時(shí)間為ave谅河,則預(yù)處理cost的復(fù)雜度為O($n2*ave$)我們知道咱旱,古文里句子一般不長(zhǎng),所以可以進(jìn)行以下優(yōu)化:設(shè)窗口值m(實(shí)驗(yàn)中設(shè)m=15)為預(yù)先設(shè)定的最大句長(zhǎng)绷耍。則總時(shí)間復(fù)雜度為O($n2m$)吐限,預(yù)處理cost的復(fù)雜度為O($nm*ave$)在實(shí)際操作里,可以發(fā)現(xiàn)預(yù)處理cost為時(shí)間瓶頸褂始。##RESULTS本文擬以《岳陽(yáng)樓記》為例毯盈,形象地展現(xiàn)工作的性能,如下所示:原文:>慶曆四年春滕子京謫守巴陵郡越明年政通人和百?gòu)U具興乃重修岳陽(yáng)樓增其舊制刻唐賢今人詩(shī)賦於其上屬予作文以記之予觀夫巴陵勝狀在洞庭一湖銜遠(yuǎn)山吞長(zhǎng)江浩浩湯湯橫無(wú)際涯朝暉夕陰氣象萬(wàn)千此則岳陽(yáng)樓之大觀也前人之述備矣然則北通巫峽南極瀟湘遷客騷人多會(huì)於此覽物之情得無(wú)異乎若夫霪雨霏霏連月不開(kāi)陰風(fēng)怒號(hào)濁浪排空日星隱耀山岳潛形商旅不行檣傾楫摧薄暮冥冥虎嘯猿啼登斯樓也則有去國(guó)懷鄉(xiāng)憂讒畏譏滿目蕭然感極而悲者矣至若春和景明波瀾不驚上下天光一碧萬(wàn)頃沙鷗翔集錦鱗游泳岸芷汀蘭郁郁青青而或長(zhǎng)煙一空皓月千里浮光躍金靜影沉璧漁歌互答此樂(lè)何極登斯樓也則有心曠神怡寵辱皆忘把酒臨風(fēng)其喜洋洋者矣嗟夫予嘗求古仁人之心或異二者之為何哉不以物喜不以己悲居廟堂之高則憂其民處江湖之遠(yuǎn)則憂其君是進(jìn)亦憂退亦憂然則何時(shí)而樂(lè)耶其必曰先天下之憂而憂後天下之樂(lè)而樂(lè)乎噫微斯人吾誰(shuí)與歸時(shí)六年九月十五日取隱藏層數(shù)為15病袄,窗口值為15后的結(jié)果:>慶曆四年春 \ 滕子京謫守巴陵郡越明年 \ 政通人和 \ 百?gòu)U具興 \ 乃重修岳陽(yáng)樓 \ 增其舊制刻唐賢 \ 今人詩(shī)賦於其上屬 \ 予作文以記之 \ 予觀夫巴陵 \ 勝狀在洞庭 \ 一湖銜遠(yuǎn) \ 山吞長(zhǎng)江浩浩 \ 湯湯橫無(wú)際 \ 涯朝暉夕 \ 陰氣象萬(wàn)千 \ 此則岳陽(yáng)樓之大觀也 \ 前人之述備矣 \ 然則北通 \ 巫峽南極瀟湘 \ 遷客騷人多 \ 會(huì)於此覽物之情 \ 得無(wú)異乎 \ 若夫霪雨霏霏 \ 連月 \ 不開(kāi)陰風(fēng) \ 怒號(hào)濁浪 \ 排空日星 \ 隱耀山岳潛形 \ 商旅不行 \ 檣傾楫摧薄暮冥冥 \ 虎嘯猿啼 \ 登斯樓也 \ 則有去國(guó)懷鄉(xiāng) \ 憂讒畏譏 \ 滿目蕭然 \ 感極而悲者矣 \ 至若春和景明 \ 波瀾不驚 \ 上下天光 \ 一碧萬(wàn)頃 \ 沙鷗翔集錦鱗 \ 游泳岸芷 \ 汀蘭郁郁 \ 青青 \ 而或長(zhǎng)煙一空 \ 皓月千里 \ 浮光躍金 \ 靜影沉璧 \ 漁歌互答 \ 此樂(lè)何極 \ 登斯樓也 \ 則有心曠神 \ 怡寵辱 \ 皆忘把酒 \ 臨風(fēng)其喜 \ 洋洋者矣 \ 嗟夫予嘗求 \ 古仁人之心 \ 或異二者之為何哉 \ 不以物喜不以己悲 \ 居廟堂之高 \ 則憂其民處江湖之遠(yuǎn) \ 則憂其君 \ 是進(jìn)亦憂退亦憂 \ 然則何時(shí)而樂(lè)耶 \ 其必曰 \ 先天下之憂而憂 \ 後天下之樂(lè)而樂(lè)乎 \ 噫微斯人 \ 吾誰(shuí)與歸 \ 時(shí)六年九月十五日 \ ##源碼解釋 - config.py 各種全局的常量 - downloadTexts.py 下載并篩選語(yǔ)料 - textProcessor.py 處理語(yǔ)料 - Train.py 訓(xùn)練語(yǔ)料 - Test.py 測(cè)試語(yǔ)料 - textPartition.py 利用Test.py 進(jìn)行斷句##REFERENCE[1]王力.《古代漢語(yǔ)》[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![]()