1. 程式人生 > >自然語言處理中的unicode編碼轉換問題

自然語言處理中的unicode編碼轉換問題

半形(half-width/Hankaku) 與 全形(full-with/Zenkaku)

同一字元的兩種unicode編碼。主要是因為排版的需要,便於排版,美觀等因素。

可以將某一個字元的兩種unicode編碼分為稱為主要unicode編碼和次要unicode編碼。

比如說:

英文的大小寫字母、數字、標點的主要unicode編碼位於0x01-0x7F。由於這些字元都是半形的(half-width),所以其對應的全形的(full-width)形式的unicode編碼就是次要unicode編碼,位於0xFF00-OxFFEF

CJK的標點符號,日語的假名的主要unicode編碼都是全形的(full-width),所以其對應的半形(half-width)形式就是次要unicode編碼,也位於0xFF00-OxFFEF

在自然語言處理中,為機器處理方便,可以將所有字元都轉換到主要unicode編碼,也就是不使用0xFF00-OxFFEF區間的編碼。

具體的將英文的大小寫字母、數字、標點轉換到ascii碼錶區間;CJK都轉換到全形(full-width)形式。

注意CJK中有些標點符號跟英文的標點形式是相同,要將這些符號轉換到ascii碼錶區間。

Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS : 4E00-9FBF:CJK 統一表意符號 
Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS :F900-FAFF:CJK 相容象形文字 Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A :3400-4DBF:CJK 統一表意符號擴充套件 A 
CJK的意思是“Chinese,Japanese,Korea”的簡寫 ,實際上就是指中日韓三國的象形文字的Unicode編碼 
Character.UnicodeBlock.GENERAL_PUNCTUATION :2000-206F:常用標點 Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION :3000-303F:CJK 符號和標點 Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS :FF00-FFEF:半形及全形形式 

判斷字元中是否包含中文字元時,可以用 
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);  
   if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS 
     || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS 
     || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A 
     || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION 
     || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION 
     || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){ 
    return true; 
   } 
   return false;