如何在Python中提取印地语文本的视觉字符(解决拆分异常)
解决印地语视觉字符(字形簇)拆分问题
你遇到的核心问题是Unicode组合字符与视觉字形簇的差异:印地语使用的天城文里,部分视觉上的单个字符由多个Unicode码点组合而成(比如「न्दू」是न+्+द+ू四个码点的组合)。普通的list()方法按单个Unicode码点拆分,所以得到6个元素;而记事本是按**视觉字形簇(Grapheme Cluster)**计数,也就是你看到的3个独立视觉单元。
下面是两种可靠的解决方法:
方法1:用regex库匹配字形簇(推荐)
Python标准库的re不支持字形簇匹配,但第三方库regex支持\X模式(专门匹配完整的视觉字形),步骤如下:
- 安装依赖:
pip install regex
- 代码实现:
import regex word = "बन्दूक" visual_chars = regex.findall(r'\X', word) print(visual_chars) # 输出: ['ब', 'न्दू', 'क'] print(len(visual_chars)) # 输出: 3
方法2:手动合并组合字符(无第三方依赖)
利用unicodedata模块判断字符类别,将组合标记(以'M'开头的Unicode类别,比如Mn、Mc)合并到前一个基础字符,实现字形簇拆分:
import unicodedata def get_visual_chars(text): graphemes = [] current_cluster = [] for char in text: # 组合标记属于附属字符,合并到当前字形簇 if unicodedata.category(char).startswith('M'): if current_cluster: current_cluster.append(char) else: graphemes.append(char) else: if current_cluster: graphemes.append(''.join(current_cluster)) current_cluster = [char] # 处理最后一个字形簇 if current_cluster: graphemes.append(''.join(current_cluster)) return graphemes word = "बन्दूक" result = get_visual_chars(word) print(result) # 输出: ['ब', 'न्दू', 'क'] print(len(result)) # 输出: 3
内容的提问来源于stack exchange,提问作者Andres Miguel Campos
相关产品推荐
相关产品推荐

