在自然語(yǔ)言處理領(lǐng)域中抛猖,語(yǔ)料是非常關(guān)鍵的一個(gè)部分。然而鼻听,中文的自然語(yǔ)言處理領(lǐng)域在大的通用型語(yǔ)料上雖然不少财著,但在特定方向上的語(yǔ)料仍然匱乏。在要進(jìn)行拼音型文本糾錯(cuò)任務(wù)過(guò)程中撑碴,我發(fā)現(xiàn)這方面的語(yǔ)料著實(shí)少瓢宦,因此在語(yǔ)料的獲取和處理上花費(fèi)較多時(shí)間,以下是我面對(duì)語(yǔ)料匱乏情況下的探索和總結(jié)灰羽。
語(yǔ)料的獲取
語(yǔ)料獲取分為兩個(gè)部分,一是搜索:查詢并獲取已有的特定方向的語(yǔ)料鱼辙。二是制造:自行制造出需要的語(yǔ)料廉嚼。
語(yǔ)料搜索
首先我們自然要考慮能否找到已經(jīng)標(biāo)記好的公開(kāi)語(yǔ)料。
沒(méi)有查詢到相應(yīng)結(jié)果之后倒戏,開(kāi)始尋找這方面的公開(kāi)比賽怠噪,最好是去年或前年這類年份較近且比賽已經(jīng)結(jié)束的,一來(lái)更可能可以獲取完整語(yǔ)料杜跷,二來(lái)可以參考比賽結(jié)束后放出的優(yōu)勝者的論文傍念,而年份越近則參賽者更可能用上更先進(jìn)的方法矫夷。
此外還可以參考這方面的論文,論文中會(huì)給出評(píng)測(cè)的方法和樣例文本憋槐,根據(jù)文中出現(xiàn)的語(yǔ)料來(lái)源關(guān)鍵詞再進(jìn)行搜索双藕。由此我搜索到幾份臺(tái)灣的拼音型質(zhì)量較高的語(yǔ)料,分別是13-15年的Chinese Spelling Check Task的語(yǔ)料:
SIGHAN 2013 Bake-off: Chinese Spelling Check Task
CLP 2014 Bake-off: Chinese Spelling Check Task
SIGHAN 2015 Bake-off: Chinese Spelling Check Task
以下是語(yǔ)料的一個(gè)樣例:
可以看出阳仔,這份語(yǔ)料的錯(cuò)誤類型是拼音相近的詞語(yǔ)忧陪,它不僅標(biāo)出了錯(cuò)誤詞語(yǔ),還給出了正確答案近范,由此還可以將錯(cuò)誤檢測(cè)模型擴(kuò)展為糾正模型嘶摊。
填寫(xiě)資料下載后可以看到,壓縮包中除了訓(xùn)練评矩、測(cè)試語(yǔ)料外還包含相似拼音字表和相近字形字表叶堆。
雖然語(yǔ)料質(zhì)量較高,但還是有些缺點(diǎn)的:
1. 首先自然是語(yǔ)料的規(guī)模不足斥杜,將三份語(yǔ)料匯總之后也不過(guò)得到3M左右的語(yǔ)料
2. 其次是文本問(wèn)題虱颗,可以看出語(yǔ)料使用的是繁體字,在建立面向簡(jiǎn)體字的模型的過(guò)程中果录,我們需要將其轉(zhuǎn)換為簡(jiǎn)體字
3. 第三是文化問(wèn)題上枕,文字雖然可以轉(zhuǎn)換為簡(jiǎn)體字,但文本的組織結(jié)構(gòu)弱恒、表述以及用詞還是附帶較濃的臺(tái)灣氣息辨萍,如“幼兒園”在文本中稱為“幼稚園”,“什么”在文本中為“什幺”
在瀏覽完各類論文和語(yǔ)料庫(kù)之后返弹,就可以開(kāi)始發(fā)散思維了锈玉。原本打算爬取小學(xué)生病句作為語(yǔ)料,然而點(diǎn)開(kāi)幾份病句題之后卻發(fā)現(xiàn)义起,小學(xué)生的病句里就已經(jīng)涉及到知識(shí)推理拉背、指代不明等高難度問(wèn)題了,由此不得讓人感慨默终,我們還有很長(zhǎng)的路要走椅棺。
可以直接用于訓(xùn)練的語(yǔ)料并不多,接下來(lái)該考慮語(yǔ)料制造了
語(yǔ)料制造
語(yǔ)料制造分為人工制作新語(yǔ)料和在現(xiàn)有語(yǔ)料上進(jìn)行改造齐蔽。
人工制作
人工制作新語(yǔ)料可以是完全人為構(gòu)造新句子两疚,當(dāng)然還有方便得多的方法就是從已有的句子上挑選詞語(yǔ),選擇相近音的字詞進(jìn)行替換含滴。除了項(xiàng)目人員自行替換之外诱渤,也可外包出去花費(fèi)金錢獲取有一定數(shù)目和質(zhì)量的人工語(yǔ)料。
此外谈况,也可以從外國(guó)人學(xué)習(xí)中文的作文著手勺美,已有的語(yǔ)法錯(cuò)誤递胧、詞語(yǔ)錯(cuò)誤語(yǔ)料有相當(dāng)一部分是來(lái)自外國(guó)人的作文加上人工標(biāo)記形成的,如北京語(yǔ)言大學(xué)的HSK動(dòng)態(tài)作文語(yǔ)料庫(kù)赡茸,但筆者并未發(fā)現(xiàn)有能夠獲取完整語(yǔ)料的地方缎脾。僅有官方提供的各種小規(guī)模查詢方式。
改造語(yǔ)料
在網(wǎng)上各類公開(kāi)語(yǔ)料庫(kù)上得到大量中文通用語(yǔ)料并進(jìn)行預(yù)處理之后坛掠,最簡(jiǎn)單的方法就是對(duì)于每個(gè)句子以一定的概率隨機(jī)替換掉某個(gè)字或詞(取決于模型是基于字還是基于詞的赊锚,但一般來(lái)說(shuō)基于字效果更好、字典更小屉栓、速度更快)舷蒲,替換的字或詞的數(shù)目可以自行調(diào)整, 不同的概率對(duì)應(yīng)不同的替換數(shù)目友多。優(yōu)點(diǎn)是足夠自動(dòng)化牲平、方便快速、語(yǔ)料數(shù)目大域滥,缺點(diǎn)則是語(yǔ)料和將要糾錯(cuò)的句子的貼合度并不高纵柿。
在前面的方法之上為了更貼近待糾錯(cuò)句子,可以構(gòu)造相近音的字表或詞表启绰,替換時(shí)查表隨機(jī)替換昂儒。
以上就是語(yǔ)料獲取方面的總結(jié)。在獲取到Chinese Spelling Check Task的語(yǔ)料之后委可,還需要對(duì)其進(jìn)行處理渊跋。
CSC語(yǔ)料處理
繁體轉(zhuǎn)簡(jiǎn)體工具介紹及安裝
為了建立面向簡(jiǎn)體中文的糾錯(cuò)模型,我們首先得將繁體語(yǔ)料轉(zhuǎn)換成簡(jiǎn)體着倾。在搜索python轉(zhuǎn)換的工具包時(shí)拾酝,網(wǎng)上博客一水的推薦https://github.com/skydark/nstools/tree/master/zhtools的轉(zhuǎn)換工具,然而在實(shí)際使用過(guò)后發(fā)現(xiàn)效果并不是很好卡者,在剔除使用zhtools的文章之后蒿囤,發(fā)現(xiàn)一個(gè)在github有3k stars的工具包opencc:https://github.com/BYVoid/OpenCC
使用python的可以 pip install opencc,但會(huì)報(bào)錯(cuò)并且需要各種設(shè)置崇决。以下介紹一下Ubuntu下編譯安裝的方法材诽,安裝完成后直接可以在命令行中使用opencc而無(wú)需特定語(yǔ)言。
先找個(gè)空白文件夾安裝需要的其它工具:
git clone https://github.com/doxygen/doxygen.git
cd doxygen
mkdir build
cd build
sudo apt-get install flex
sudo apt-get install bison
cmake -G "Unix Makefiles" ..
make
sudo make install
而后就可以開(kāi)始安裝opencc了:
git clone git@github.com:BYVoid/OpenCC.git
cd OpenCC
make
sudo make install
安裝完成后就可以在命令行中以:
opencc -c <配置文件名> -i <輸入文件名> -o <輸出文件名>
的格式進(jìn)行使用了恒傻,-c中支持的配置文件名可以在github上找到脸侥,若不加-o選項(xiàng)則會(huì)直接將轉(zhuǎn)換后的結(jié)果顯示出來(lái)。
進(jìn)一步處理
將所有的Input txt 和Truth txt拷到一個(gè)文件夾后碌冶,使用
cat *Input* > input.txt
cat *Truth* > truth.txt
opencc -c tw2sp.json -i input.txt -o input.txt
opencc -c tw2sp.json -i truth.txt -o truth.txt
就可以得到轉(zhuǎn)換后的文件了。
在進(jìn)行簡(jiǎn)繁轉(zhuǎn)換后涝缝,筆者發(fā)現(xiàn)其內(nèi)部的英文和數(shù)字使用的是全角字符扑庞,然后在網(wǎng)上找段轉(zhuǎn)換代碼將文本轉(zhuǎn)換成半角譬重,之后再將數(shù)字轉(zhuǎn)換成星號(hào)
在檢測(cè)階段,我們還不需要正確的詞語(yǔ)罐氨,只需要錯(cuò)誤詞語(yǔ)的索引即可臀规,在用正則表達(dá)式將truth中的漢字剔除后,就得到處理后的文本了:
文本
答案(只有索引)
答案(帶正確字)
值得注意的是栅隐,測(cè)試語(yǔ)料中錯(cuò)誤字所使用的索引是從1開(kāi)始的塔嬉,并且0代表句子完全正確。
訓(xùn)練語(yǔ)料使用的sgml格式租悄,可以用parser處理也可以直接暴力用正則表達(dá)式替換再用python細(xì)處理谨究。
其它
上面的處理完成之后,已經(jīng)可以投入訓(xùn)練了泣棋,但是也可以進(jìn)一步進(jìn)行處理:
- 長(zhǎng)句切短句胶哲。將長(zhǎng)句子按照逗號(hào)、句號(hào)潭辈、感嘆號(hào)等切分成幾個(gè)短句子鸯屿,因?yàn)橹皇且獧z測(cè)簡(jiǎn)單的詞語(yǔ)錯(cuò)誤,因此不大需要考慮前后短句子的邏輯關(guān)系把敢,將句子切開(kāi)之后語(yǔ)料數(shù)目也同樣增加了寄摆。
- 增加STA、END修赞、UNK標(biāo)簽婶恼,自然語(yǔ)言處理領(lǐng)域中常常使用的方法,對(duì)于要輸入LSTM的句子榔组,開(kāi)頭加上STA標(biāo)簽熙尉,結(jié)尾加上END標(biāo)簽(也可以開(kāi)頭和結(jié)尾使用同一個(gè)標(biāo)簽),加上標(biāo)簽可以讓模型知道是句子開(kāi)頭和結(jié)尾搓扯,由此可以加強(qiáng)判斷第一個(gè)詞和最后一個(gè)詞正確與否的能力检痰。而UNK則是用于標(biāo)記詞表外單詞的標(biāo)簽,若單詞頻率太低則將其替換成UNK锨推,減少詞表大小铅歼。
- 保存字詞和索引轉(zhuǎn)換表,提前切分并替換成索引换可。將字詞和索引的轉(zhuǎn)換以固定文件保存下來(lái)椎椰,而后將語(yǔ)料預(yù)先轉(zhuǎn)換成索引序列,可以省去大規(guī)模語(yǔ)料在內(nèi)存中轉(zhuǎn)換成索引的時(shí)間。要注意STA垦缅、END和UNK標(biāo)簽不要被單獨(dú)切開(kāi)了代咸。
以上就是我在語(yǔ)料方面的探索和總結(jié)瞪醋,希望能對(duì)讀者有些許幫助瓤的。
我的個(gè)人博客:Zedom1.top