天天看點

HanLP極緻簡繁轉換

談起簡繁轉換,許多人以為是小意思,按字轉換就行了。事實上,漢語曆史悠久,地域複雜,發展至今在字元級别存在“一簡對多繁”和“一繁對多簡”,在詞語級别上存在“簡繁分歧詞”,在港澳台等地則存在“字詞習慣不同”的情況。為此,HanLP新增了“簡體”“繁體”“臺灣正體”“香港繁體”間的互相轉換功能,力圖将簡繁轉換做到極緻。

HanLP極緻簡繁轉換

關于這些漢語語言上的詳情,請參考郭家寶的OpenCC項目。HanLP整合了該項目的詞庫,用原生的AhoCorasickDoubleArrayTrie算法實作了各語言分支的轉換。對于簡繁轉換子產品來說,算法都是類似的,最寶貴的地方在于詞庫,在此向OpenCC表示敬意和感謝!

快速上手

一個Demo

System.out.println(HanLP.convertToTraditionalChinese("“以後等你當上皇後,就能買草莓慶祝了”。發現一根白頭發"));

System.out.println(HanLP.convertToSimplifiedChinese("憑藉筆記簿型電腦寫程式HanLP"));

// 簡體轉台灣繁體

System.out.println(HanLP.s2tw("hankcs在台灣寫代碼"));

// 台灣繁體轉簡體

System.out.println(HanLP.tw2s("hankcs在臺灣寫程式碼"));

// 簡體轉香港繁體

System.out.println(HanLP.s2hk("hankcs在香港寫代碼"));

// 香港繁體轉簡體

System.out.println(HanLP.hk2s("hankcs在香港寫代碼"));

// 香港繁體轉台灣繁體

System.out.println(HanLP.hk2tw("hankcs在臺灣寫代碼"));

// 台灣繁體轉香港繁體

System.out.println(HanLP.tw2hk("hankcs在香港寫程式碼"));

// 香港/台灣繁體和HanLP标準繁體的互轉

System.out.println(HanLP.t2tw("hankcs在臺灣寫代碼"));

System.out.println(HanLP.t2hk("hankcs在臺灣寫代碼"));

System.out.println(HanLP.tw2t("hankcs在臺灣寫程式碼"));

System.out.println(HanLP.hk2t("hankcs在台灣寫代碼"));

輸出

「以後等你當上皇後,就能買草莓慶祝了」。發現一根白頭髮

憑借筆記本電腦寫程式HanLP

hankcs在臺灣寫程式碼

hankcs在台灣寫代碼

hankcs在香港寫代碼

hankcs在香港寫代碼

hankcs在台灣寫代碼

hankcs在臺灣寫代碼

說明

注意在舊版HanLP中,簡體“草莓”被轉換為“士多啤梨”。後來有使用者告訴我“士多啤梨”是香港的用法,不屬于通俗意義上的“繁體”,是以在新版中去除了這一轉換。而“臺灣”“程式碼”是台灣地區的用法,“台灣”“代碼”則是香港地區的用法,是以

分别輸出了:

這裡面存在微妙的不同。

基本定義

簡體

HanLP中的簡體特指大陸地區的簡體字。

繁體

HanLP中的繁體是通俗意義上的繁體中文,即閱聽人最廣的繁體表示。如果說OpenCC定義了自己的“OpenCC繁體标準”的話,那麼這也可以算得上“HanLP繁體标準”。

香港繁體

指的是香港地區使用的繁體中文,據OpenCC的wiki介紹,屬于“香港小學學習字詞表標準”。

臺灣正體

指的是台灣地區使用的繁體中文,即“臺灣正體標準”。

接口一覽

HanLP支援上述四種中文任意兩種之間的轉換:

/**

  • 簡轉繁,是{@link com.hankcs.hanlp.HanLP#convertToTraditionalChinese(java.lang.String)}的簡稱
  • @param s 簡體中文
  • @return 繁體中文(大陸标準)

    */

public static String s2t(String s)

{

return HanLP.convertToTraditionalChinese(s);           

}

  • 繁轉簡,是{@link HanLP#convertToSimplifiedChinese(String)}的簡稱
  • @param t 繁體中文(大陸标準)
  • @return 簡體中文

public static String t2s(String t)

return HanLP.convertToSimplifiedChinese(t);           
  • 台灣到臺灣正體
  • @param s 台灣
  • @return 臺灣正體

public static String s2tw(String s)

return SimplifiedToTaiwanChineseDictionary.convertToTraditionalTaiwanChinese(s);           
  • 臺灣正體到台灣
  • @param tw 臺灣正體
  • @return 台灣

public static String tw2s(String tw)

return TaiwanToSimplifiedChineseDictionary.convertToSimplifiedChinese(tw);           
  • 台灣到香港繁體
  • @return 香港繁體

public static String s2hk(String s)

return SimplifiedToHongKongChineseDictionary.convertToTraditionalHongKongChinese(s);           
  • 香港繁體到台灣
  • @param hk 香港繁體

public static String hk2s(String hk)

return HongKongToSimplifiedChineseDictionary.convertToSimplifiedChinese(hk);           
  • 繁體到臺灣正體
  • @param t 繁體

public static String t2tw(String t)

return TraditionalToTaiwanChineseDictionary.convertToTaiwanChinese(t);           
  • 臺灣正體到繁體
  • @return 繁體

public static String tw2t(String tw)

return TaiwanToTraditionalChineseDictionary.convertToTraditionalChinese(tw);           
  • 繁體到香港繁體

public static String t2hk(String t)

return TraditionalToHongKongChineseDictionary.convertToHongKongTraditionalChinese(t);           
  • 香港繁體到繁體

public static String hk2t(String hk)

return HongKongToTraditionalChineseDictionary.convertToTraditionalChinese(hk);           
  • 香港繁體到臺灣正體

public static String hk2tw(String hk)

return HongKongToTaiwanChineseDictionary.convertToTraditionalTaiwanChinese(hk);           
  • 臺灣正體到香港繁體

public static String tw2hk(String tw)

return TaiwanToHongKongChineseDictionary.convertToTraditionalHongKongChinese(tw);           

共計12種接口。命名規範按照X2Y的形式,X表示源語種,Y表示目智語種。

詞庫

由于我并沒有OpenCC作者那樣深厚的繁體中文語言知識,是以這些接口未必能完美地滿足廣大繁體中文使用者的需求,希望大家多多包涵,提出寶貴意見。

所有的詞庫都是以文本方式維護,命名規則與接口保持一緻。不過,詞典的文本形式隻有如下四種:

s2t.txt t2hk.txt t2s.txt t2tw.txt

類似tw2hk的詞典并不存在,tw2hk隻存在自動推導出的bin檔案,其推導規則為

逆轉t2tw得到tw2t

利用t2hk得到tw2hk

推導由HanLP程式控制,使用者修改推導過程中用到的四個詞典後需要删除推導結果的緩存檔案才能生效。其他8種接口的推導過程類似于此,不再贅述。

文章來源于網絡

繼續閱讀