維基百科文件解析成中文遇到的變量類型、編碼問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章