一、概述
预处理阶段的目标是将中文维基百科的原始 XML 数据转换为适合 Word2Vec 训练的分词文本。整个流程为:

1.1 目录结构
word2vec/
├── data/
│ ├── zhwiki-latest-pages-articles.xml.bz2 # 原始数据(维基百科 XML 压缩包)
│ └── wiki_zh.txt # 预处理输出(分词后的纯文本)
├── scripts/
│ └── process_wiki.py # 预处理主脚本
├── utils/
│ ├── __init__.py
│ └── logger_utils.py # 日志工具
└── logs/
└── wiki_process.log # 处理日志
1.2 数据来源
原始数据为维基百科官方提供的中文数据库转储文件:
- 文件名:
zhwiki-latest-pages-articles.xml.bz2 - 格式:bz2 压缩的 XML(MediaWiki 导出格式)
- 下载地址:https://dumps.wikimedia.org/zhwiki/latest/
二、处理流程详解
2.1 XML 解析与文章提取
使用 gensim.corpora.WikiCorpus 对 XML 文件进行流式解析,逐篇提取文章正文,自动过滤掉标记语言标签、模板、表格等非正文内容。
(1) WikiCorpus 介绍
WikiCorpus 是 gensim 库提供的维基百科语料处理类,专门用于解析维基百科的数据库转储文件。
- 其核心特性:
- 流式解析:文章从压缩包中按需提取(on-the-fly),整个数据转储文件始终保持压缩状态存储在磁盘上,不需要解压,内存占用极低
- 自动清洗:内置 MediaWiki 标记语言解析器,自动去除 XML 标签、Wiki 模板、表格、引用、链接等非正文内容,只保留纯文本
- 支持的文件格式:
<LANG>wiki-<YYYYMMDD>-pages-articles.xml.bz2和<LANG>wiki-latest-pages-articles.xml.bz2
(2) 构造函数主要参数
| 参数 | 说明 |
|---|---|
fname | 维基百科 XML 转储文件路径 |
processes | 并行解析的进程数,默认为 CPU 核心数 |
dictionary | 传入 {} 表示跳过词典构建,仅提取文本 |
filter_namespaces | 过滤的命名空间,默认 ('0',) 即只保留正文文章,排除讨论页、用户页等 |
article_min_tokens | 文章最少 token 数,默认 50,低于此值的文章会被丢弃 |
token_min_len / token_max_len | token 长度过滤范围,默认 2~15 |
(3) 本项目使用方式
wiki = WikiCorpus(input_file, dictionary={})
for text in wiki.get_texts():
raw_text = "".join(text)
- 传入
dictionary={}表示不构建词典,仅提取文本 get_texts()返回生成器,每次 yield 一篇文章的 token 列表- 流式处理,不会一次性将全部数据加载到内存
2.2 繁体转简体
维基百科中文版包含大量繁体内容,使用 OpenCC 统一转换为简体中文。另外,转换在分词之前执行,避免繁体字影响 jieba 的分词效果。
(1) OpenCC 介绍
OpenCC(Open Chinese Convert)是一个开源的中文简繁转换库,与简单的字符映射不同,OpenCC 支持字符级和词汇级转换,能够处理一简对多繁(如"发" → “發”/“髮”)的歧义问题,同时支持地区习惯用词转换(大陆、台湾、香港)。
(2) 可用的转换配置
| 配置 | 说明 |
|---|---|
t2s | Traditional to Simplified,繁体 → 简体 |
s2t | 简体 → 繁体 |
s2tw | 简体 → 繁体(台湾标准) |
s2twp | 简体 → 繁体(台湾标准,含词汇转换) |
s2hk | 简体 → 繁体(香港标准) |
tw2s | 繁体(台湾标准) → 简体 |
tw2sp | 繁体(台湾标准) → 简体(含词汇转换) |
hk2s | 繁体(香港标准) → 简体 |
(3) 本项目使用方式
维基百科中文版包含大量繁体内容,使用 OpenCC 统一转换为简体中文:
converter = opencc.OpenCC('t2s')
raw_text = converter.convert(raw_text)
2.3 中文分词
使用 jieba 对简体文本进行分词,词语之间以空格分隔:
line = " ".join(jieba.cut(raw_text))
- jieba 默认使用精确模式(
cut_all=False),尽可能将句子切分为最合理的词语组合 - 输出示例:
自然 语言 处理 是 人工智能 的 一个 重要 方向
2.4 写入输出文件
每篇文章处理后写入一行,最终输出文件格式为:
词1 词2 词3 词4 ... ← 第 1 篇文章
词1 词2 词3 ... ← 第 2 篇文章
...
每处理 10000 篇文章输出一次日志,记录当前进度。
三、使用方式
# 在项目根目录下执行
python scripts/process_wiki.py data/zhwiki-latest-pages-articles.xml.bz2 data/wiki_zh.txt
3.1 参数说明
| 参数 | 说明 |
|---|---|
input_file | 维基百科 XML 压缩文件路径 |
output_file | 输出的分词文本文件路径 |
3.2日志
处理过程中的日志同时输出到控制台和 logs/wiki_process.log,格式为:
2024-10-31 08:30:15 - INFO - Starting processing: data/zhwiki-latest-pages-articles.xml.bz2 -> data/wiki_zh.txt
2024-10-31 08:35:22 - INFO - Saved 10000 articles
2024-10-31 08:40:18 - INFO - Saved 20000 articles
...
2024-10-31 09:12:45 - INFO - Finished processing. Total saved articles: 385000
3.3 依赖库
| 库 | 版本 | 用途 |
|---|---|---|
| gensim | 4.4.0 | 解析维基百科 XML |
| jieba | - | 中文分词 |
| opencc | - | 繁简转换 |
1013



被折叠的 条评论
为什么被折叠?



