Last Updated on 2022-06-03 by Clay
前言
使用 Python 進行自然語言處理(NLP)的任務是在機器學習、深度學習領域相當常見的事情,當然,針對文本的前處理所需具備的工具、函式庫自然也是一應俱全。
今天我想記錄的,就是如何使用 Python 進行字串的全形(full-width character)半形(half-width character)轉換。
在許多原始文本中,可能存在著各種全形半形參雜的文字。而我們都知道,就算人類覺得9和 9 看起來都一樣,然而在電腦中以位元組來呈現的形式裡,這兩個字元是截然不同的。
# coding: utf-8
def main():
data_1 = "9"
data_2 = "9"
print(data_1 == data_2)
if __name__ == "__main__":
main()
Output:
False
全形半形轉換
方法一:unicode 編碼轉換
在 Python 中,我們可以使用 ord()
將字元轉換成 unicode 編碼;以及使用 chr()
將 unicode 編碼轉換回字元。
- 全形字元的 unicode 編碼是從 65281 到 65374
- 半形字元的 unicode 編碼是從 33 到 126
如果要進行轉換,半形只需要把 unicode 編碼加上 65248 即可轉換成全形。反之,全形轉為半形則是減去 65248。
# coding: utf-8
def full2half(c: str) -> str:
return chr(ord(c)-65248)
def half2full(c: str) -> str:
return chr(ord(c)+65248)
def main() -> str:
c = "A"
print(f"original fullwidth: {c}")
print(f"to halfwidth = {full2half(c)}")
print(f"back to fullwidth: {half2full(full2half(c))}")
if __name__ == "__main__":
main()
Output:
original fullwidth: A
to halfwidth = A
back to fullwidth: A
這是比較直接的一種轉換方式。
方法二: 使用 unicodedata 模組
另一個經典的方法是直接使用 Python 內建的 unicodedata 模組;不過 unicodedata 只能把全形轉為半形。
但只要 call 一個模組就能完成,顯然比較方便。另外,效能應該也是比直接做 unicode 編碼轉換來得更好。
# coding: utf-8
import unicodedata
def full2half(c: str) -> str:
return unicodedata.normalize("NFKC", c)
def half2full(c: str) -> str:
return chr(ord(c)+65248)
def main() -> str:
c = "A"
print(f"original fullwidth: {c}")
print(f"to halfwidth = {full2half(c)}")
print(f"back to fullwidth: {half2full(full2half(c))}")
if __name__ == "__main__":
main()
Output:
original fullwidth: A
to halfwidth = A
back to fullwidth: A
References
- https://stackoverflow.com/questions/10959227/how-to-distinguish-whether-a-word-is-half-width-or-full-width
- https://docs.python.org/3/library/unicodedata.html
Read More
- [工具] CP950 轉換 Unicode 編碼的工具推薦: convertz
- [已解決] Python SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-5: truncated \UXXXXXXXX escape