UnicodeDecodeError:'utf-8'编解码器无法在位置0解码字节0x80:读取文本文件时无效的起始字节

问题描述

我正在训练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())即可触发相同的错误。)

要查找哪个文件,可能有两种不同的可能性:

  1. 更改您的MyCorpus类,以便在尝试读取每个文件之前先打印每个文件的路径。
  2. try: ... except UnicodeDecodeError: ...周围添加Python read语句,并在捕获到异常时,打印有问题的文件名。

一旦您知道所涉及的文件,您可能想要修复该文件或更改代码以能够处理您拥有的文件。

也许它们不是真的采用utf-8编码,在这种情况下,您需要指定其他encoding

也许只有一个或几个出现问题,可以只打印它们的名称以供以后调查,然后跳过它们。 (您可以使用上面的异常处理方法来做到这一点。)

也许,不是utf-8的那些总是使用其他特定于平台的编码,因此当utf-8失败时,您可以尝试第二种编码。

另外,当您解决编码问题时,可迭代的MyCorpus尚未返回Word2Vec类期望的结果。

它不需要全文文本字符串。它需要将这些文本分解成单独的单词标记。

(通常,仅对字符串执行.split()就可以接近实际的令牌化了,以此作为起点,但通常情况下,项目会使用一些更先进的标点符号感知令牌化。)