Imdb审查编码错误

时间:2017-10-09 10:04:32

标签: python nlp rnn

我正在尝试建立一个RNN模型,将评论分类为积极或消极的情绪。

有一个词汇词典,在预处理中,我会对一些索引序列进行审查 例如,

  

“这部电影最棒” - > [2,5,10,3]

当我试图频繁获取词汇并查看其内容时,我收到了此错误:

num of reviews 100
number of unique tokens : 4761
Traceback (most recent call last):
  File "preprocess.py", line 47, in <module>
    print(vocab)
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 10561: ordinal not in range(128)

代码如下:

from bs4 import BeautifulSoup
reviews = []
for item in os.listdir('imdbdata/train/pos')[:100]:
    with open("imdbdata/train/pos/"+item,'r',encoding='utf-8') as f:
        sample = BeautifulSoup(f.read()).get_text()
    sample = word_tokenize(sample.lower())
    reviews.append(sample)
print("num of reviews", len(reviews))
word_freq = nltk.FreqDist(itertools.chain(*reviews))
print("number of unique tokens : %d"%(len(word_freq.items())))
vocab = word_freq.most_common(vocab_size-1)
index_to_word = [x[0] for x in vocab]
index_to_word.append(unknown_token)
word_to_index = dict((w,i) for i,w in enumerate(index_to_word))
print(vocab)

问题是,在处理Python的NLP问题时,如何摆脱这个UnicodeEncodeError?特别是在使用open函数获取一些文本时。

1 个答案:

答案 0 :(得分:1)

看起来您的终端配置为ASCII。由于字符'\xe9'超出ASCII字符范围(0x00-0x7F),因此无法在ASCII终端上打印。它也不能编码为ASCII:

>>> s = '\xe9'
>>> s.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 0: ordinal not in range(128)

您可以通过在打印时显式编码字符串并使用?替换不受支持的字符来处理编码错误来解决此问题:

>>> print(s.encode('ascii', errors='replace'))
b'?'

该字符看起来像是带有急性(é)的小写字母e的ISO-8859-1编码。

您可以检查用于标准输出的编码。在我的情况下,它是UTF-8,我打印该字符没有问题:

>>> import sys
>>> sys.stdout.encoding
'UTF-8'
>>> print('\xe9')
é

您可能能够强制Python使用不同的默认编码;有一些讨论here,但最好的方法是使用支持UTF-8的终端。