首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UnicodeDecodeError:'utf-8‘编解码器无法解码0位置的字节0x80 :读取文本文件时开始字节无效

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

Stack Overflow用户
提问于 2020-10-26 15:48:02
回答 1查看 820关注 0票数 1

我正在训练一个word2vec模型,使用大约700个文本文件作为我的语料库。但是,当我在预处理步骤之后开始读取文件时,我会得到上述错误。代码如下

代码语言:javascript
复制
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')

我得到的错误是:

代码语言:javascript
复制
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函数并以块的形式发送数据时,我在读取文本文件时没有收到错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-26 16:30:14

看起来您的一个文件没有正确的utf-8-encoded文本。

(您的Word2Vec-related代码可能根本不需要命中错误。您可能会使用just:sentences_list = list(MyCorpus())触发相同的错误。

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

  1. 更改您的MyCorpus类,以便它在尝试读取它之前打印每个文件的路径。
  2. read周围添加一条Python try: ... except UnicodeDecodeError: ...语句,当异常被捕获时,打印违规的文件名.

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

也许它们实际上不是在utf-8编码中,在这种情况下,您将指定一个不同的encoding

也许只有一个或少数有问题,只要打印他们的名字供以后的调查,并跳过他们。(您可以使用上面的异常处理方法来做到这一点。)

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

另外,当您解决编码问题时,您的可迭代MyCorpus还没有返回Word2Vec类所期望的惠特。

它不需要全文纯文本字符串。它需要这些文本已经被分解成单独的文字标记。

(通常,简单地在字符串上执行.split()是足够真实的标记化,可以尝试作为一个起点,但是通常,项目使用一些更复杂的标点符号标记化。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64540488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档