拼音型簡單錯誤語料獲取與處理
在自然語言處理領域中,語料是非常關鍵的一個部分。然而,中文的自然語言處理領域在大的通用型語料上雖然不少,但在特定方向上的語料仍然匱乏。在要進行拼音型文字糾錯任務過程中,我發現這方面的語料著實少,因此在語料的獲取和處理上花費較多時間,以下是我面對語料匱乏情況下的探索和總結。
語料的獲取
語料獲取分為兩個部分,一是搜尋:查詢並獲取已有的特定方向的語料。二是製造:自行製造出需要的語料。
語料搜尋
首先我們自然要考慮能否找到已經標記好的公開語料。
沒有查詢到相應結果之後,開始尋找這方面的公開比賽,最好是去年或前年這類年份較近且比賽已經結束的,一來更可能可以獲取完整語料,二來可以參考比賽結束後放出的優勝者的論文,而年份越近則參賽者更可能用上更先進的方法。
此外還可以參考這方面的論文,論文中會給出評測的方法和樣例文字,根據文中出現的語料來源關鍵詞再進行搜尋。由此我搜索到幾份臺灣的拼音型質量較高的語料,分別是13-15年的Chinese Spelling Check Task的語料:
ofollow,noindex">彙總連結
SIGHAN 2013 Bake-off: Chinese Spelling Check Task
CLP 2014 Bake-off: Chinese Spelling Check Task
SIGHAN 2015 Bake-off: Chinese Spelling Check Task
以下是語料的一個樣例:

image
可以看出,這份語料的錯誤型別是拼音相近的詞語,它不僅標出了錯誤詞語,還給出了正確答案,由此還可以將錯誤檢測模型擴充套件為糾正模型。
填寫資料下載後可以看到,壓縮包中除了訓練、測試語料外還包含相似拼音字表和相近字形字表。
雖然語料質量較高,但還是有些缺點的:
1. 首先自然是語料的規模不足,將三份語料彙總之後也不過得到3M左右的語料
2. 其次是文字問題,可以看出語料使用的是繁體字,在建立面向簡體字的模型的過程中,我們需要將其轉換為簡體字
3. 第三是文化問題,文字雖然可以轉換為簡體字,但文字的組織結構、表述以及用詞還是附帶較濃的臺灣氣息,如“幼兒園”在文字中稱為“幼稚園”,“什麼”在文字中為“什么”
在瀏覽完各類論文和語料庫之後,就可以開始發散思維了。原本打算爬取小學生病句作為語料,然而點開幾份病句題之後卻發現,小學生的病句裡就已經涉及到知識推理、指代不明等高難度問題了,由此不得讓人感慨,我們還有很長的路要走。
可以直接用於訓練的語料並不多,接下來該考慮語料製造了
語料製造
語料製造分為人工製作新語料和在現有語料上進行改造。
人工製作
人工製作新語料可以是完全人為構造新句子,當然還有方便得多的方法就是從已有的句子上挑選詞語,選擇相近音的字詞進行替換。除了專案人員自行替換之外,也可外包出去花費金錢獲取有一定數目和質量的人工語料。
此外,也可以從外國人學習中文的作文著手,已有的語法錯誤、詞語錯誤語料有相當一部分是來自外國人的作文加上人工標記形成的,如 北京語言大學的HSK動態作文語料庫 ,但筆者並未發現有能夠獲取完整語料的地方。僅有官方提供的各種小規模查詢方式。
改造語料
在網上各類公開語料庫上得到大量中文通用語料並進行預處理之後,最簡單的方法就是對於每個句子以一定的概率隨機替換掉某個字或詞(取決於模型是基於字還是基於詞的,但一般來說基於字效果更好、字典更小、速度更快),替換的字或詞的數目可以自行調整, 不同的概率對應不同的替換數目。優點是足夠自動化、方便快速、語料數目大,缺點則是語料和將要糾錯的句子的貼合度並不高。
在前面的方法之上為了更貼近待糾錯句子,可以構造相近音的字表或詞表,替換時查表隨機替換。
以上就是語料獲取方面的總結。在獲取到Chinese Spelling Check Task的語料之後,還需要對其進行處理。
CSC語料處理
繁體轉簡體工具介紹及安裝
為了建立面向簡體中文的糾錯模型,我們首先得將繁體語料轉換成簡體。在搜尋python轉換的工具包時,網上部落格一水的推薦 https://github.com/skydark/nstools/tree/master/zhtools 的轉換工具,然而在實際使用過後發現效果並不是很好,在剔除使用zhtools的文章之後,發現一個在github有3k stars的工具包opencc: https://github.com/BYVoid/OpenCC
使用python的可以 pip install opencc,但會報錯並且需要各種設定。以下介紹一下Ubuntu下編譯安裝的方法,安裝完成後直接可以在命令列中使用opencc而無需特定語言。
先找個空白資料夾安裝需要的其它工具: 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 而後就可以開始安裝opencc了: git clone [email protected]:BYVoid/OpenCC.git cd OpenCC make sudo make install
安裝完成後就可以在命令列中以:
opencc -c <配置檔名> -i <輸入檔名> -o <輸出檔名>
的格式進行使用了,-c中支援的配置檔名可以在github上找到,若不加-o選項則會直接將轉換後的結果顯示出來。
進一步處理
將所有的Input txt 和Truth txt拷到一個資料夾後,使用
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
就可以得到轉換後的檔案了。
在進行簡繁轉換後,筆者發現其內部的英文和數字使用的是全形字元,然後在網上找段轉換程式碼將文字轉換成半形,之後再將數字轉換成星號
在檢測階段,我們還不需要正確的詞語,只需要錯誤詞語的索引即可,在用正則表示式將truth中的漢字剔除後,就得到處理後的文字了:
文字

image
答案(只有索引)

image
答案(帶正確字)

image
值得注意的是,測試語料中錯誤字所使用的索引是從1開始的,並且0代表句子完全正確。
訓練語料使用的sgml格式,可以用parser處理也可以直接暴力用正則表示式替換再用python細處理。
其它
上面的處理完成之後,已經可以投入訓練了,但是也可以進一步進行處理:
- 長句切短句。將長句子按照逗號、句號、感嘆號等切分成幾個短句子,因為只是要檢測簡單的詞語錯誤,因此不大需要考慮前後短句子的邏輯關係,將句子切開之後語料數目也同樣增加了。
- 增加STA、END、UNK標籤,自然語言處理領域中常常使用的方法,對於要輸入LSTM的句子,開頭加上STA標籤,結尾加上END標籤(也可以開頭和結尾使用同一個標籤),加上標籤可以讓模型知道是句子開頭和結尾,由此可以加強判斷第一個詞和最後一個詞正確與否的能力。而UNK則是用於標記詞表外單詞的標籤,若單詞頻率太低則將其替換成UNK,減少詞表大小。
- 儲存字詞和索引轉換表,提前切分並替換成索引。將字詞和索引的轉換以固定檔案儲存下來,而後將語料預先轉換成索引序列,可以省去大規模語料在記憶體中轉換成索引的時間。要注意STA、END和UNK標籤不要被單獨切開了。
以上就是我在語料方面的探索和總結,希望能對讀者有些許幫助。
我的個人部落格: Zedom1.top