Преобразование списка Юникод в читаемый формат - PullRequest
0 голосов
/ 23 октября 2018

Я использую полиглот для токенизации текста на бирманском языке.Вот что я делаю.

    from polyglot.text import Text

    blob = u"""
ထိုင္းေရာက္ျမန္မာလုပ္သားမ်ားကို လုံၿခဳံေရး အေၾကာင္းျပၿပီး ထိုင္းရဲဆက္လက္ဖမ္းဆီး၊ ဧည့္စာရင္းအေၾကာင္းျပ၍ ဒဏ္ေငြ႐ိုက္
"""
    text = Text(blob)

Когда я делаю:

print(text.words)

Он выводит в следующем формате:

[u'\u1011\u102d\u102f', u'\u1004\u1039\u1038\u1031', u'\u101b\u102c', u'\u1000\u1039\u103b', u'\u1019', u'\u1014\u1039', u'\u1019\u102c', u'\u101c\u102f', u'\u1015\u1039', u'\u101e\u102c\u1038', u'\u1019\u103a\u102c\u1038', u'\u1000\u102d\u102f', u'\u101c\u102f\u1036', u'\u107f', u'\u1001\u1033\u1036\u1031', u'\u101b\u1038', u'\u1021\u1031\u107e', u'\u1000\u102c', u'\u1004\u1039\u1038\u103b', u'\u1015\u107f', u'\u1015\u102e\u1038', u'\u1011\u102d\u102f', u'\u1004\u1039\u1038', u'\u101b\u1032', u'\u1006', u'\u1000\u1039', u'\u101c', u'\u1000\u1039', u'\u1016', u'\u1019\u1039\u1038', u'\u1006\u102e\u1038', u'\u104a', u'\u1027', u'\u100a\u1037\u1039', u'\u1005\u102c', u'\u101b', u'\u1004\u1039\u1038', u'\u1021\u1031\u107e', u'\u1000\u102c', u'\u1004\u1039\u1038\u103b', u'\u1015', u'\u104d', u'\u1012', u'\u100f\u1039\u1031', u'\u1004\u103c\u1090\u102d\u102f', u'\u1000\u1039']

Что это за выход?Я не уверен, почему вывод такой.Как я мог преобразовать это обратно в формат, где я мог бы иметь некоторый смысл из этого?

Я также попробовал следующее:

text.words[1].decode('unicode-escape')

, но выдает ошибку, говорящую: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Именно так Python 2 печатает список.Это отладочный вывод (см. repr () ), который однозначно указывает содержимое списка.u'' обозначает строку Unicode, а \uxxxx обозначает кодовую точку Unicode U + xxxx.Выходные данные все ASCII, поэтому он работает на любом терминале.Если вы напрямую распечатываете строки в списке, они будут отображаться правильно, если ваш терминал поддерживает печатные символы.Пример:

words = [u'\u1011\u102d\u102f', u'\u1004\u1039\u1038\u1031', u'\u101b\u102c']
print words
for word in words:
    print word

Вывод:

[u'\u1011\u102d\u102f', u'\u1004\u1039\u1038\u1031', u'\u101b\u102c']
ထို
င္းေ
ရာ

Чтобы еще раз подчеркнуть, ваш терминал должен быть настроен с кодировкой, поддерживающей кодовые точки Unicode (в идеале, UTF-8), и использоватьшрифт, который поддерживает символы.В противном случае вы можете распечатать текст в файл в кодировке UTF-8 и просмотреть файл в редакторе, который поддерживает UTF-8 и имеет шрифты, которые поддерживают символы:

import io
with io.open('example.txt','w',encoding='utf8') as f:
    for word in words:
        f.write(word + u'\n')

Переключиться на Python 3,и все становится проще.По умолчанию отображаются символы, если терминал его поддерживает, но вы все равно можете получить выходные данные отладки:

words = [u'\u1011\u102d\u102f', u'\u1004\u1039\u1038\u1031', u'\u101b\u102c']
print(words)
print(ascii(words))

Вывод:

['ထို', 'င္းေ', 'ရာ']
['\u1011\u102d\u102f', '\u1004\u1039\u1038\u1031', '\u101b\u102c']
0 голосов
/ 23 октября 2018

Похоже, ваш терминал не может обрабатывать кодировку UTF-8 в кодировке Unicode.Попробуйте сохранить выходные данные, кодируя каждый токен в utf-8 следующим образом.

    # -*- coding: utf-8 -*-

    from _future_ import unicode_literals
    from polyglot.text import Text

    blob = u"""
    ထိုင္းေရာက္ျမန္မာလုပ္သားမ်ားကို လုံၿခဳံေရး အေၾကာင္းျပၿပီး ထိုင္းရဲဆက္လက္ဖမ္းဆီး၊ ဧည့္စာရင္းအေၾကာင္းျပ၍ ဒဏ္ေငြ႐ိုက္
    """
    text = Text(blob)


    with open('output.txt', 'a') as the_file:
        for word in text.words:
            the_file.write("\n")
            the_file.write(word.encode("utf-8"))
...