梵文的音节化
Syllabification of Devanagari
我正在尝试对梵文单词进行音节化
在宗教领域 -> 在宗教领域
dharmakeshetre -> dharmakeshetre
wd.split('्')
您得到的结果为:
['धर', 'मक', 'षेत', 'रे']
部分正确
我试试另一个词 Kurukshetra -> Kurukshetra
kurukshetre -> 偷
['कुरुक', 'षेत', 'रे']
结果明显错误
如何有效地提取音节?
如果逐个字符查看字符串
>>> 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)
接下来我们要查找所有带或不带对应符号的模式。
>>> re.findall(".[" + split + "]?", "धर्मक्षेत्रे")
['ध', 'र्', 'म', 'क्', 'षे', 'त्', 'रे']
>>> re.findall(".[" + split + "]?", "कुरुक्षेत्र")
['कु', 'रु', 'क्', 'षे', 'त्', 'र']
这应该会让您接近您可能正在寻找的内容。如果您需要更复杂的处理,那么您将不得不使用 link @OphirYoktan 发布的
查看 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[0] == 'M':
cluster = cluster + char
else:
if cluster:
yield cluster
cluster = char
end = char
if cluster:
yield cluster
正在测试函数:
>>> list(split_clusters('धर्मक्षेत्रे'))
['ध', 'र्म', 'क्षे', 'त्रे']
>>> list(split_clusters('कुरुक्षेत्र'))
['कु', 'रु', 'क्षे', 'त्र']
我正在尝试对梵文单词进行音节化
在宗教领域 -> 在宗教领域 dharmakeshetre -> dharmakeshetre
wd.split('्')
您得到的结果为:
['धर', 'मक', 'षेत', 'रे']
部分正确
我试试另一个词 Kurukshetra -> Kurukshetra kurukshetre -> 偷
['कुरुक', 'षेत', 'रे']
结果明显错误
如何有效地提取音节?
如果逐个字符查看字符串
>>> 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)
接下来我们要查找所有带或不带对应符号的模式。
>>> re.findall(".[" + split + "]?", "धर्मक्षेत्रे")
['ध', 'र्', 'म', 'क्', 'षे', 'त्', 'रे']
>>> re.findall(".[" + split + "]?", "कुरुक्षेत्र")
['कु', 'रु', 'क्', 'षे', 'त्', 'र']
这应该会让您接近您可能正在寻找的内容。如果您需要更复杂的处理,那么您将不得不使用 link @OphirYoktan 发布的
查看 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[0] == 'M':
cluster = cluster + char
else:
if cluster:
yield cluster
cluster = char
end = char
if cluster:
yield cluster
正在测试函数:
>>> list(split_clusters('धर्मक्षेत्रे'))
['ध', 'र्म', 'क्षे', 'त्रे']
>>> list(split_clusters('कुरुक्षेत्र'))
['कु', 'रु', 'क्षे', 'त्र']