问题描述
我正在训练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
类,以便在尝试读取每个文件之前先打印每个文件的路径。 - 在
try: ... except UnicodeDecodeError: ...
周围添加Pythonread
语句,并在捕获到异常时,打印有问题的文件名。
一旦您知道所涉及的文件,您可能想要修复该文件或更改代码以能够处理您拥有的文件。
也许它们不是真的采用utf-8
编码,在这种情况下,您需要指定其他encoding
。
也许只有一个或几个出现问题,可以只打印它们的名称以供以后调查,然后跳过它们。 (您可以使用上面的异常处理方法来做到这一点。)
也许,不是utf-8
的那些总是使用其他特定于平台的编码,因此当utf-8
失败时,您可以尝试第二种编码。
另外,当您解决编码问题时,可迭代的MyCorpus
尚未返回Word2Vec
类期望的结果。
它不需要全文文本字符串。它需要将这些文本分解成单独的单词标记。
(通常,仅对字符串执行.split()
就可以接近实际的令牌化了,以此作为起点,但通常情况下,项目会使用一些更先进的标点符号感知令牌化。)