參考:https://blog.csdn.net/weixin_42401159/article/details/112187778
https://cloud.tencent.com/developer/article/1406445
在處理一些自然語言文字的程序中,會遇到一些表面很奇怪的現象, 比如兩個單詞 人肉眼看著一模一樣,但是在計算機中讀取出來卻表示兩者不相等,當查看它們的的編碼字符的時候,發現兩者確實也不一樣,
例如:
text_a = "?????" text_b = "??????" print(text_a == text_b) # False print(unicodedata.normalize("NFKD", text_a) == text_b) # True
事實上,在Unicode的編碼中,經常會有一些特殊字符被編碼成多種 Unicode 形式,例如: 字符 U+00C7 (LATIN CAPITAL LETTER C WITH CEDILLA) 也可以被表示為下面列個字符的組合: U+0043 (LATIN CAPITAL LETTER C) 和 字符U+0327 (COMBINING CEDILLA).
這種情況下多發于那些需要包含音調的字符體系中(例如印地語、德語、西班牙語等),如以下字符"?",Unicode體系中,即可以用Compose(組合)的形式U+00C7來表示這個字符, 也可以使用Decompose(分離)分別存盤字符(U+0043)本身和音調(U+0327)本身,
在上面的印地語中,出現問題的主要是因為字符"?",該字符下有一個小點,表示印地語中的一些音調問題(具體參考 Nuqta),該字符就擁有 Compose 和 Decompose 兩種Unicode表示方法, 因此才會出現上文中字符不等的例子,
在Python中,我們可以利用 unicodedata.normalize 函式對字符進行標準化,標準化分為兩個方式:
unicodedata.normalize("NFKC", text): Normal form Composition: 將所有的文本標準化為 Compose 形式,
unicodedata.normalize("NFKD", text): Normal form Decomposition: 將所有的文本標準化為 Decompose 形式,
更標準的寫法,應該為
import unicodedata def strip_accents(s): return ''.join(c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn')
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543505.html
標籤:Python
