#python #python-2.7 #encoding #utf-8 #tweepy
#python #python-2.7 #кодирование #utf-8 #tweepy
Вопрос:
Я использую потоковый API Twitter (tweepy) для записи нескольких твитов. Я делаю это в python2.7.
После того, как я собрал корпус твитов, я разбиваю каждый твит на слова и добавляю каждое слово в словарь в виде ключей, где значения представляют собой участие каждого слова в positive
или negative
предложениях.
Когда я извлекаю слова как ключи словаря и пытаюсь обработать их для следующей итерации, я получаю
Ошибка UnicodeDecodeError: кодек ‘ascii’ не может декодировать байт 0xe2 в позиции 2: порядковый номер не входит в диапазон (128)
ошибки
Странно то, что перед тем, как поместить их в качестве ключей словаря, я кодирую их без ошибок. Вот пример кода
pos = {}
neg = {}
for status in corpus:
p = s.analyze(status).polarity
words = []
# gather real words
for w in status.split(' '):
try:
words.append(w.encode('utf-8'))
except UnicodeDecodeError as e:
print(e)
# assign sentiment of the sentence to the words
for w in words:
if w not in pos:
pos[w] = 0
neg[w] = 0
if p >= 0:
pos[w] = 1
else:
neg[w] = 1
k = pos.keys()
k = [i.encode('utf-8') for i in k] # <-- for this line a get an error
p = [v for i, v in pos.items()]
n = [v for i, v in neg.items()]
Таким образом, этот фрагмент кода не обнаружит ошибок при разделении слов, но он выдаст ошибку при попытке повторного кодирования ключей. Я должен отметить, что обычно я бы не пытался снова кодировать ключи, так как я думаю, что они уже правильно закодированы. Но я добавил эту дополнительную кодировку, чтобы сузить источник ошибки.
Я что-то упускаю? Вы видите что-нибудь неправильное в моем коде?
чтобы избежать путаницы, вот пример кода, более близкого к оригиналу, который не пытается повторно кодировать ключи
k = ['happy']
for i in range(3):
print('sampling twitter --> {}'.format(i))
myStream.filter(track=k) # <-- this is where I will receive the error in the second iteration
for status in corpus:
p = s.analyze(status).polarity
words = []
# gather real words
for w in status.split(' '):
try:
words.append(w.encode('utf-8'))
except UnicodeDecodeError as e:
print(e)
# assign sentiment of the sentence to the words
for w in words:
if w not in pos:
pos[w] = 0
neg[w] = 0
if p >= 0:
pos[w] = 1
else:
neg[w] = 1
k = pos.keys()
(пожалуйста, предложите лучшее название вопроса)
Комментарии:
1. Почему вы кодируете () закодированное значение? Вы хотели это расшифровать?
2. Что, если вы w.encode (‘ascii’) в первый раз? Устраняет ли это ошибку?
3. Как я и подозревал
tweepy
, по умолчанию кодируются термины дорожки, отсюда и ошибка
Ответ №1:
При попытке кодирования строки вы получаете ошибку декодирования. Это кажется странным, но это связано с неявным механизмом декодирования / кодирования Python.
Python позволяет кодировать строки для получения байтов и декодировать байты для получения строк. Это означает, что Python может кодировать только строки и декодировать только байты.
Поэтому, когда вы пытаетесь закодировать байты, Python (который не знает, как кодировать байты) пытается неявно декодировать байт, чтобы получить строку для кодирования, и для этого он использует кодировку по умолчанию. Вот почему вы получаете ошибку декодирования при попытке что-либо закодировать: неявное декодирование.
Это означает, что вы, вероятно, пытаетесь закодировать что-то, что уже закодировано.
Комментарии:
1. Во втором фрагменте я не пытаюсь снова кодировать слова, возможно,
tweepy
пытается закодировать начальное значение по умолчанию
Ответ №2:
Обратите внимание, что в сообщении об ошибке говорится «кодек ‘ascii’ не может декодировать …». Это потому, что когда вы вызываете encode
что-то, что уже является байтовой строкой в Python 2, оно пытается сначала декодировать его в Unicode, используя кодек по умолчанию.
Я не уверен, почему вы подумали, что повторное кодирование было бы хорошей идеей. Не делайте этого; строки уже являются byetestrings, оставьте их такими.
Комментарии:
1. Дэниел, я обновил вопрос. Пожалуйста, посмотрите, я явно не пытаюсь перекодировать строку encodes. Но теперь, когда вы упомянули об этом, возможно,
tweepy
обработчик потоковой передачи пытается (?) Я проверю это2. Вам нужно будет опубликовать полную обратную трассировку, чтобы мы могли видеть, где возникает ошибка.