UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte while reading a text file
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte while reading a text file
我正在训练一个 word2vec 模型,使用大约 700 个文本文件作为我的语料库。但是,当我在预处理步骤后开始读取文件时,出现了上述错误。代码如下
class MyCorpus(object):
def __iter__(self):
for i in ceo_path: /// ceo_path contains abs path of all text files
file = open(i, 'r', encoding='utf-8')
text = file.read()
###########
########### /// text preprocessing steps
###########
yield final_text /// returns preprocessed text
sentences = MyCorpus()
logging.basicConfig(format="%(levelname)s - %(asctime)s: %(message)s", datefmt= '%H:%M:%S', level=logging.INFO)
# training the model
cores = multiprocessing.cpu_count()
w2v_model = Word2Vec(min_count=5,
iter=30,
window=3,
size=200,
sample=6e-5,
alpha=0.025,
min_alpha=0.0001,
negative=20,
workers=cores-1,
sg=1)
w2v_model.build_vocab(sentences)
w2v_model.train(sentences, total_examples=w2v_model.corpus_count, epochs=30, report_delay=1)
w2v_model.save('ceo1.model')
我得到的错误是:
Traceback (most recent call last):
File "C:/Users/name/PycharmProjects/prac2/hbs_word2vec.py", line 131, in <module>
w2v_model.build_vocab(sentences)
File "C:\Users\name\PycharmProjects\prac1\venv\lib\site-packages\gensim\models\base_any2vec.py", line 921, in build_vocab
total_words, corpus_count = self.vocabulary.scan_vocab(
File "C:\Users\name\PycharmProjects\prac1\venv\lib\site-packages\gensim\models\word2vec.py", line 1403, in scan_vocab
total_words, corpus_count = self._scan_vocab(sentences, progress_per, trim_rule)
File "C:\Users\name\PycharmProjects\prac1\venv\lib\site-packages\gensim\models\word2vec.py", line 1372, in _scan_vocab
for sentence_no, sentence in enumerate(sentences):
File "C:/Users/name/PycharmProjects/prac2/hbs_word2vec.py", line 65, in __iter__
text = file.read()
File "C:\Users\name\AppData\Local\Programs\Python\Python38-32\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
我不了解这个错误,因为我是新手。当我没有使用 iter 函数并像我目前所做的那样以块的形式发送数据时,我在读取文本文件时没有遇到错误。
您的某个文件似乎没有正确的 utf-8
编码文本。
(您的 Word2Vec
相关代码可能根本不是命中错误所必需的。您可能只需要触发相同的错误:sentences_list = list(MyCorpus())
。)
要查找哪个文件,可能有两种不同的可能性:
- 更改您的
MyCorpus
class 以便它在尝试读取文件之前打印每个文件的路径。
- 在
read
周围添加一个 Python try: ... except UnicodeDecodeError: ...
语句,当捕获到异常时,打印有问题的文件名。
了解所涉及的文件后,您可能想要修复该文件,或更改代码以处理您拥有的文件。
也许它们并不是真正的 utf-8
编码,在这种情况下,您需要指定一个不同的 encoding
。
也许只有一个或几个有问题,打印他们的名字以供以后调查就可以了,并跳过它们。 (您可以使用上面的 exception-handling 方法来做到这一点。)
也许,那些不是 utf-8
的总是在其他一些 platform-specific 编码中,所以当 utf-8
失败时,您可以尝试第二种编码。
另外,当您解决编码问题时,您的可迭代对象 MyCorpus
尚未返回 Word2Vec
class 所期望的状态。
它不需要全文纯字符串。它需要这些文本已经被分解成单独的 word-tokens.
(通常,简单地对字符串执行 .split()
是 close-enough-to-real-tokenization 尝试作为起点,但通常,项目使用一些 more-sophisticated punctuation-aware 标记化。 )
我正在训练一个 word2vec 模型,使用大约 700 个文本文件作为我的语料库。但是,当我在预处理步骤后开始读取文件时,出现了上述错误。代码如下
class MyCorpus(object):
def __iter__(self):
for i in ceo_path: /// ceo_path contains abs path of all text files
file = open(i, 'r', encoding='utf-8')
text = file.read()
###########
########### /// text preprocessing steps
###########
yield final_text /// returns preprocessed text
sentences = MyCorpus()
logging.basicConfig(format="%(levelname)s - %(asctime)s: %(message)s", datefmt= '%H:%M:%S', level=logging.INFO)
# training the model
cores = multiprocessing.cpu_count()
w2v_model = Word2Vec(min_count=5,
iter=30,
window=3,
size=200,
sample=6e-5,
alpha=0.025,
min_alpha=0.0001,
negative=20,
workers=cores-1,
sg=1)
w2v_model.build_vocab(sentences)
w2v_model.train(sentences, total_examples=w2v_model.corpus_count, epochs=30, report_delay=1)
w2v_model.save('ceo1.model')
我得到的错误是:
Traceback (most recent call last):
File "C:/Users/name/PycharmProjects/prac2/hbs_word2vec.py", line 131, in <module>
w2v_model.build_vocab(sentences)
File "C:\Users\name\PycharmProjects\prac1\venv\lib\site-packages\gensim\models\base_any2vec.py", line 921, in build_vocab
total_words, corpus_count = self.vocabulary.scan_vocab(
File "C:\Users\name\PycharmProjects\prac1\venv\lib\site-packages\gensim\models\word2vec.py", line 1403, in scan_vocab
total_words, corpus_count = self._scan_vocab(sentences, progress_per, trim_rule)
File "C:\Users\name\PycharmProjects\prac1\venv\lib\site-packages\gensim\models\word2vec.py", line 1372, in _scan_vocab
for sentence_no, sentence in enumerate(sentences):
File "C:/Users/name/PycharmProjects/prac2/hbs_word2vec.py", line 65, in __iter__
text = file.read()
File "C:\Users\name\AppData\Local\Programs\Python\Python38-32\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
我不了解这个错误,因为我是新手。当我没有使用 iter 函数并像我目前所做的那样以块的形式发送数据时,我在读取文本文件时没有遇到错误。
您的某个文件似乎没有正确的 utf-8
编码文本。
(您的 Word2Vec
相关代码可能根本不是命中错误所必需的。您可能只需要触发相同的错误:sentences_list = list(MyCorpus())
。)
要查找哪个文件,可能有两种不同的可能性:
- 更改您的
MyCorpus
class 以便它在尝试读取文件之前打印每个文件的路径。 - 在
read
周围添加一个 Pythontry: ... except UnicodeDecodeError: ...
语句,当捕获到异常时,打印有问题的文件名。
了解所涉及的文件后,您可能想要修复该文件,或更改代码以处理您拥有的文件。
也许它们并不是真正的 utf-8
编码,在这种情况下,您需要指定一个不同的 encoding
。
也许只有一个或几个有问题,打印他们的名字以供以后调查就可以了,并跳过它们。 (您可以使用上面的 exception-handling 方法来做到这一点。)
也许,那些不是 utf-8
的总是在其他一些 platform-specific 编码中,所以当 utf-8
失败时,您可以尝试第二种编码。
另外,当您解决编码问题时,您的可迭代对象 MyCorpus
尚未返回 Word2Vec
class 所期望的状态。
它不需要全文纯字符串。它需要这些文本已经被分解成单独的 word-tokens.
(通常,简单地对字符串执行 .split()
是 close-enough-to-real-tokenization 尝试作为起点,但通常,项目使用一些 more-sophisticated punctuation-aware 标记化。 )