HanLP極致簡繁轉換詳細講解算法
做者: hankcs(大快高級研究員 hanlp項目負責人)緩存
談起簡繁轉換,許多人覺得是小意思,按字轉換就好了。事實上,漢語歷史悠久,地域複雜,發展至今在字符級別存在「一簡對多繁」和「一繁對多簡」,在詞語級別上存在「簡繁分歧詞」,在港澳臺等地則存在「字詞習慣不一樣」的狀況。爲此,HanLP新增了「簡體」「繁體」「臺灣正體」「香港繁體」間的相互轉換功能,力圖將簡繁轉換作到極致。spa
關於這些漢語語言上的詳情,請參考郭家寶的OpenCC項目。HanLP整合了該項目的詞庫,用原生的AhoCorasickDoubleArrayTrie算法實現了各語言分支的轉換。對於簡繁轉換模塊來講,算法都是相似的,最寶貴的地方在於詞庫,在此向OpenCC表示敬意和感謝!3d
快速上手blog
一個Demo接口
輸出程序
說明im
注意在舊版HanLP中,簡體「草莓」被轉換爲「士多啤梨」。後來有用戶告訴我「士多啤梨」是香港的用法,不屬於通俗意義上的「繁體」,因此在新版中去除了這一轉換。而「臺灣」「程式碼」是臺灣地區的用法,「臺灣」「代碼」則是香港地區的用法,因此d3
一、System.out.println(HanLP.t2tw("hankcs在臺灣寫代碼"));命名
二、System.out.println(HanLP.t2hk("hankcs在臺灣寫代碼"));
分別輸出了
一、hankcs在臺灣寫程式碼
二、hankcs在臺灣寫代碼
這裏面存在微妙的不一樣。
基本定義
簡體
HanLP中的簡體特指大陸地區的簡體字。
繁體
HanLP中的繁體是通俗意義上的繁體中文,即受衆最廣的繁體表示。若是說OpenCC定義了本身的「OpenCC繁體標準」的話,那麼這也能夠算得上「HanLP繁體標準」。
香港繁體
指的是香港地區使用的繁體中文,據OpenCC的wiki介紹,屬於「香港小學學習字詞表標準」。
臺灣正體
指的是臺灣地區使用的繁體中文,即「臺灣正體標準」。
接口一覽
HanLP支持上述四種中文任意兩種之間的轉換:
共計12種接口。命名規範按照X2Y的形式,X表示源語種,Y表示目標語種。
詞庫
因爲我並無OpenCC做者那樣深厚的繁體中文語言知識,因此這些接口未必能完美地知足廣大繁體中文用戶的需求,但願你們多多包涵,提出寶貴意見。
全部的詞庫都是以文本方式維護,命名規則與接口保持一致。不過,詞典的文本形式只有以下四種:
s2t.txt t2hk.txt t2s.txt t2tw.txt
相似tw2hk的詞典並不存在,tw2hk只存在自動推導出的bin文件,其推導規則爲
一、逆轉t2tw獲得tw2t
二、利用t2hk獲得tw2hk
推導由HanLP程序控制,用戶修改推導過程當中用到的四個詞典後須要刪除推導結果的緩存文件才能生效。其餘8種接口的推導過程相似於此,再也不贅述。