UnicodeDecodeError: кодек "utf-8" не может декодировать байт 0x80
Есть много подобных вопросов, и я попробовал каждое возможное решение, но, кажется, не могу решить его. Это мой код, и я работаю над распознаванием имен с помощью Stanford Tagger.
from nltk.tag import StanfordNERTagger
st = StanfordNERTagger('stanford-ner\classifiers\english.all.3class.distsim.crf.ser.gz',
'stanford-ner\stanford-ner.jar', encoding='utf-8')
tuple_list = st.tag("Please pay €94 million.".split())
print(tuple_list)
Это ошибка, которую я получаю.
Traceback (most recent call last):
File "C:/Users/Dell/PycharmProjects/CSSOP/ner2.py", line 4, in <module>
tuple_list = st.tag("He was the subject of the most expensive association football transfer when he moved from Manchester United to Real Madrid in 2009 in a transfer worth €94 million ($132 million).".split())
File "C:\ProgramData\Anaconda3\lib\site-packages\nltk\tag\stanford.py", line 71, in tag
return sum(self.tag_sents([tokens]), [])
File "C:\ProgramData\Anaconda3\lib\site-packages\nltk\tag\stanford.py", line 95, in tag_sents
stanpos_output = stanpos_output.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 247: invalid start byte
Изменить: Это не проблема кодировки открытия файла, как указано в другом подобном вопросе.
1 ответ
Вы получаете ошибку декодирования, когда nltk
Стэнфордская обертка пытается прочитать обратно в выводе Стэнфордского распознавателя (который является Java-программой). Очевидно, что распознаватель сумел создать недействительный utf-8
файл. Очевидно, он не проверяет данные, которые вы передаете, до того, как записывает их, поэтому проблема обнаруживается только тогда, когда Python пытается прочитать их обратно.
Теперь, в самом верху этой таблицы вы увидите, что 0x80
Вот как кодовая страница Windows 1252 кодирует символ евро. Смысл ясен: ваш источник Python использует кодировку Windows 1252, так что именно это содержит ваш строковый литерал. Правильным решением здесь было бы переключить ваш редактор на использование UTF-8 и исправить кодировку вашей программы.
Такое поведение будет иметь смысл, если вы используете Python 2; но ваш фрагмент выглядит как Python 3 (функциональная форма print
), поэтому, пожалуйста, уточните, прежде чем я решу альтернативное решение.