中世纪字符的 UnicodeDecodeError
UnicodeDecodeError for medieval characters
我正在尝试 运行 中世纪文本的 nltk 标记化程序。这些文本使用中世纪字符,例如 yogh (ş)、thorn (þ) 和 eth (ð)。
当我 运行 使用标准 unicode (utf-8) 编码的程序(粘贴在下面)时,出现以下错误:
Traceback (most recent call last):
File "me_scraper_redux2.py", line 11, in <module>
tokens = nltk.word_tokenize( open( "ME_Corpus_sm/"+file, encoding="utf_8" ).read() )
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/codecs.py", line 313, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 3131: invalid start byte
我试过其他编码,如latin1等,这些都绕过了这个问题,但后来我没有得到准确的结果,因为这些编码使用其他字符来填充space。我认为 unicode 可以处理这些字符。我做错了什么,还是我应该使用另一种编码?这些文件最初是 utf-8 格式的。
请参阅下面的代码:
import nltk
import os, os.path
import string
from nltk import word_tokenize
from nltk.corpus import stopwords
files = os.listdir("ME_Corpus_sm/")
for file in files:
# open, parse, and normalize the tokens (words) in the file
tokens = nltk.word_tokenize( open( "ME_Corpus_sm/"+file, encoding="utf_8" ).read() )
tokens = [ token.lower() for token in tokens ]
tokens = [ ''.join( character for character in token if character not in string.punctuation ) for token in tokens ]
tokens = [ token for token in tokens if token.isalpha() ]
tokens = [ token for token in tokens if not token in stopwords.words( 'english' ) ]
# output maximum most frequent tokens and their counts
for tuple in nltk.FreqDist( tokens ).most_common( 50 ):
word = tuple[ 0 ]
count = str( tuple[ 1 ] )
print(word + "\t" + count)
您的文件不是有效的 UTF-8。
也许它部分是 UTF-8,部分是其他垃圾?你可以试试:
open(..., encoding='utf-8', errors='replace')
将非 UTF-8 序列替换为问号而不是引发错误,这可能会让您有机会查看问题出在哪里。一般来说,如果您在单个文件中混合使用多种编码,那么您就注定要失败,因为无法可靠地将它们分开。
我正在尝试 运行 中世纪文本的 nltk 标记化程序。这些文本使用中世纪字符,例如 yogh (ş)、thorn (þ) 和 eth (ð)。
当我 运行 使用标准 unicode (utf-8) 编码的程序(粘贴在下面)时,出现以下错误:
Traceback (most recent call last):
File "me_scraper_redux2.py", line 11, in <module>
tokens = nltk.word_tokenize( open( "ME_Corpus_sm/"+file, encoding="utf_8" ).read() )
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/codecs.py", line 313, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 3131: invalid start byte
我试过其他编码,如latin1等,这些都绕过了这个问题,但后来我没有得到准确的结果,因为这些编码使用其他字符来填充space。我认为 unicode 可以处理这些字符。我做错了什么,还是我应该使用另一种编码?这些文件最初是 utf-8 格式的。 请参阅下面的代码:
import nltk
import os, os.path
import string
from nltk import word_tokenize
from nltk.corpus import stopwords
files = os.listdir("ME_Corpus_sm/")
for file in files:
# open, parse, and normalize the tokens (words) in the file
tokens = nltk.word_tokenize( open( "ME_Corpus_sm/"+file, encoding="utf_8" ).read() )
tokens = [ token.lower() for token in tokens ]
tokens = [ ''.join( character for character in token if character not in string.punctuation ) for token in tokens ]
tokens = [ token for token in tokens if token.isalpha() ]
tokens = [ token for token in tokens if not token in stopwords.words( 'english' ) ]
# output maximum most frequent tokens and their counts
for tuple in nltk.FreqDist( tokens ).most_common( 50 ):
word = tuple[ 0 ]
count = str( tuple[ 1 ] )
print(word + "\t" + count)
您的文件不是有效的 UTF-8。
也许它部分是 UTF-8,部分是其他垃圾?你可以试试:
open(..., encoding='utf-8', errors='replace')
将非 UTF-8 序列替换为问号而不是引发错误,这可能会让您有机会查看问题出在哪里。一般来说,如果您在单个文件中混合使用多种编码,那么您就注定要失败,因为无法可靠地将它们分开。