Как сохранить коды символов юникода в моем CSV-файле? - PullRequest
0 голосов
/ 17 июня 2020

Я обрабатываю большое количество входящих писем, и во многих из них есть различные смайлы. Я планирую применить НЛП-анализ к комментариям пользователей и обучить классификатор давать соответствующие ответы, вместо того, чтобы вручную отвечать на сотни таких сообщений. Для этого в качестве первого шага я проанализировал все электронные письма и сохранил их содержимое в списке под названием userMessages, который я написал в файле csv. Я планирую добавить в csv дополнительные столбцы для аналитических c целей, таких как имя пользователя, адрес, дата и время, но сейчас это не актуально для этого вопроса.

Вот код, который я использую для записи списка userMessages в файл csv с именем user-messages.csv:

with open('user-messages.csv', 'wb') as myfile:
        wr = csv.writer(myfile, dialect='excel', encoding='utf-8', quoting=csv.QUOTE_ALL)
        for _msg in userMessages:
            wr.writerow([_msg])

Это не приводит к ошибке из-за encoding='utf-8', однако он удаляет / перекодирует смайлики таким образом, что их больше нельзя отследить, например, в следующем формате: ðŸ˜. В идеале я хотел бы иметь исходные коды Unicode в файле csv, например '\U0001f604' (улыбающееся лицо с открытым ртом и улыбающимися глазами), а затем заменить эти коды их (приблизительным) значением для НЛП, чтобы лучше понять контекст сообщений, например, в случае этого символа ('\U0001f604'), удалите код и добавьте слова «улыбка» или «счастливый».

Можно ли этого добиться? Или я слишком усложняю? Любой совет будет очень признателен. Спасибо!

Изменить: Я использую Windows и открываю файлы csv в Microsoft Excel 2016.

1 Ответ

1 голос
/ 17 июня 2020

Я действительно рекомендую заменить эти символы Unicode их значениями сейчас, а не сохранять Unicode в виде строки (что можно просто сделать, добавив escape-символ \) и преобразовать их позже.

Заменить Unicode их значением можно легко, используя метод unicodedata.name(), например:

import unicodedata

def normalize_unicode(text):
    output = []
    for word in text.split(' '):
        try:
            meaning = unicodedata.name(word).lower()
            output.append(meaning)
        except TypeError:
            output.append(word)
    return " ".join(output)

Давайте протестируем эту функцию:

>>> x = "I'm happy \U0001f604"
>>> normalize_unicode(x)
I'm happy smiling face with open mouth and smiling eyes

Теперь, посмотрим, как вы собираетесь использовать этот метод в своем коде:

with open('user-messages.csv', 'wb') as myfile:
        wr = csv.writer(myfile, dialect='excel', encoding='utf-8', quoting=csv.QUOTE_ALL)
        for _msg in userMessages:
            wr.writerow([ normalize_unicode(_msg) ])     #<-- can be added here
print(normalize_unicode(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...