2017-10-29 76 views
5

Próbuję przesylabizować Devanagari słowaSyllabification z dewanagari

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

wd.split('्') 

uzyskać wynik jako:

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

Który jest częściowo poprawny

próbuję innego słowa कुरुक्षेत्र -> कु रुक् षेत् रे kurukshetre -> ku ruk ona tre

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

Wynik jest oczywiście błędne.

Jak skutecznie wyodrębnić sylaby?

Odpowiedz

1

Jeśli spojrzeć na swój charakter przez ciągi znaków

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

a innymi ciąg

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

Więc co chcesz, to prawdopodobnie te podzielone korzystając '्'्. Nazwijmy je teraz postaciami do zapisu. Jeśli wydrukujesz ord(data[2]) dla pierwszego znaku zapisu, będzie to 2381. Teraz, jeśli sonda wokół tej wartości

>>> 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 य़ 

Jesteśmy zainteresowani głównie w wartościach między 2362 i 2391. Więc stworzyć tablicę takich wartości

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

Następny chcemy znaleźć wszystkie wzór z lub bez odpowiedniego symbolu notacji.

>>> re.findall(".[" + split + "]?", "धर्मक्षेत्रे") 
['ध', 'र्', 'म', 'क्', 'षे', 'त्', 'रे'] 
>>> re.findall(".[" + split + "]?", "कुरुक्षेत्र") 
['कु', 'रु', 'क्', 'षे', 'त्', 'र'] 

To powinno Cię przybliżyć do tego, czego prawdopodobnie szukasz. Jeśli potrzebujesz bardziej skomplikowanej obsługi, musisz przejść do linku @OphirYoktan opublikowanego pod numerem

+0

dzięki. Mogę to wziąć stąd –

0

. Zapoznaj się z unicodedatamodule.

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

Nazwy przypisane do każdego znaku:

>>> 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 

ogólnej kategorii przypisane do każdego znaku:

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


Lo 
Mn 
Lo 
Mn 
Lo 
Mn 
Lo 
Mn 
Lo 
Mn 
Lo 

FileFormat.info ma listę kategorii znaków Unicode.

Zobacz, czy to jest to, co chcesz osiągnąć:

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 

Testowanie funkcji:

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