【问题标题】:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 6: ordinal not in range(128)UnicodeDecodeError:“ascii”编解码器无法解码位置 6 中的字节 0xe2:序数不在范围内(128)
【发布时间】:2017-09-19 05:12:12
【问题描述】:

帮我弄清楚我的 python 代码出了什么问题。

就是代码

import nltk
import re
import pickle


raw = open('tom_sawyer_shrt.txt').read()

### this is how the basic Punkt sentence tokenizer works
#sent_tokenizer=nltk.data.load('tokenizers/punkt/english.pickle')
#sents = sent_tokenizer.tokenize(raw)

### train & tokenize text using text
sent_trainer = nltk.tokenize.punkt.PunktSentenceTokenizer().train(raw)
sent_tokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer(sent_trainer)
# break in to sentences
sents = sent_tokenizer.tokenize(raw)
# get sentence start/stop indexes
sentspan = sent_tokenizer.span_tokenize(raw)



###  Remove \n in the middle of setences, due to fixed-width formatting
for i in range(0,len(sents)-1):
    sents[i] = re.sub('(?<!\n)\n(?!\n)',' ',raw[sentspan[i][0]:sentspan[i+1][0]])

for i in range(1,len(sents)):
    if (sents[i][0:3] == '"\n\n'):
        sents[i-1] = sents[i-1]+'"\n\n'
        sents[i] = sents[i][3:]


### Loop thru each sentence, fix to 140char
i=0
tweet=[]
while (i<len(sents)):
    if (len(sents[i]) > 140):
        ntwt = int(len(sents[i])/140) + 1
        words = sents[i].split(' ')
        nwords = len(words)
        for k in range(0,ntwt):
            tweet = tweet + [
                re.sub('\A\s|\s\Z', '', ' '.join(
                words[int(k*nwords/float(ntwt)):
                      int((k+1)*nwords/float(ntwt))]
                ))]
        i=i+1
    else:
        if (i<len(sents)-1):
            if (len(sents[i])+len(sents[i+1]) <140):
                nextra = 1
                while (len(''.join(sents[i:i+nextra+1]))<140):
                    nextra=nextra+1
                tweet = tweet+[
                    re.sub('\A\s|\s\Z', '',''.join(sents[i:i+nextra]))
                    ]        
                i = i+nextra
            else:
                tweet = tweet+[re.sub('\A\s|\s\Z', '',sents[i])]
                i=i+1
        else:
            tweet = tweet+[re.sub('\A\s|\s\Z', '',sents[i])]
            i=i+1


### A last pass to clean up leading/trailing newlines/spaces.
for i in range(0,len(tweet)):
    tweet[i] = re.sub('\A\s|\s\Z','',tweet[i])

for i in range(0,len(tweet)):
    tweet[i] = re.sub('\A"\n\n','',tweet[i])


###  Save tweets to pickle file for easy reading later
output = open('tweet_list.pkl','wb')
pickle.dump(tweet,output,-1)
output.close()


listout = open('tweet_lis.txt','w')
for i in range(0,len(tweet)):
    listout.write(tweet[i])
    listout.write('\n-----------------\n')

listout.close()

这就是错误信息

Traceback(最近一次调用最后一次): 文件“twain_prep.py”,第 13 行,在 sent_trainer = nltk.tokenize.punkt.PunktSentenceTokenizer().train(raw) 文件“/home/user/.local/lib/python2.7/site-packages/nltk/tokenize/punkt.py”,第 1227 行,在火车中 token_cls=self._Token).get_params() init 中的文件“/home/user/.local/lib/python2.7/site-packages/nltk/tokenize/punkt.py”,第 649 行 self.train(train_text, 详细, finalize=True) 文件“/home/user/.local/lib/python2.7/site-packages/nltk/tokenize/punkt.py”,第 713 行,在火车中 self._train_tokens(self._tokenize_words(文本),详细) _train_tokens 中的文件“/home/user/.local/lib/python2.7/site-packages/nltk/tokenize/punkt.py”,第 729 行 令牌 = 列表(令牌) _tokenize_words 中的文件“/home/user/.local/lib/python2.7/site-packages/nltk/tokenize/punkt.py”,第 542 行 对于 plaintext.split('\n') 中的行: UnicodeDecodeError:“ascii”编解码器无法解码位置 6 中的字节 0xe2:序数不在范围内(128)

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    UnicodeDecodeError 发生在您的字符串中包含一些 Unicode 时。基本上,Python 字符串只处理 ascii 值,这就是为什么当您将文本发送到 tokenizer 时,它必须包含一些不在 ascii 列表中的字符。

    那么如何解决呢?

    您可以将文本转换为 ascii 字符并忽略“Unicode”字符。

    raw = raw..encode('ascii', 'ignore')
    

    另外,您可以阅读此post 来处理Unicode 错误。

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多