结合梵文字符

结合梵文字符,第1张

结合梵文字符

将文本拆分为字形簇的算法在Unipre附件29第3.1节中给出。我不会在这里为您实现完整的算法,但是我将向您大致介绍如何处理Devanagari的情况,然后您可以自己阅读附件并了解还需要实现什么。

unipredata
模块包含检测字素簇所需的信息。

>>> import unipredata>>> a = "बिक्रम मेरो नाम हो">>> [unipredata.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']

在梵文中,每个字素簇由一个初始字母,可选的virama(元音杀手)和字母对以及一个可选的元音符号组成。以正则表达式表示为

LETTER (VIRAMALETTER)*VOWEL?
。通过查找每个代码点的Unipre类别,您可以确定哪个是哪个:

>>> [unipredata.category(c) for c in a]['Lo', 'Mc', 'Lo', 'Mn', 'Lo', 'Lo', 'Zs', 'Lo', 'Mn', 'Lo', 'Mc', 'Zs', 'Lo', 'Mc', 'Lo', 'Zs', 'Lo', 'Mc']

字母是类别

Lo
(字母,其他),元音符号是类别
Mc
(标记,间距组合),virama是类别
Mn
(标记,非间距),空格是类别
Zs
(分隔符,空格)。

因此,这是一种分离字素簇的粗略方法:

def splitclusters(s):    """Generate the grapheme clusters for the string s. (Not the full    Unipre text segmentation algorithm, but probably good enough for    Devanagari.)    """    virama = u'N{DEVANAGARI SIGN VIRAMA}'    cluster = u''    last = None    for c in s:        cat = unipredata.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))['बि', 'क्र', 'म', ' ', 'मे', 'रो', ' ', 'ना', 'म', ' ', 'हो']


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5143204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存