2016-03-10 2 views
2

Я пишу лексический анализатор для текста в Юникоде. Многие символы Юникода требуют нескольких кодовых точек (даже после канонической композиции). Например, tuple(map(ord, unicodedata.normalize('NFC', 'ā́'))) оценивает (257, 769). Как я могу узнать, где граница между двумя символами? Кроме того, я хотел бы сохранить ненормализованную версию текста. Мой вход гарантированно будет Unicode.Учитывая список кодов Unicode, как их разбить на список символов Unicode?

До сих пор, это то, что у меня есть:

from unicodedata import normalize 

def split_into_characters(text): 
    character = "" 
    characters = [] 

    for i in range(len(text)): 
     character += text[i] 

     if len(normalize('NFKC', character)) > 1: 
      characters.append(character[:-1]) 
      character = character[-1] 

    if len(character) > 0: 
     characters.append(character) 

    return characters 

print(split_into_characters('Puélla in vī́llā vīcī́nā hábitat.')) 

Это неправильно печатает следующее:

['P', 'u', 'é', 'l', 'l', 'a', ' ', 'i', 'n', ' ', 'v', 'ī', '́', 'l', 'l', 'ā', ' ', 'v', 'ī', 'c', 'ī', '́', 'n', 'ā', ' ', 'h', 'á', 'b', 'i', 't', 'a', 't', '.'] 

Я ожидаю, что это напечатать следующее:

['P', 'u', 'é', 'l', 'l', 'a', ' ', 'i', 'n', ' ', 'v', 'ī́', 'l', 'l', 'ā', ' ', 'v', 'ī', 'c', 'ī́', 'n', 'ā', ' ', 'h', 'á', 'b', 'i', 't', 'a', 't', '.'] 

ответ

4

Границы между воспринимаемыми символами можно идентифицировать с помощью Unicode Grapheme Cluster Boundary algorithm. У модуля Python unicodedata нет необходимых данных для алгоритма (свойство Grapheme_Cluster_Break), но полные реализации можно найти в библиотеках, таких как PyICU и uniseg.

+0

О, сладкий. У обоих есть вполне разрешительные лицензии. Отлично! Благодаря! –

Смежные вопросы