解决在使用gensim.models.word2vec.LineSentence加载语料库时报错 UnicodeDecodeError: 'utf-8' codec can't decode byte......的问题
在window下使用gemsim.models.word2vec.LineSentence加载中文维基百科语料库(已分词)时报如下错误:
- UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 0: invalid continuation byte
这种编码问题真的很让人头疼,这种问题都是出现在xxx.decode("utf-8")的时候,所以接下来我们来看看gensim中的源码:
- class LineSentence(object):
- """Iterate over a file that contains sentences: one line = one sentence.
- Words must be already preprocessed and separated by whitespace.
- """
- def __init__(self, source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None):
- """
- Parameters
- ----------
- source : string or a file-like object
- Path to the file on disk, or an already-open file object (must support `seek(0)`).
- limit : int or None
- Clip the file to the first `limit` lines. Do no clipping if `limit is None` (the default).
- Examples
- --------
- .. sourcecode:: pycon
- >>> from gensim.test.utils import datapath
- >>> sentences = LineSentence(datapath('lee_background.cor'))
- >>> for sentence in sentences:
- ... pass
- """
- self.source = source
- self.max_sentence_length = max_sentence_length
- self.limit = limit
- def __iter__(self):
- """Iterate through the lines in the source."""
- try:
- # Assume it is a file-like object and try treating it as such
- # Things that don't have seek will trigger an exception
- self.source.seek(0)
- for line in itertools.islice(self.source, self.limit):
- line = utils.to_unicode(line).split()
- i = 0
- while i < len(line):
- yield line[i: i + self.max_sentence_length]
- i += self.max_sentence_length
- except AttributeError:
- # If it didn't work like a file, use it as a string filename
- with utils.smart_open(self.source) as fin:
- for line in itertools.islice(fin, self.limit):
- line = utils.to_unicode(line).split()
- i = 0
- while i < len(line):
- yield line[i: i + self.max_sentence_length]
- i += self.max_sentence_length
从源码中可以看到__iter__方法让LineSentence成为了一个可迭代的对象,而且文件读取的方法也都定义在__iter__方法中。一般我们输入的source参数都是一个文件路径(也就是一个字符串形式),因此在try时,self.source.seek(0)会报“字符串没有seek方法”的错,所以真正执行的代码是在except中。
接下来我们有两种方法来解决我们的问题:
1)from gensim import utils
utils.samrt_open(url, mode="rb", **kw)
在源码中用utils.smart_open()方法打开文件时默认是用二进制的形式打开的,可以将mode=“rb” 改成mode=“r”。
2)from gensim import utils
utils.to_unicode(text, encoding='utf8', errors='strict')
在源码中在decode("utf8")时,其默认errors=“strict”, 可以将其改成errors="ignore"。即utils.to_unicode(line, errors="ignore")
不过建议大家不要直接在源码上修改,可以直接将源码复制下来,例如:
- import logging
- import itertools
- import gensim
- from gensim.models import word2vec
- from gensim import utils
- logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
- class LineSentence(object):
- """Iterate over a file that contains sentences: one line = one sentence.
- Words must be already preprocessed and separated by whitespace.
- """
- def __init__(self, source, max_sentence_length=10000, limit=None):
- """
- Parameters
- ----------
- source : string or a file-like object
- Path to the file on disk, or an already-open file object (must support `seek(0)`).
- limit : int or None
- Clip the file to the first `limit` lines. Do no clipping if `limit is None` (the default).
- Examples
- --------
- .. sourcecode:: pycon
- >>> from gensim.test.utils import datapath
- >>> sentences = LineSentence(datapath('lee_background.cor'))
- >>> for sentence in sentences:
- ... pass
- """
- self.source = source
- self.max_sentence_length = max_sentence_length
- self.limit = limit
- def __iter__(self):
- """Iterate through the lines in the source."""
- try:
- # Assume it is a file-like object and try treating it as such
- # Things that don't have seek will trigger an exception
- self.source.seek(0)
- for line in itertools.islice(self.source, self.limit):
- line = utils.to_unicode(line).split()
- i = 0
- while i < len(line):
- yield line[i: i + self.max_sentence_length]
- i += self.max_sentence_length
- except AttributeError:
- # If it didn't work like a file, use it as a string filename
- with utils.smart_open(self.source, mode="r") as fin:
- for line in itertools.islice(fin, self.limit):
- line = utils.to_unicode(line).split()
- i = 0
- while i < len(line):
- yield line[i: i + self.max_sentence_length]
- i += self.max_sentence_length
- our_sentences = LineSentence("./zhwiki_token.txt")
- model = gensim.models.Word2Vec(our_sentences, size=200, iter=30) # 大语料,用CBOW,适当的增大迭代次数
- # model.save(save_model_file)
- model.save("./mathWord2Vec" + ".model") # 以该形式保存模型以便之后可以继续增量训练
解决在使用gensim.models.word2vec.LineSentence加载语料库时报错 UnicodeDecodeError: 'utf-8' codec can't decode byte......的问题的更多相关文章
- VS加载项目时报错 尚未配置为Web项目XXXX指定的本地IIS
网上找的几个方法都不行 最后自己解决了.首先打开该项目得csproj文件,找到<ProjectExtensions>这个标签,是在最后部分,然后把<UseIIS>True< ...
- OpenCV使用:加载图片时报错 0x00007FFC1084A839 处(位于 test1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x00000026ABAFF1A8 处。
加载图片代码为: #include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...
- Visual studio加载项目时报错 尚未配置为Web项目XXXX指定的本地IIS,需要配置虚拟目录。解决办法。
在SVN上下载工程项目.使用visual studio打开时,出现如下提示: 查找相关资料,解决办法如下: 使用记事本打开工程目录下的.csproj文件.把<UseIIS>False< ...
- 解决vs2013下创建的python文件,到其他平台(如linux)下中文乱码(或运行时报SyntaxError: (unicode error) 'utf-8' codec can't decode byte...)
Vs2013中创建python文件,在文件中没输入中文时,编码为utf-8的,如图 接着,在里面输入几行中文后,再次用notepad++查看其编码如下,在vs下运行也报错(用cmd运行就不会): 根据 ...
- moviepy用VideoFileClip加载视频时报UnicodeDecodeError: utf-8 codec cant decode byte invalid start byte错误
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 使用moviepy用: clip1 = Video ...
- 【技术贴】第二篇 :解决使用maven jetty启动后无法加载修改过后的静态资源
之前写过第一篇:[技术贴]解决使用maven jetty启动后无法加载修改过后的静态资源 一直用着挺舒服的,直到今天,出现了又不能修改静态js,jsp等资源的现象.很是苦闷. 经过调错处理之后,发现是 ...
- 解决Vue刷新一瞬间出现样式未加载完或者出现Vue代码问题
解决Vue刷新一瞬间出现样式未加载完或者出现Vue代码问题: <style> [v-cloak]{ display: none; } </style> <div id=& ...
- 解决Torch.load()错误信息: UnicodeDecodeError: 'ascii' codec can't decode byte 0x8d in position 0: ordinal not in range(128)
使用PyTorch跑pretrained预训练模型的时候,发现在加载数据的时候会报错,具体错误信息如下: File "main.py", line 238, in main_wor ...
- moviepy用VideoFileClip加载视频时报UnicodeDecodeError: codec cant decode ,No mapping character 错误
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 昨天处理视频时出现了解码错误,通过修改ffmpeg ...
随机推荐
- Linux iptables用法与NAT
1.相关概念 2.iptables相关用法 3.NAT(DNAT与SNAT) 相关概念 防火墙除了软件及硬件的分类,也可对数据封包的取得方式来分类,可分为代理服务器(Proxy)及封包过滤机制(IP ...
- 如何在你的项目中集成 CAP【手把手视频教程】
前言 之前录制过一期关于CAP的视频,但是由于当时是直播时录制的视频,背景音比较杂所以质量有点差.这次的视频没有直播,直接录制的,视频质量会好很多,第一遍录制完成之后发现播放到一半没有声音,所以又重新 ...
- 宝塔面板设置腾迅COS自动备份网站
之前写了如何配置腾迅云COS并挂载到服务器中,今天看到宝塔面板中有腾迅云COS的插件,不过研究了下,只是将COS绑定在宝塔面板中,不能自动备份,需要用到宝塔的计划任务功能 1.下载腾迅云COS插件 2 ...
- Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!
目录 01 简介 02 tcpdump 命令选项 03 过滤器 04 常用操作 4.1 抓取某主机的数据包 4.2 抓取某端口的数据包 4.3 抓取某网络(网段)的数据包 4.4 抓取某协议的数据包 ...
- 限定项目的 Node.js 版本
限定项目运行所需的 Node.js 版本可保证项目在一个稳定可预期的环境中运行,减少不必要的故障.甚至有些依赖库只能工作于某些版本下.同时,不加以限制的话,在多人合作的项目中恐怕会引起环境不一致带来的 ...
- Linux 中查看进程及资源使用情况
top 自带的 top 命令类似于平时我们使用的任务管理器,能够列出当前系统中的进程及资源的使用情况. $ man top top - display Linux tasks 使用起来很简单,不加任何 ...
- dev Gridcontrol控件属性部分
XtraGrid的关键类就是:GridControl和GridView.GridControl本身不显示数据,数据都是显示在GridView/CardView/XXXXView中.GridContro ...
- Windows10下安装Docker的步骤
一.启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图: 点击确定后,启用完毕会提示重启系统,我们可以稍后再重启. 二.安装 ...
- Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控
前言 作为一名 Java 开发者,相信对 JDBC(Java Data Base Connectivity)是不会陌生的,JDBC作为 Java 基础内容,它提供了一种基准,据此可以构建更高级的工具和 ...
- python 文件和目录操作题库
1. 把一个目录下所有的文件删除,在所有的目录下新建一个a.txt的文件,并在文件下写入"python"关键字. 解题思路: 1.如果目录存在则切换进入目录 ...