我使用twitter流式api(tweepy)来捕获几条推文。我在python2.7中这样做。
在收集推文语料库后,我将每条推文分成单词,并将每个单词作为键添加到词典中,其中值是positive
或negative
句中每个单词的参与。
当我检索单词作为字典的键并尝试处理它们以进行下一次迭代时,我得到了
UnicodeDecodeError:'ascii'编解码器无法解码位置2中的字节0xe2:序数不在范围内(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()
(请为问题提出更好的标题)
答案 0 :(得分:1)
请注意,错误消息显示“'ascii'编解码器无法解码 ...”。那是因为当你在Python 2中已经是字节串的东西上调用encode
时,它会尝试使用默认编解码器将其解码为Unicode。
我不确定为什么你认为再次编码会是一个好主意。不要这样做;字符串已经被字符串所保留,就像那样。
答案 1 :(得分:1)
当您尝试编码字符串时,会出现解码错误。这看起来很奇怪,但这是由于Python的隐式解码/编码机制。
Python允许对字符串进行编码以获取字节并解码字节以获取字符串。这意味着Python只能编码字符串并只解码字节。
因此,当您尝试编码字节时,Python(不知道如何编码字节)会尝试隐式解码字节以获取要编码的字符串,并使用其默认编码来执行此操作。 这就是为什么在尝试编码时会出现解码错误的原因:隐式解码。
这意味着您可能正在尝试编码已编码的内容。