在window下使用gemsim.models.word2vec.LineSentence加载中文维基百科语料库(已分词)时报如下错误:

  1. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 0: invalid continuation byte

  这种编码问题真的很让人头疼,这种问题都是出现在xxx.decode("utf-8")的时候,所以接下来我们来看看gensim中的源码:

  1. class LineSentence(object):
  2. """Iterate over a file that contains sentences: one line = one sentence.
  3. Words must be already preprocessed and separated by whitespace.
  4.  
  5. """
  6. def __init__(self, source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None):
  7. """
  8.  
  9. Parameters
  10. ----------
  11. source : string or a file-like object
  12. Path to the file on disk, or an already-open file object (must support `seek(0)`).
  13. limit : int or None
  14. Clip the file to the first `limit` lines. Do no clipping if `limit is None` (the default).
  15.  
  16. Examples
  17. --------
  18. .. sourcecode:: pycon
  19.  
  20. >>> from gensim.test.utils import datapath
  21. >>> sentences = LineSentence(datapath('lee_background.cor'))
  22. >>> for sentence in sentences:
  23. ... pass
  24.  
  25. """
  26. self.source = source
  27. self.max_sentence_length = max_sentence_length
  28. self.limit = limit
  29.  
  30. def __iter__(self):
  31. """Iterate through the lines in the source."""
  32. try:
  33. # Assume it is a file-like object and try treating it as such
  34. # Things that don't have seek will trigger an exception
  35. self.source.seek(0)
  36. for line in itertools.islice(self.source, self.limit):
  37. line = utils.to_unicode(line).split()
  38. i = 0
  39. while i < len(line):
  40. yield line[i: i + self.max_sentence_length]
  41. i += self.max_sentence_length
  42. except AttributeError:
  43. # If it didn't work like a file, use it as a string filename
  44. with utils.smart_open(self.source) as fin:
  45. for line in itertools.islice(fin, self.limit):
  46. line = utils.to_unicode(line).split()
  47. i = 0
  48. while i < len(line):
  49. yield line[i: i + self.max_sentence_length]
  50. 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")

  不过建议大家不要直接在源码上修改,可以直接将源码复制下来,例如:

  1. import logging
  2. import itertools
  3. import gensim
  4. from gensim.models import word2vec
  5. from gensim import utils
  6.  
  7. logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
  8.  
  9. class LineSentence(object):
  10. """Iterate over a file that contains sentences: one line = one sentence.
  11. Words must be already preprocessed and separated by whitespace.
  12.  
  13. """
  14. def __init__(self, source, max_sentence_length=10000, limit=None):
  15. """
  16.  
  17. Parameters
  18. ----------
  19. source : string or a file-like object
  20. Path to the file on disk, or an already-open file object (must support `seek(0)`).
  21. limit : int or None
  22. Clip the file to the first `limit` lines. Do no clipping if `limit is None` (the default).
  23.  
  24. Examples
  25. --------
  26. .. sourcecode:: pycon
  27.  
  28. >>> from gensim.test.utils import datapath
  29. >>> sentences = LineSentence(datapath('lee_background.cor'))
  30. >>> for sentence in sentences:
  31. ... pass
  32.  
  33. """
  34. self.source = source
  35. self.max_sentence_length = max_sentence_length
  36. self.limit = limit
  37.  
  38. def __iter__(self):
  39. """Iterate through the lines in the source."""
  40. try:
  41. # Assume it is a file-like object and try treating it as such
  42. # Things that don't have seek will trigger an exception
  43. self.source.seek(0)
  44. for line in itertools.islice(self.source, self.limit):
  45. line = utils.to_unicode(line).split()
  46. i = 0
  47. while i < len(line):
  48. yield line[i: i + self.max_sentence_length]
  49. i += self.max_sentence_length
  50. except AttributeError:
  51. # If it didn't work like a file, use it as a string filename
  52. with utils.smart_open(self.source, mode="r") as fin:
  53. for line in itertools.islice(fin, self.limit):
  54. line = utils.to_unicode(line).split()
  55. i = 0
  56. while i < len(line):
  57. yield line[i: i + self.max_sentence_length]
  58. i += self.max_sentence_length
  59.  
  60. our_sentences = LineSentence("./zhwiki_token.txt")
  61. model = gensim.models.Word2Vec(our_sentences, size=200, iter=30) # 大语料,用CBOW,适当的增大迭代次数
  62. # model.save(save_model_file)
  63. model.save("./mathWord2Vec" + ".model") # 以该形式保存模型以便之后可以继续增量训练

