爲了練習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