本文介紹一種簡潔優雅的多標準中文分詞方案,可聯合多個不一樣標準的語料庫訓練單個模型,同時輸出多標準的分詞結果。經過不一樣語料庫之間的遷移學習提高模型的性能,在10個語料庫上的聯合試驗結果優於絕大部分單獨訓練的模型。模型參數和超參數所有共享,複雜度不隨語料庫種類增加。python
(相關內容已經集成到大快的hanlp中,代碼和語料可訪問github上的hanlp開源項目主頁查詢)git
天然語言處理,特別是中文處理中,語料庫每每珍稀且珍貴。具體到中文分詞,也是如此。爲了作出一個實用的系統,不光須要高效的算法,大規模語料庫也必不可少。然而對於缺少經費的研究團隊和我的,卻每每只能獲得sighan2005等屈指可數的幾個小型語料庫。即使如此,這些語料庫的標註規範還互不兼容,沒法混合起來訓練(咱們試驗驗證了這一點):github
好比PKU的最大特色就是姓名拆分爲「姓」+「名」,MSR的標誌則是命名實體構成大量長單詞,而港臺地區的語言習慣原本就與大陸不一樣。這些差別致使沒法簡單合併各方語料造成一個更大量級的語料庫,只能在某一個語料庫上訓練,浪費了其餘標註數據。算法
已經有工做開始研究如何利用多方語料庫來聯合學習中文分詞,好比 Chen 20171精心設計的對抗神經網絡,針對每一個語料庫提取分詞標準相關或無關的特徵。然而該工做並無達到前沿的準確率,甚至聯合訓練的成績還比不上之前單獨訓練的分數,沒法體現聯合學習的本意與優點。網絡
事實上,這些標註風格迥異的分詞語料像極了機器翻譯中的多國語言:表達相似的意思,卻採用了不一樣的方式。之前的多語種互譯系統也是須要針對每一個語種pair設計一對encoder-decoder:架構
圖片轉自斯坦福大學CS224n講義性能
對nn種語言來說,就須要n×(n−1)n×(n−1)對encoder-decoder。相似地,針對每一個分詞語料庫設計網絡層的話,對nn種分詞標準,就須要nn個私有層。這樣的系統臃腫不堪,過分複雜,也沒法應對Zero-Shot Translation問題(缺少某兩個語言之間的平行語料)。學習
谷歌的解決方案說來簡單,卻不失優雅。聰明之處在於不修改網絡架構,而是在輸入數據上作文章。只需在輸入平行語料pair中人工加入目標語種的標識符,就能夠把全部語種的平行語料混合在一塊兒訓練了:測試
圖片轉自斯坦福大學CS224n講義spa
這的確是長期跟工業生產線打交道的人才能想出來的實用方法。
受谷歌的多語種翻譯系統啓發,咱們發現只需在句子首尾添加一對標識符,便可平滑無縫地將多標準語料庫混合起來訓練。具體作法是用一對閉合的<dataset> </dataset>將每一個句子包裹起來:
接下來就能夠經過你們熟悉的Bi-LSTM-CRF等序列標註模型聯合訓練了。在具體聯合訓練中,將這兩我的工標識符視做普通字符便可,也沒必要人工區分句子的來源。這兩我的工標識符會提示RNN這個句子屬於哪一種分詞標準,使其爲每一個字符生成的contexual representation都受到該分詞標準的影響。
在測試的時候,這兩我的工標識符起到指定所需分詞標準的做用。固然,公平起見標識符並不計入準確率的計算。
代碼
連同語料庫一塊兒開源在GitHub上,可訪問hanlp開源項目查看
調用腳本只需一兩句話,請參考GitHub上的說明。
結果
咱們在標準的sighan2005和sighan2008上作了實驗,在沒有針對性調參的狀況下依然取得了更高的成績(當時設備條件簡陋,因此在全部數據集上都用了同一套超參數)。全部分值都經過了官方評測腳本的驗算。
sighan2005
下圖的baseline是在各個語料庫上單獨訓練的結果,+naive是合併語料卻不加標識符的結果,+multi是咱們提出的聯合訓練方案的結果。
咱們使用的特徵是極小的,僅僅是字符和bigram。若是像最近流行的作法那樣加入12個ngram、詞典特徵(word embedding),可能還會有進一步提高。但咱們的論文中心是一個簡單的多標準分詞方案,主打精簡高效,並不是追求高分賽過效率,因此沒有采用這些特徵工程的手段。
sighan2008
咱們也在標準的sighan2008上作了相同的試驗,結果是:
值得一提的是,咱們並無針對sighan2005和sighan2008分別調參,而是放棄調參、在全部數據集上沿用了PKU的超參數。這是因爲咱們簡陋的設備條件限制;歡迎計算力充裕的朋友自行調參,或許能有更好的結果。
10in1
因爲sighan2008語料庫是收費的,難以獲取,沒有受權的狀況下也沒法二次發佈。同時咱們不但願收費語料庫成爲阻礙小團隊與我的研究者的壁壘,因此咱們在1010個公開的語料庫上作了額外的試驗。
這1010個語料庫分別是來自sighan2005的44份語料庫以及
一、Universal Dependencies Project的UDC (Universal Dependencies Treebank Chinese)
二、由 Stanford CoreNLP 公開的 CTB6 (Chinese Tree Bank 6)
三、由山西大學發佈的 SXU
四、由國家語委公佈的 CNC 語料庫
五、由王威廉老師公開的微博樹庫 WTB (Wang et al. 2014 2)
六、由張梅山老師公開的誅仙語料庫 ZX (Zhang et al. 2014 3)。
語料庫的受權信息以下(若有錯誤,歡迎反饋):
雖然部分語料庫不常見於文獻,但它們所屬領域不一樣(新聞、微博、小說、港臺)、數據規模迥異,剛好能夠用來檢驗多標準分詞模型的泛用性。咱們的測試結果是:
(備註:此處與 Chen 2017 沒法構成直接比較)
因爲RNN訓練很慢,爲了方便復現結果,咱們提供包含隨機數在內的命令行:
1./script/train.sh joint-10in1 --dynet-seed 10364 --python-seed 840868838938890892
除非依賴類庫版本變遷,不然應該可以保證復現咱們的結果。
咱們還考察了這些人工標識符所起的做用,將它們的embedding經過t-SNE可視化出來後,發現幾乎沒有顯著的類似性:
它們彷佛起的做用都不相同。
結論
這是一種簡單的多標註中文分詞解決方案,能夠在不增長模型複雜度的狀況下聯合多個語料庫訓練單個模型。該方案雖然簡單,但的確帶來了顯著的性能提高(特別是對於小數據集如WTB)。同時咱們也注意到特別大的數據集受益很小或沒法從中受益(MSR),留做將來研究。咱們但願該方法成爲多標準中文分詞的一個baseline,或生產系統中的一個物美價廉的拓展。
做者:hankcs 大快搜索高級研究員