随笔 - 654  文章 - 1  评论 - 76  阅读 - 319万

python 对unicode字符进行normalized

参考: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')

 

posted on   shaomine  阅读(429)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示