簡單有效的多標準中文分詞詳解
簡單有效的多標準中文分詞詳解
本文介紹一種簡潔優雅的多標準中文分詞方案,可聯合多個不同標準的語料庫訓練單個模型,同時輸出多標準的分詞結果。透過不同語料庫之間的遷移學習提升模型的效能,在 10個語料庫上的聯合試驗結果優於絕大部分單獨訓練的模型。模型引數和超引數全部共享,複雜度不隨語料庫種類增長。
(相關內容已經整合到大快的 hanlp中,程式碼和語料可訪問github上的hanlp開源專案主頁查詢)
自然語言處理,特別是中文處理中,語料庫往往珍稀且珍貴。具體到中文分詞,也是如此。為了做出一個實用的系統,不光需要高效的演算法,大規模語料庫也必不可少。然而對於缺乏經費的研究團隊和個人,卻往往只能得到 sighan2005 等屈指可數的幾個小型語料庫。即便如此,這些語料庫的標註規範還互不相容,無法混合起來訓練(我們試驗驗證了這一點):
比如 PKU的最大特點就是姓名拆分為“姓”+“名”,MSR的標誌則是命名實體構成大量長單詞,而港臺地區的語言習慣本來就與大陸不同。這些差異導致無法簡單合併各方語料形成一個更大量級的語料庫,只能在某一個語料庫上訓練,浪費了其他標註資料。
已經有工作開始研究如何利用多方語料庫來聯合學習中文分詞,比如 Chen 20171精心設計的對抗神經網路,針對每個語料庫提取分詞標準相關或無關的特徵。然而該工作並沒有達到前沿的準確率,甚至聯合訓練的成績還比不上以前單獨訓練的分數,無法體現聯合學習的本意與優勢。
事實上,這些標註風格迥異的分詞語料像極了機器翻譯中的多國語言:表達類似的意思,卻採用了不同的方式。以前的多語種互譯系統也是需要針對每個語種 pair設計一對encoder-decoder:
圖片轉自史丹佛大學 CS224n講義
這的確是長期跟工業生產線打交道的人才能想出來的實用方法。
受谷歌的多語種翻譯系統啟發,我們發現只需在句子首尾新增一對識別符號,即可平滑無縫地將多標準語料庫混合起來訓練。具體做法是用一對閉合的 <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份語料庫以及
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)。
語料庫的授權資訊如下(如有錯誤,歡迎反饋):
雖然部分語料庫不常見於文獻,但它們所屬領域不同(新聞、微博、小說、港臺)、資料規模迥異,恰好可以用來檢驗多標準分詞模型的泛用性。我們的測試結果是:
(備註:此處與 Chen 2017 無法構成直接比較)
由於 RNN訓練很慢,為了方便復現結果,我們提供包含隨機數在內的命令列:
1 . /script/train.sh joint-10in1 --dynet-seed 10364 --python-seed 840868838938890892
除非依賴類庫版本變遷,否則應該能夠保證復現我們的結果。
我們還考察了這些人工識別符號所起的作用,將它們的 embedding透過t-SNE視覺化出來後,發現幾乎沒有顯著的相似性:
它們似乎起的作用都不相同。
結論
這是一種簡單的多標註中文分詞解決方案,可以在不增加模型複雜度的情況下聯合多個語料庫訓練單個模型。該方案雖然簡單,但的確帶來了顯著的效能提升(特別是對於小資料集如 WTB)。同時我們也注意到特別大的資料集受益很小或無法從中受益(MSR),留作未來研究。我們希望該方法成為多標準中文分詞的一個baseline,或生產系統中的一個物美價廉的擴充。
作者: hankcs 大快搜尋高階研究員
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2286776/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pyhanlp 中文詞性標註與分詞簡介HanLP詞性標註分詞
- Hanlp分詞之CRF中文詞法分析詳解HanLP分詞CRF詞法分析
- 中文分詞工具之基於字標註法的分詞中文分詞
- 用Python寫一個簡單的中文分詞器Python中文分詞
- SCWS PHP 中文簡易分詞PHP分詞
- ElasticSearch(四) ElasticSearch中文分詞外掛IK的簡單測試Elasticsearch中文分詞
- 中文詞法分析的簡單程式 (轉)詞法分析
- hanlp原始碼解析之中文分詞演算法詳解HanLP原始碼中文分詞演算法
- MapReduce實現與自定義詞典檔案基於hanLP的中文分詞詳解HanLP中文分詞
- Lucene中文分析器的中文分詞準確性和效能比較中文分詞
- HanLP-實詞分詞器詳解HanLP分詞
- 北大開源了中文分詞工具包:準確率遠超THULAC、結巴分詞!中文分詞
- 北大開源全新中文分詞工具包:準確率遠超THULAC、結巴分詞中文分詞
- #Elasticsearch中文分詞器 #IK分詞器 @FDDLCElasticsearch中文分詞
- 中文分詞原理及常用Python中文分詞庫介紹中文分詞Python
- iOS中文近似度的演算法及中文分詞(結巴分詞)的整合iOS演算法中文分詞
- IKAnalyzer 中文分詞的不同版本切詞方式中文分詞
- 中文分詞技術中文分詞
- 標準庫 http 包的簡單實用HTTP
- 分詞工具Hanlp基於感知機的中文分詞框架HanLP中文分詞框架
- NLP——史丹佛分詞工具簡單使用分詞
- R語言︱文字挖掘之中文分詞包——Rwordseg包(原理、功能、詳解)R語言中文分詞
- Python分詞模組推薦:jieba中文分詞PythonJieba中文分詞
- PostgreSQL中英文混合分詞特殊規則(中文單字、英文單詞)-中英分明SQL分詞
- 簡單介紹標準庫fmt的基本使用
- 標準庫~JSON物件詳解JSON物件
- HanLP分詞命名實體提取詳解HanLP分詞
- 學習筆記CB002:詞幹提取、詞性標註、中文切詞、文件分類筆記詞性標註
- jieba 詞性標註 & 並行分詞Jieba詞性標註並行分詞
- Go標準庫:Go template用法詳解Go
- 高亮:單關鍵詞、多關鍵詞、多組多關鍵詞,從簡單到複雜實現滿足多方面需求的頁面關鍵詞高亮
- HanLP中文分詞Lucene外掛HanLP中文分詞
- python 中文分詞包 jiebaPython中文分詞Jieba
- ElasticSearch5.6.1 + 中文分詞(IK)ElasticsearchH5中文分詞
- 分享IKAnalyzer 3.0 中文分詞器中文分詞
- 中文分詞器,整理自Ai中文分詞AI
- NLPIR語義分析系統不斷提高中文分詞準確率中文分詞
- 評分卡模型的評分標準模型