为了练习Gensim中文词向量建模,要用到wiki文件做语料库。因为这个文件是xml格式的,需要把它转成文本格式,所以有了下面的Python代码。
1、参考的代码
在某视频教程中看到的代码是这样写的:
运行后报错:
File "process-xml.py", line 32, in <module>
s = space.join(text)
TypeError: sequence item 0: expected a bytes-like object, str found
2、做类型转换
既然text是str,那么就将str转成bytes。
修改了代码:
for text in wiki.get_texts():
for item in text:
s = space.join(item.encode(encoding="utf-8"))
s = space.join(text)+"\n"
还是报错。
File "process-xml.py", line 30, in <module>
s = space.join(item.encode(encoding="utf-8"))
TypeError: sequence item 0: expected a bytes-like object, int found
3、网上搜索到说是py版本的原因
觉得可能要解决了,然而仔细一看,他的写法跟第1处的一样。
文章地址:https://www.cnblogs.com/combfish/p/6413553.html
4、那么就试试用老版本的写法
就是第24行space不用b类型。(注意26行,没有写编码)
又报错了:
File "process-xml2.py", line 30, in <module>
output.write(s)
UnicodeEncodeError: 'gbk' codec can't encode character '\u0107' in position 200: illegal multibyte sequence
既然是gbk的问题,那么把编码改成u8呢?
于是把chcp 65001试着这样把编程改成u8,不出所料,没有用。
既然是gbk的问题,那就在虚拟机里面跑吧,可想而知,很慢。3G内存的Ubuntu虚拟机,跑1.49G数据,耗时97分钟,Windows跑大概半小时左右。
5、准备到Stack Overflow上提问
为了准备提问内容,就重演一遍灾难过程。
突然发现跑成功了。
仔细一看,这回原来是第26行的原因。output = open(outp,'w',encoding='utf-8')
,输出要加上编码。
6、完整代码
因为这个错误地方是在文件全部读完,写到磁盘的时候的代码,需要等一段时间,才会走到这段代码,所以测试时,用的是一个10M的小WIKI文件测试的。
#-*- coding: utf-8 -*-
# @File : process-xml.py
import logging
import os.path
import sys
from gensim.corpora import WikiCorpus
if __name__ == '__main__':
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s"% ' '.join(sys.argv))
if len(sys.argv) > 3:
print(globals()['__doc__'] % locals())
sys.exit(1)
inp,outp = sys.argv[1:3]
space = ' '
i = 0
output = open(outp,'w',encoding='utf-8')
wiki = WikiCorpus(inp,lemmatize=False,dictionary={ })
for text in wiki.get_texts():
s = space.join(text)+"\n"
output.write(s)
i = i+1
if(i% 10000 == 0):
logger.info("Saved "+str(i) + " articles")
output.close()
logger.info("Finished Saved "+ str(i) +" articles")
# python process-xml.py zhwiki-20180620-pages-articles.xml.1.49G.bz2 wiki.zh.1.49G.text