簡單有效的多標準中文分詞詳解

簡單有效的多標準中文分詞詳解

本文介紹一種簡潔優雅的多標準中文分詞方案,可聯合多個不同標準的語料庫訓練單個模型,同時輸出多標準的分詞結果。通過不同語料庫之間的遷移學習提升模型的性能,在10個語料庫上的聯合試驗結果優於絕大部分單獨訓練的模型。模型參數和超參數全部共享,複雜度不隨語料庫種類增長。

(相關內容已經集成到大快的hanlp中,代碼和語料可訪問github上的hanlp開源項目主頁查詢)

自然語言處理,特別是中文處理中,語料庫往往珍稀且珍貴。具體到中文分詞,也是如此。爲了做出一個實用的系統,不光需要高效的算法,大規模語料庫也必不可少。然而對於缺乏經費的研究團隊和個人,卻往往只能得到sighan2005等屈指可數的幾個小型語料庫。即便如此,這些語料庫的標註規範還互不兼容,無法混合起來訓練(我們試驗驗證了這一點):

圖1.jpg 

 

比如PKU的最大特點就是姓名拆分爲“姓”+“名”,MSR的標誌則是命名實體構成大量長單詞,而港臺地區的語言習慣本來就與大陸不同。這些差異導致無法簡單合併各方語料形成一個更大量級的語料庫,只能在某一個語料庫上訓練,浪費了其他標註數據。

已經有工作開始研究如何利用多方語料庫來聯合學習中文分詞,比如 Chen 20171精心設計的對抗神經網絡,針對每個語料庫提取分詞標準相關或無關的特徵。然而該工作並沒有達到前沿的準確率,甚至聯合訓練的成績還比不上以前單獨訓練的分數,無法體現聯合學習的本意與優勢。

事實上,這些標註風格迥異的分詞語料像極了機器翻譯中的多國語言:表達類似的意思,卻採用了不同的方式。以前的多語種互譯系統也是需要針對每個語種pair設計一對encoder-decoder:

 

圖2.jpg 

圖片轉自斯坦福大學CS224n講義

 

nn種語言來講,就需要n×(n−1)n×(n−1)對encoder-decoder。類似地,針對每個分詞語料庫設計網絡層的話,對nn種分詞標準,就需要nn個私有層。這樣的系統臃腫不堪,過度複雜,也無法應對Zero-Shot Translation問題(缺乏某兩個語言之間的平行語料)。

谷歌的解決方案說來簡單,卻不失優雅。聰明之處在於不修改網絡架構,而是在輸入數據上做文章。只需在輸入平行語料pair中人工加入目標語種的標識符,就可以把所有語種的平行語料混合在一起訓練了:

圖3.jpg 

圖片轉自斯坦福大學CS224n講義

 

這的確是長期跟工業生產線打交道的人才能想出來的實用方法。

受谷歌的多語種翻譯系統啓發,我們發現只需在句子首尾添加一對標識符,即可平滑無縫地將多標準語料庫混合起來訓練。具體做法是用一對閉合的<dataset> </dataset>將每個句子包裹起來:

圖4.jpg 

 

接下來就可以通過大家熟悉的Bi-LSTM-CRF等序列標註模型聯合訓練了。在具體聯合訓練中,將這兩個人工標識符視作普通字符即可,也不必人工區分句子的來源。這兩個人工標識符會提示RNN這個句子屬於哪種分詞標準,使其爲每個字符生成的contexual representation都受到該分詞標準的影響。

在測試的時候,這兩個人工標識符起到指定所需分詞標準的作用。當然,公平起見標識符並不計入準確率的計算。

 

代碼

連同語料庫一起開源在GitHub上,可訪問hanlp開源項目查看

調用腳本只需一兩句話,請參考GitHub上的說明。

結果

我們在標準的sighan2005和sighan2008上做了實驗,在沒有針對性調參的情況下依然取得了更高的成績(當時設備條件簡陋,所以在所有數據集上都用了同一套超參數)。所有分值都通過了官方評測腳本的驗算。

sighan2005

下圖的baseline是在各個語料庫上單獨訓練的結果,+naive是合併語料卻不加標識符的結果,+multi是我們提出的聯合訓練方案的結果。

圖5.jpg 

我們使用的特徵是極小的,僅僅是字符和bigram。如果像最近流行的做法那樣加入12個ngram、詞典特徵(word embedding),可能還會有進一步提升。但我們的論文中心是一個簡單的多標準分詞方案,主打精簡高效,並非追求高分勝過效率,所以沒有采用這些特徵工程的手段。

sighan2008

我們也在標準的sighan2008上做了相同的試驗,結果是:

圖6.jpg 

 

值得一提的是,我們並沒有針對sighan2005和sighan2008分別調參,而是放棄調參、在所有數據集上沿用了PKU的超參數。這是由於我們簡陋的設備條件限制;歡迎計算力充裕的朋友自行調參,或許能有更好的結果。

10in1

由於sighan2008語料庫是收費的,難以獲取,沒有授權的情況下也無法二次發佈。同時我們不希望收費語料庫成爲阻礙小團隊與個人研究者的壁壘,所以我們在1010個公開的語料庫上做了額外的試驗。

 

1010個語料庫分別是來自sighan2005的44份語料庫以及

1、Universal Dependencies Project的UDC (Universal Dependencies Treebank Chinese)

2、 Stanford CoreNLP 公開的 CTB6 (Chinese Tree Bank 6)

3、由山西大學發佈的 SXU

4、由國家語委公佈的 CNC 語料庫

5、由王威廉老師公開的微博樹庫 WTB (Wang et al. 2014 2)

6、由張梅山老師公開的誅仙語料庫 ZX (Zhang et al. 2014 3)。

 

語料庫的授權信息如下(如有錯誤,歡迎反饋):

圖7.jpg 

 

雖然部分語料庫不常見於文獻,但它們所屬領域不同(新聞、微博、小說、港臺)、數據規模迥異,恰好可以用來檢驗多標準分詞模型的泛用性。我們的測試結果是:

圖8.jpg 

(備註:此處與 Chen 2017 無法構成直接比較)

由於RNN訓練很慢,爲了方便復現結果,我們提供包含隨機數在內的命令行:

 

1./script/train.sh joint-10in1 --dynet-seed 10364 --python-seed 840868838938890892

 

除非依賴類庫版本變遷,否則應該能夠保證復現我們的結果。

我們還考察了這些人工標識符所起的作用,將它們的embedding通過t-SNE可視化出來後,發現幾乎沒有顯著的相似性:

圖9.jpg 

它們似乎起的作用都不相同。

 

結論

這是一種簡單的多標註中文分詞解決方案,可以在不增加模型複雜度的情況下聯合多個語料庫訓練單個模型。該方案雖然簡單,但的確帶來了顯著的性能提升(特別是對於小數據集如WTB)。同時我們也注意到特別大的數據集受益很小或無法從中受益(MSR),留作未來研究。我們希望該方法成爲多標準中文分詞的一個baseline,或生產系統中的一個物美價廉的拓展。

 

作者:hankcs 大快搜索高級研究員


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章