/ / UnicodeDecodeError dla znaków średniowiecznych - python, unicode, encoding, utf-8, nltk

UnicodeDecodeError dla średniowiecznych znaków - python, unicode, encoding, utf-8, nltk

Próbuję uruchomić program tokenizacji nltk na średniowiecznych tekstach. Te teksty używają średniowiecznych postaci, takich jak yogh (ȝ), cierń (þ) i eth (ð).

Po uruchomieniu programu (wklejonego poniżej) za pomocą standardowego kodowania Unicode (utf-8) pojawia się następujący błąd:

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

Próbowałem innych kodowań, takich jak latin1, itp., a te omijają problem, ale wtedy nie uzyskuję dokładnych wyników, ponieważ te kodowania wykorzystują inne znaki do wypełnienia przestrzeni.Myślę, że unicode poradzi sobie z tymi znakami.Czy robię coś nie tak, czy jest inne kodowanie, które powinienem użyć Pliki były pierwotnie w utf-8. Zobacz mój kod poniżej:

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)

Odpowiedzi:

1 dla odpowiedzi № 1

Twój plik nie jest prawidłowy utf-8.

Może to częściowo utf-8, a częściowo inne śmieci? Możesz spróbować:

open(..., encoding="utf-8", errors="replace")

do zastąpienia sekwencji non-utf-8 pytaniemznaki zamiast podnosić błąd, który może dać ci szansę zobaczenia, gdzie leży problem. Ogólnie rzecz biorąc, jeśli masz mieszankę kodowań w jednym pliku, jesteś prawie skazany na zagładę, ponieważ nie można ich skutecznie rozdzielić.