2021年12月3日 星期五

Python 學習筆記 : 中文繁簡轉換套件 HanziConv

今天在 "Python 技術者實踐! (旗標, 2018)" 這本書的第 15 章讀到 HanziConv 這個中文簡繁體套件, 在中文語意分析與自然語言處理時很好用, 於是便馬上進行測試. HanziConv 為第三方套件, 需先用 pip 或 pip3 install 指令安裝後才能使用 :

pip install hanziconv    

C:\Users\User>pip install hanziconv    
Collecting hanziconv
  Downloading hanziconv-0.3.2.tar.gz (276 kB)
     Preparing metadata (setup.py) ... done
Building wheels for collected packages: hanziconv
  Building wheel for hanziconv (setup.py) ... done
  Created wheel for hanziconv: filename=hanziconv-0.3.2-py2.py3-none-any.whl size=23214 sha256=2e97cb6420e5c4f9c2096e34c338174d9ea8560905594bc74df25ea54cfe9500
  Stored in directory: c:\users\user\appdata\local\pip\cache\wheels\bf\e3\22\7bf50146a3ee95d1fdcbfabc44a1fe15b6e2ab7348ab7337bf
Successfully built hanziconv
Installing collected packages: hanziconv
Successfully installed hanziconv-0.3.2

安裝完成即可匯入 hanziconv , 然後用 dir() 函式來觀察此套件之內容 : 

>>> import hanziconv    
>>> dir(hanziconv)   
['HanziConv', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'absolute_import', 'charmap', 'hanziconv', 'unicode_literals']

可以利用求值函式 eval() 取得成員的參考, 再用迴圈來檢視成員之資料類型 : 

>>> members=dir(hanziconv)     
>>> for mbr in members:                   # 走訪 hanziconv 模組成員
    obj=eval('hanziconv.' + mbr)         # 用 eval() 求值取得 hanziconv.成員之參考
    if not mbr.startswith('_'):               # 走訪所有不是 "_" 開頭的成員
        print(mbr, type(obj))                  # 輸出成員之類型
        
HanziConv <class 'type'>
absolute_import <class '__future__._Feature'>
charmap <class 'module'>
hanziconv <class 'module'>
unicode_literals <class '__future__._Feature'>

其中 HanziConv 就是這個套件定義的類別, 用 dir() 檢視其成員 : 

>>> dir(hanziconv.HanziConv)     
['_HanziConv__convert', '_HanziConv__simplified_charmap', '_HanziConv__traditional_charmap', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'same', 'toSimplified', 'toTraditional']

其中 toSimplified() 與 toTraditional() 就是用來做繁簡轉換的方法. 所以實際應用時不會用 import hanziconv 套件, 而是從套件 hanziconv 中指定匯入 HanziConv() 類別, 然後直接呼叫 toSimplified() 與 toTraditional() 這兩個方法 :

from hanziconv import HanziConv

>>> from hanziconv import HanziConv     
>>> dir(HanziConv)     
['_HanziConv__convert', '_HanziConv__simplified_charmap', '_HanziConv__traditional_charmap', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'same', 'toSimplified', 'toTraditional']

顧名思義, toSimplified() 是傳入繁體字串傳回簡體字串, 而 toTranditional() 則是傳入簡體字串傳回繁體字串, 可用 help() 查看其使用說明 : 

>>> help(HanziConv.toSimplified)      
Help on method toSimplified in module hanziconv.hanziconv:

toSimplified(text) method of builtins.type instance
    Convert `text` to simplified character string.  Assuming text is
    traditional character string
    
    :param text:  text to convert
    :returns:     converted UTF-8 characters
    
    >>> from hanziconv import HanziConv
    >>> print(HanziConv.toSimplified('繁簡轉換器'))
    繁简转换器

>>> help(HanziConv.toTraditional)   
Help on method toTraditional in module hanziconv.hanziconv:

toTraditional(text) method of builtins.type instance
    Convert `text` to traditional character string.  Assuming text is
    simplified character string
    
    :param text:  text to convert
    :returns:     converted UTF-8 characters
    
    >>> from hanziconv import HanziConv
    >>> print(HanziConv.toTraditional('繁简转换器'))
    繁簡轉換器

簡轉繁例如 : 

>>> HanziConv.toTraditional('游戏')    
'遊戲'
>>> HanziConv.toTraditional('软件')     
'軟件'
>>> HanziConv.toTraditional('内存')    
'內存'
>>> HanziConv.toTraditional('鼠标')   
'鼠標'
>>> HanziConv.toTraditional('打印机')    
'打印機'
>>> HanziConv.toTraditional('硬盘')    
'硬盤'

可見此套件只是逐字將簡體字轉成繁體字, 並沒有詞彙轉換功能 (例如將 '内存' 轉成 '記憶體', '打印机' 變 '印表機' 等).

繁轉簡例如 :

>>> HanziConv.toSimplified('中華民國萬歲')     
'中华民国万岁'
>>> HanziConv.toSimplified('蔣總統萬歲')   
'蒋总统万岁'
>>> HanziConv.toSimplified('智商高達 157 的阿北')     
'智商高达 157 的阿北'
>>> HanziConv.toSimplified('硬盤')    
'硬盘'
>>> HanziConv.toSimplified('硬碟')    
'硬碟'
>>> HanziConv.toSimplified('雷射')    
'雷射'

可見繁簡轉也是逐字轉換, 雷射不會得到激光. 關於兩岸用語差異參考 :


沒有留言 :