2

Unicode テキストの語彙アナライザーを作成しています。多くの Unicode 文字には複数のコード ポイントが必要です (正規構成の後でも)。たとえば、 にtuple(map(ord, unicodedata.normalize('NFC', 'ā́')))評価され(257, 769)ます。2 つの文字の境界がどこにあるかを知るにはどうすればよいですか? さらに、テキストの正規化されていないバージョンを保存したいと思います。私の入力は 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

2 に答える 2

1

UAX #29で指定されているように、 コード ポイント シーケンスを拡張書記素クラスターに分割するための Unicode アルゴリズムの実装であるpyuegcライブラリを使用することをお勧めします。

from pyuegc import EGC  # pip install pyuegc

string = 'Puélla in vī́llā vīcī́nā hábitat.'
egc = EGC(string)
print(egc)
# ['P', 'u', 'é', 'l', 'l', 'a', ' ', 'i', 'n', ' ', 'v', 'ī́', 'l', 'l', 'ā', ' ', 'v', 'ī', 'c', 'ī́', 'n', 'ā', ' ', 'h', 'á', 'b', 'i', 't', 'a', 't', '.']

print(len(string))
# 35
print(len(egc))
# 31
于 2021-10-21T18:52:38.220 に答える