mea*_*ari 25 python unicode indic devanagari
我有类似的东西
a = "?????? ???? ??? ??"
Run Code Online (Sandbox Code Playgroud)
我希望实现类似的目标
a[0] = ??
a[1] = ???
a[3] = ?
Run Code Online (Sandbox Code Playgroud)
但由于म占用4个字节,而बि占用8个字节,我无法直接进行.那么可以做些什么呢?在Python中.
Gar*_*ees 21
将文本分成字形簇的算法在Unicode附件29第3.1节中给出.我不打算在这里为你实现完整的算法,但是我将大致向你展示如何处理梵文的情况,然后你可以自己阅读附件,看看你还需要实现什么.
该unicodedata模块包含检测字形集群所需的信息.
>>> import unicodedata
>>> a = "?????? ???? ??? ??"
>>> [unicodedata.name(c) for c in a]
['DEVANAGARI LETTER BA', 'DEVANAGARI VOWEL SIGN I', 'DEVANAGARI LETTER KA',
'DEVANAGARI SIGN VIRAMA', 'DEVANAGARI LETTER RA', 'DEVANAGARI LETTER MA',
'SPACE', 'DEVANAGARI LETTER MA', 'DEVANAGARI VOWEL SIGN E',
'DEVANAGARI LETTER RA', 'DEVANAGARI VOWEL SIGN O', 'SPACE',
'DEVANAGARI LETTER NA', 'DEVANAGARI VOWEL SIGN AA', 'DEVANAGARI LETTER MA',
'SPACE', 'DEVANAGARI LETTER HA', 'DEVANAGARI VOWEL SIGN O']
Run Code Online (Sandbox Code Playgroud)
在梵文中,每个字形簇包括一个首字母,可选的变形对(元音杀手)和字母,以及一个可选的元音符号.在正则表达式表示法中LETTER (VIRAMA LETTER)* VOWEL?.您可以通过查找每个代码点的Unicode类别来确定哪个是哪个:
>>> [unicodedata.category(c) for c in a]
['Lo', 'Mc', 'Lo', 'Mn', 'Lo', 'Lo', 'Zs', 'Lo', 'Mn', 'Lo', 'Mc', 'Zs',
'Lo', 'Mc', 'Lo', 'Zs', 'Lo', 'Mc']
Run Code Online (Sandbox Code Playgroud)
字母是类别Lo(Letter,Other),元音符号是类别Mc(Mark,Spacing Combining),virama是类别Mn(Mark,Nonspacing),空格是category Zs(Separator,Space).
所以这是分离字形集群的粗略方法:
def splitclusters(s):
"""Generate the grapheme clusters for the string s. (Not the full
Unicode text segmentation algorithm, but probably good enough for
Devanagari.)
"""
virama = u'\N{DEVANAGARI SIGN VIRAMA}'
cluster = u''
last = None
for c in s:
cat = unicodedata.category(c)[0]
if cat == 'M' or cat == 'L' and last == virama:
cluster += c
else:
if cluster:
yield cluster
cluster = c
last = c
if cluster:
yield cluster
>>> list(splitclusters(a))
['??', '???', '?', ' ', '??', '??', ' ', '??', '?', ' ', '??']
Run Code Online (Sandbox Code Playgroud)
Die*_*Epp 14
所以,你想要实现这样的目标
a[0] = ?? a[1] = ??? a[3] = ?
Run Code Online (Sandbox Code Playgroud)
我的建议是放弃字符串索引对应于您在屏幕上看到的字符的想法.梵文和其他几个剧本在与拉丁字符一起长大的程序员中表现不佳.我建议阅读Unicode标准第9章(可在此处获得).
看起来你要做的就是将一个字符串分成字形簇.字符串索引本身不会让你这样做.Hangul是另一个使用字符串索引效果不佳的脚本,虽然使用组合字符,即使像西班牙语那样熟悉也会导致问题.
您将需要一个外部库(如ICU)来实现此目的(除非您有大量的空闲时间).ICU有Python绑定.
>>> a = u"?????? ???? ??? ??"
>>> import icu
# Note: This next line took a lot of guesswork. The C, C++, and Java
# interfaces have better documentation.
>>> b = icu.BreakIterator.createCharacterInstance(icu.Locale())
>>> b.setText(a)
>>> i = 0
>>> for j in b:
... s = a[i:j]
... print '|', s, len(s)
... i = j
...
| ?? 2
| ?? 2
| ? 1
| ? 1
| 1
| ?? 2
| ?? 2
| 1
| ?? 2
| ? 1
| 1
| ?? 2
Run Code Online (Sandbox Code Playgroud)
请注意这些"字符"(字形集群)中的一些长度为2,有些长度为1.这就是字符串索引存在问题的原因:如果我想从文本文件中获取字形集群#69450,那么我必须进行线性扫描通过整个文件和计数.所以你的选择是:
| 归档时间: |
|
| 查看次数: |
4744 次 |
| 最近记录: |