В Python 3 считайте позиции тайских персонажей - PullRequest
0 голосов
/ 19 января 2019

FIRST , я использовал библиотеку Python 3 grapheme для решения моей проблемы.(Подробнее о графеме см. в этой статье ).Но я удивлен, что Python 3 не может сделать это без специализированной библиотеки ...


Я прибег к grapheme , потому что после многих поисков в Интернете и чтения вопросов StackOverflowЯ не смог заставить Python 3 вернуть правильное количество позиций символов в последовательности символов тайского языка.

Например, вот строка UTF-8 символов тайского языка:

thai_str = 'สีโชคดีเป็นสีชมพู สีโชคร้ายเป็นสีเหลืองและขาว'

Я использую термин позиция символа , чтобы определить одну позицию в строке / строке тайских символов.Это связано с тем, что позиция персонажа может состоять из тайского согласного плюс, в некоторых случаях, гласного или тонального маркера выше или ниже этого согласного.Согласный плюс гласный или тональный маркер выше / ниже занимают одну позицию символа в строке Unicode.(У некоторых тайских согласных также могут быть гласные слева, справа или от обоих. Эти гласные занимают свою собственную позицию символа.)

Например, в следующей последовательности, сгенерированной из строки примера, пункты 2 и 7гласные, а пункт 10 является тональным маркером.Каждый использует отдельные байты в строке UTF-8, но не занимает свои собственные позиции символов.Пункты 3 и 8 являются гласными, которые идут слева от согласного и, следовательно, занимают позиции символов.

01: ส
02: ี
03: โ
04: ช
05: ค
06: ด
07: ี
08: เ
09: ป
10: ็
...
45: ว

При попытке определить позиции символов в строке примера, len(thai_str) возвращает 45.Что не правильно.Единственный способ получить правильное количество позиций символов - это использовать grapheme.length(thai_str) для получения 35.

Я также использовал encode для полученияследующее:

b'\xe0\xb8\xaa\xe0\xb8\xb5\xe0\xb9\x82\xe0\xb8\x8a\xe0\xb8\x84\xe0\xb8\x94...

(Подсчет экземпляров xe0, которые кажутся предшествующими каждому тайскому символу, не выглядит правильным подходом ...)

SO - единственный способ подсчитать позиции символов в моем примере строки - использовать библиотеку Python 3, такую ​​как grapheme ?

1 Ответ

0 голосов
/ 19 января 2019

Это не единственный способ, если вы хотите самостоятельно реализовать счетчик графем, но он сложный, и вы должны обратиться к https://unicode.org спецификациям, чтобы получить его правильно.

thai_str - это не такстрока UTF-8, но строка Unicode, содержащая кодовые точки Unicode.Существуют различные категории кодовых точек.Для подсчета позиций символов необходимы две категории:

  • Lo Other_Letter , другие буквы, включая слоги и иероглифы;
  • Mn Nonspacing_Mark , непересекающаяся комбинационная метка ( нулевая ширина продвижения ).

Если вы пропустите подсчет категории кода Nonspacing_Mark (Mn)Точки, вы можете приблизительно увидеть, что делает библиотека графем:

import unicodedata as ud

thai_str = 'สีโชคดีเป็นสีชมพู สีโชคร้ายเป็นสีเหลืองและขาว'

for cp in thai_str:
    print(f'{cp}\t{ud.category(cp)}\t{ud.name(cp)}')

print(sum(1 for cp in thai_str if ud.category(cp)[0] != 'M'))

Вывод:

ส   Lo  THAI CHARACTER SO SUA
ี   Mn  THAI CHARACTER SARA II
โ   Lo  THAI CHARACTER SARA O
ช   Lo  THAI CHARACTER CHO CHANG
ค   Lo  THAI CHARACTER KHO KHWAI
ด   Lo  THAI CHARACTER DO DEK
ี   Mn  THAI CHARACTER SARA II
เ   Lo  THAI CHARACTER SARA E
ป   Lo  THAI CHARACTER PO PLA
็   Mn  THAI CHARACTER MAITAIKHU
...
ว   Lo  THAI CHARACTER WO WAEN
35
...