【问题标题】:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte while reading a text fileUnicodeDecodeError:“utf-8”编解码器无法解码位置 0 的字节 0x80:读取文本文件时起始字节无效
【发布时间】:2020-10-27 00:30:14
【问题描述】:

我正在训练一个 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 函数并像现在这样以块的形式发送数据时,我在读取文本文件时没有收到错误。

【问题讨论】:

    标签: python-3.x gensim word2vec


    【解决方案1】:

    您的某个文件似乎没有正确的utf-8 编码文本。

    (您的Word2Vec 相关代码可能根本不需要遇到错误。您可能会触发相同的错误:sentences_list = list(MyCorpus())。)

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 是的!这种方法奏效了。中间有一个 .model 文件。谢谢!
    • 另外,运行以下代码后出现内存错误,您能解释一下为什么以及如何处理它吗?谢谢!
    • 如果您有单独的内存错误,您应该发布一个单独的问题,详细说明它是如何触发的。甚至没有错误消息/堆栈,真的无法猜测这里发生了什么!
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2023-02-07
    • 1970-01-01
    • 2020-09-22
    • 2021-12-01
    • 2016-05-13
    • 2020-02-06
    • 2017-09-27
    相关资源
    最近更新 更多