梵文的音节化

时间:2017-10-29 13:21:16

标签: python string python-3.x utf devanagari

我正在尝试对梵文词汇进行音节化

धर्मक्षेत्रे - > धर्मक्षेत्रे dharmakeshetre - > dhar mak shet re

wd.split('्')

我得到的结果为:

['धर', 'मक', 'षेत', 'रे']

哪个部分正确

我尝试另一个词कुरुक्षेत्र - > कुरुक्षेत्रे kurukshetre - > ku ruk she tre

['कुरुक', 'षेत', 'रे']

结果显然是错误的。

如何有效地提取音节?

2 个答案:

答案 0 :(得分:1)

结帐unicodedata module

>>> import unicodedata
>>> word = 'कुरुक्षेत्र'

分配给每个角色的名称:

>>> for ch in word:
        print(unicodedata.name(ch))


DEVANAGARI LETTER KA
DEVANAGARI VOWEL SIGN U
DEVANAGARI LETTER RA
DEVANAGARI VOWEL SIGN U
DEVANAGARI LETTER KA
DEVANAGARI SIGN VIRAMA
DEVANAGARI LETTER SSA
DEVANAGARI VOWEL SIGN E
DEVANAGARI LETTER TA
DEVANAGARI SIGN VIRAMA
DEVANAGARI LETTER RA

分配给每个角色的常规类别:

>>> for ch in word:
        print(unicodedata.category(ch))


Lo
Mn
Lo
Mn
Lo
Mn
Lo
Mn
Lo
Mn
Lo

FileFormat.info有一个Unicode字符类别列表。

看看这是否是你想要达到的目的:

import unicodedata

def split_clusters(txt):
    """ Generate grapheme clusters for the Devanagari text."""

    stop = '्'
    cluster = u''
    end = None

    for char in txt:
        category = unicodedata.category(char)
        if (category == 'Lo' and end == stop) or category == 'Mn':
            cluster = cluster + char        
        else:
            if cluster:
                yield cluster
            cluster = char
        end = char

    if cluster:
        yield cluster

测试功能:

>>> list(split_clusters('धर्मक्षेत्रे'))
['ध', 'र्म', 'क्षे', 'त्रे']
>>> list(split_clusters('कुरुक्षेत्र'))
['कु', 'रु', 'क्षे', 'त्र']

答案 1 :(得分:0)

如果你逐个字符地查看你的字符串

@echo off
FOR /F "Tokens=* delims= " %%G IN ('Copy /y c:\temp\temp1\* c:\temp\temp2\') DO (
    IF DEFINED LINE1 SET "LINE2=%%G"
    IF NOT DEFINED LINE1 SET "LINE1=%%G"
)
ECHO %LINE1% ^| %LINE2% ^| %date% %time%
pause

你的另一个字符串

>>> data = "कुरुक्षेत्र"
>>> re.findall(".", data)
['क', 'ु', 'र', 'ु', 'क', '्', 'ष', 'े', 'त', '्', 'र']

所以你想要的可能是>>> data = "धर्मक्षेत्रे" >>> re.findall(".", data) ['ध', 'र', '्', 'म', 'क', '्', 'ष', 'े', 'त', '्', 'र', 'े'] '्。我们暂时将它们称为符号字符。如果您打印第一个符号字符的'्,则为ord(data[2])。现在,如果你探测这个值

2381

我们最感兴趣的是>>> for i in range(2350, 2400): ... print(i, chr(i)) ... 2350 म 2351 य 2352 र 2353 ऱ 2354 ल 2355 ळ 2356 ऴ 2357 व 2358 श 2359 ष 2360 स 2361 ह 2362 ऺ 2363 ऻ 2364 ़ 2365 ऽ 2366 ा 2367 ि 2368 ी 2369 ु 2370 ू 2371 ृ 2372 ॄ 2373 ॅ 2374 ॆ 2375 े 2376 ै 2377 ॉ 2378 ॊ 2379 ो 2380 ौ 2381 ् 2382 ॎ 2383 ॏ 2384 ॐ 2385 ॑ 2386 ॒ 2387 ॓ 2388 ॔ 2389 ॕ 2390 ॖ 2391 ॗ 2392 क़ 2393 ख़ 2394 ग़ 2395 ज़ 2396 ड़ 2397 ढ़ 2398 फ़ 2399 य़ 2362之间的值。所以我们创建了一个这样的值数组

2391

接下来,我们希望找到所有带或不带相应符号的模式。

>>> split = ""
>>> for i in range(2362, 2392):
...     split += chr(i)

这应该让你接近你可能正在寻找的东西。如果您需要更复杂的处理,那么您将不得不使用链接@OphirYoktan发布