中文维基数据处理 - 1. 下载与清洗
1. 数据下载
一些重要的链接:
- 最新转储
需要zhwiki-latest-pages-articles.xml.bz2
这个文件 - 中文维基的页面统计信息
目前内容页面数大约是 978K
2. 数据处理
选择了 Gensim 这个主题工具包进行数据预处理。
2.1 xml 转 json
python -m gensim.scripts.segment_wiki -f zhwiki-latest-pages-articles.xml.bz2 | gzip > zhwiki-latest.json.gz
然后就转换成了可被 Python 直接读取的 json 文档。
2.2 测试数据
from smart_open import smart_open
import json
x = 0
for line in smart_open('zhwiki-latest.json.gz'):
article = json.loads(line)
print("Article title: %s" % article['title'])
for section_title, section_text in zip(article['section_titles'], article['section_texts']):
print("Section title: %s" % section_title)
print("Section text: %s" % section_text)
x += 1
if x == 5:
break
运行如上代码可以输出中文维基中的前 5 篇文档。
2.3 繁简转换
采用 OpenCC 实现。
#!/usr/bin/env python3
import opencc
def t2s(s):
return opencc.convert(s, config='t2s.json')
def convert_obj(p):
num, line = p[0], p[1]
article = json.loads(line)
article['title'] = t2s(article['title'])
article['section_titles'] = [t2s(t) for t in article['section_titles']]
article['section_texts'] = [t2s(t) for t in article['section_texts']]
return (num, json.dumps(article))
from smart_open import smart_open
import json
import sys
import multiprocessing
from itertools import count
p = multiprocessing.Pool()
x = 0
for out in p.imap(convert_obj, zip(count(), smart_open('zhwiki-latest.json.gz'))):
print(out[1])
if out[0] % 100000 == 0:
sys.stderr.write('Processed %d\n' % (out[0]))