Python 2.7 NLTK和x27中的UnicodeDecodeError;s word_标记化,尽管我强制进行了编码

Python 2.7 NLTK和x27中的UnicodeDecodeError;s word_标记化,尽管我强制进行了编码,python-2.7,encoding,utf-8,nltk,pdfminer,Python 2.7,Encoding,Utf 8,Nltk,Pdfminer,我首先将pdf转换为纯文本(我打印出来,一切正常),然后在尝试从NLTK运行word_tokenize()时,得到一个UnicodeDecodeError 尽管我试图解码('utf-8'),但还是得到了那个错误。事先在纯文本上编码('utf-8')。在回溯中,我注意到word_tokenize()中首先引发错误的代码行是plaintext.split('\n')。这就是为什么我试图通过在纯文本上运行split('\n')来重现错误,但仍然没有引起任何错误 因此,我既不知道是什么导致了错误,也不知

我首先将pdf转换为纯文本(我打印出来,一切正常),然后在尝试从NLTK运行word_tokenize()时,得到一个UnicodeDecodeError

尽管我试图解码('utf-8'),但还是得到了那个错误。事先在纯文本上编码('utf-8')。在回溯中,我注意到word_tokenize()中首先引发错误的代码行是plaintext.split('\n')。这就是为什么我试图通过在纯文本上运行split('\n')来重现错误,但仍然没有引起任何错误

因此,我既不知道是什么导致了错误,也不知道如何避免错误

任何帮助都将不胜感激!:)也许我可以通过将pdf文件中的某些内容更改为txt文件来避免它

下面是标记化的代码:

from cStringIO import StringIO
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import os
import string
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage

stopset = stopwords.words('english')
path = 'my_folder'
listing = os.listdir(path)
for infile in listing:
        text = self.convert_pdf_to_txt(path+infile)
        text = text.decode('utf-8').encode('utf-8').lower()
        print text
        splitted = text.split('\n')
        filtered_tokens = [i for i in word_tokenize(text) if i not in stopset and i not in string.punctuation]
以下是我调用的从pdf转换为txt的方法:

def convert_pdf_to_txt(self, path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = file(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)
    fp.close()
    device.close()
    ret = retstr.getvalue()
    retstr.close()
    return ret
以下是我得到的错误回溯:

    Traceback (most recent call last):
  File "/home/iammyr/opt/workspace/task-logger/task_logger/nlp/pre_processing.py", line 65, in <module>
    obj.tokenizeStopWords()
  File "/home/iammyr/opt/workspace/task-logger/task_logger/nlp/pre_processing.py", line 29, in tokenizeStopWords
    filtered_tokens = [i for i in word_tokenize(text) if i not in stopset and i not in string.punctuation]
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/__init__.py", line 93, in word_tokenize
    return [token for sent in sent_tokenize(text)
  [...]
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 586, in _tokenize_words
    for line in plaintext.split('\n'):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 9: ordinal not in range(128)
回溯(最近一次呼叫最后一次):
文件“/home/iammyr/opt/workspace/task logger/task_logger/nlp/pre_processing.py”,第65行,在
obj.tokenizeStopWords()
文件“/home/iammyr/opt/workspace/task logger/task_logger/nlp/pre_processing.py”,第29行,在tokenizeStopWords中
filtered_tokens=[i for i in word_tokenize(text),如果我不在stopset中且我不在string中。标点符号]
文件“/usr/local/lib/python2.7/dist packages/nltk/tokenize/_init__.py”,第93行,在word_tokenize中
return[已发送的令牌\u令牌化(文本)
[...]
文件“/usr/local/lib/python2.7/dist packages/nltk/tokenize/punkt.py”,第586行,以“tokenize”字表示
对于纯文本中的行。拆分('\n'):
UnicodeDecodeError:“ascii”编解码器无法解码第9位的字节0xc2:序号不在范围内(128)

感谢你无数的善果!;)

你正在将一段完美的Unicode字符串(返回)变成一堆非类型化字节,Python不知道如何处理这些字节,但拼命尝试应用ASCII编解码器。删除
.encode('utf-8')
,你应该会没事的


另请参见“纯文本”是什么意思?文件中有什么编码?解码然后立即编码有什么意义?我猜删除
.encode('utf-8'))
会解决您的问题。您好,tripleee,非常感谢您的帮助!确实删除了编码,非常感谢:)我再次解码和编码的原因是因为我读了这篇文章,并且“纯文本”的编解码器已经是utf-8,如您在convert_pdf_to_txt()中所见.这就是为什么我感到困惑的部分原因,因为即使是解码也不应该是必要的,但它仍然是。非常感谢!;)