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 № 1Twó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ć.