解决在使用gensim.models.word2vec.LineSentence加载语料库时报错 UnicodeDecodeError: 'utf-8' codec can't decode byte......的问题的更多相关文章

  1. VS加载项目时报错 尚未配置为Web项目XXXX指定的本地IIS

    网上找的几个方法都不行 最后自己解决了.首先打开该项目得csproj文件,找到<ProjectExtensions>这个标签,是在最后部分,然后把<UseIIS>True< ...

  2. OpenCV使用:加载图片时报错 0x00007FFC1084A839 处(位于 test1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x00000026ABAFF1A8 处。

    加载图片代码为: #include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...

  3. Visual studio加载项目时报错 尚未配置为Web项目XXXX指定的本地IIS,需要配置虚拟目录。解决办法。

    在SVN上下载工程项目.使用visual studio打开时,出现如下提示: 查找相关资料,解决办法如下: 使用记事本打开工程目录下的.csproj文件.把<UseIIS>False< ...

  4. 解决vs2013下创建的python文件,到其他平台(如linux)下中文乱码(或运行时报SyntaxError: (unicode error) 'utf-8' codec can't decode byte...)

    Vs2013中创建python文件,在文件中没输入中文时,编码为utf-8的,如图 接着,在里面输入几行中文后,再次用notepad++查看其编码如下,在vs下运行也报错(用cmd运行就不会): 根据 ...

  5. moviepy用VideoFileClip加载视频时报UnicodeDecodeError: utf-8 codec cant decode byte invalid start byte错误

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 使用moviepy用: clip1 = Video ...

  6. 【技术贴】第二篇 :解决使用maven jetty启动后无法加载修改过后的静态资源

    之前写过第一篇:[技术贴]解决使用maven jetty启动后无法加载修改过后的静态资源 一直用着挺舒服的,直到今天,出现了又不能修改静态js,jsp等资源的现象.很是苦闷. 经过调错处理之后,发现是 ...

  7. 解决Vue刷新一瞬间出现样式未加载完或者出现Vue代码问题

    解决Vue刷新一瞬间出现样式未加载完或者出现Vue代码问题: <style> [v-cloak]{ display: none; } </style> <div id=& ...

  8. 解决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 ...

  9. moviepy用VideoFileClip加载视频时报UnicodeDecodeError: codec cant decode ,No mapping character 错误

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 昨天处理视频时出现了解码错误,通过修改ffmpeg ...

随机推荐

  1. Linux iptables用法与NAT

    1.相关概念 2.iptables相关用法 3.NAT(DNAT与SNAT) 相关概念 防火墙除了软件及硬件的分类,也可对数据封包的取得方式来分类,可分为代理服务器(Proxy)及封包过滤机制(IP ...

  2. 如何在你的项目中集成 CAP【手把手视频教程】

    前言 之前录制过一期关于CAP的视频,但是由于当时是直播时录制的视频,背景音比较杂所以质量有点差.这次的视频没有直播,直接录制的,视频质量会好很多,第一遍录制完成之后发现播放到一半没有声音,所以又重新 ...

  3. 宝塔面板设置腾迅COS自动备份网站

    之前写了如何配置腾迅云COS并挂载到服务器中,今天看到宝塔面板中有腾迅云COS的插件,不过研究了下,只是将COS绑定在宝塔面板中,不能自动备份,需要用到宝塔的计划任务功能 1.下载腾迅云COS插件 2 ...

  4. Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!

    目录 01 简介 02 tcpdump 命令选项 03 过滤器 04 常用操作 4.1 抓取某主机的数据包 4.2 抓取某端口的数据包 4.3 抓取某网络(网段)的数据包 4.4 抓取某协议的数据包 ...

  5. 限定项目的 Node.js 版本

    限定项目运行所需的 Node.js 版本可保证项目在一个稳定可预期的环境中运行,减少不必要的故障.甚至有些依赖库只能工作于某些版本下.同时,不加以限制的话,在多人合作的项目中恐怕会引起环境不一致带来的 ...

  6. Linux 中查看进程及资源使用情况

    top 自带的 top 命令类似于平时我们使用的任务管理器,能够列出当前系统中的进程及资源的使用情况. $ man top top - display Linux tasks 使用起来很简单,不加任何 ...

  7. dev Gridcontrol控件属性部分

    XtraGrid的关键类就是:GridControl和GridView.GridControl本身不显示数据,数据都是显示在GridView/CardView/XXXXView中.GridContro ...

  8. Windows10下安装Docker的步骤

    一.启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图: 点击确定后,启用完毕会提示重启系统,我们可以稍后再重启. 二.安装 ...

  9. Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控

    前言 作为一名 Java 开发者,相信对 JDBC(Java Data Base Connectivity)是不会陌生的,JDBC作为 Java 基础内容,它提供了一种基准,据此可以构建更高级的工具和 ...

  10. python 文件和目录操作题库

    1. 把一个目录下所有的文件删除,在所有的目录下新建一个a.txt的文件,并在文件下写入"python"关键字.   解题思路:        1.如果目录存在则切换进入目录    ...