中文语料库中，质量高而又容易获取的语料库，应该就是维基百科的中文语料了，而且维基百科相当厚道，每个月都把所有条目都打包一次（下载地址在这里：https://dumps.wikimedia.org/zhwiki/），供全世界使用，这才是真正的“取之于民，回馈于民”呀。遗憾的是，由于天朝的无理封锁，中文维基百科的条目到目前只有91万多条，而百度百科、互动百科都有千万条了（英文维基百科也有上千万了）。尽管如此，这并没有阻挡中文维基百科成为几乎是最高质量的中文语料库。（百度百科、互动百科它们只能自己用爬虫爬取，而且不少记录质量相当差，几乎都是互相复制甚至抄袭。）

I. 门槛

尽量下载很容易，但是使用维基百科语料还是有一定门槛的。直接下载下来的维基百科语料是一个带有诸多html和markdown标记的文本压缩包，基本不能直接使用。幸好，已经有热心的高手为我们写好了处理工具，主要有两个：1、Wikipedia Extractor；2、gensim的wikicorpus库。它们都是基于python的。

然而，这两个主流的处理方法都不能让我满意。首先，Wikipedia Extractor提取出来的结果，会去掉{{}}标记的内容，这样会导致下面的情形

西方语言中“数学”（；）一词源自于古希腊语的（）

这是因为括号里的词带有{{}}标记，被清空了；而按照网上的教程，直接用gensim.corpora.wikicorpus.WikiCorpus处理，问题更严重，因为它连所有标点都去掉了。对于追求一份高质量语料库的、具有强迫症的笔者来说，这都是不能接受的。因此，自己动手结合gensim，写了一个处理脚本。

II. 代码


from gensim.corpora.wikicorpus import extract_pages,filter_wiki
import bz2file
import re
import opencc
from tqdm import tqdm
import codecs

wiki = extract_pages(bz2file.open('zhwiki-latest-pages-articles.xml.bz2'))

def wiki_replace(d):
    s = d[1]
    s = re.sub(':*{\|[\s\S]*?\|}', '', s)
    s = re.sub('[\s\S]*?', '', s)
    s = re.sub('(.){{([^{}\n]*?\|[^{}\n]*?)}}', '\\1[[\\2]]', s)
    s = filter_wiki(s)
    s = re.sub('\* *\n|\'{2,}', '', s)
    s = re.sub('\n+', '\n', s)
    s = re.sub('\n[:;]|\n +', '\n', s)
    s = re.sub('\n==', '\n\n==', s)
    s = u'【' + d[0] + u'】\n' + s
    return opencc.convert(s).strip()

i = 0
f = codecs.open('wiki.txt', 'w', encoding='utf-8')
w = tqdm(wiki, desc=u'已获取0篇文章')
for d in w:
    if not re.findall('^[a-zA-Z]+:', d[0]) and d[0] and not re.findall(u'^#', d[1]):
        s = wiki_replace(d)
        f.write(s+'\n\n\n')
        i += 1
        if i % 100 == 0:
            w.set_description(u'已获取%s篇文章'%i)

f.close()

III. 注释

可见，代码的主要部分是正则表达式。首先通过bz2file直接不解压来读取下载下来的语料，然后用gensim的extract_pages来提取每个页面，提取后，先处理页面的一些特殊的、非文本的标记，然后将部分有用的{{}}标记替换为[[]]，因为[[]]标记不会被完全清空（具体原理读者得自己测试了），然后用gensim的filter_wiki函数直接清理，接着再处理一下换行的问题，最后通过opencc将繁体转化为简体。

后面的循环中，re.findall('^[a-zA-Z]+:', d[0])这个条件是去掉那些帮助页面，re.findall(u'^#', d[1])这个条件是去掉重定向的页面，最后得到大概就是91.9万个页面。tqdm是用来显示进度的，这个必须有。程序在我的机器上运行了大概40分钟，得到了1.5G左右的纯文本语料。运行时间不重要，因为预处理是一次性的。

值得注意的是，opencc不能用sudo apt-get install opencc来安装，这个默认版本太低，要用源码编译安装，然后pip install opencc安装python接口，这时候在python中调用opencc可能会报“段错误”，这时候要运行

cp /usr/lib/libopencc.so.1.0.0 /usr/lib/x86_64-linux-gnu/

IV. 副产品

上面提到了重定向，重定向意味着两个词具有同样的意思，这样我把中文维基里边所有的重定向都提取出来了，做了个匹配表。也就是说，词表中每一行的两个词都是相同含义的。这算是一个副产品了。

基于中文维基重定向的同义词表：wiki_cn_mapping.7z


转载到请包括本文地址：http://kexue.fm/archives/4176/

如果您觉得本文还不错，欢迎点击下面的按钮对博主进行打赏。打赏并非要从中获得收益，而是希望知道科学空间获得了多少读者的真心关注。当然，如果你无视它，也不会影响你的阅读。再次表示欢迎和感谢！
http://kexue.fm/archives/4176/
kexue.fm
crawl=CC-MAIN-2017-39
49374
application/http; msgtype=response
sha1:BUGRQXHJEWM3A5N7F4HMMT6B63TSIMDR
<urn:uuid:8f9be790-728f-460a-950e-fe29b35c73b4>
2017-09-23T16:33:04Z
114.215.107.121
application/xhtml+xml
sha1:R2QOCUTGPGKMIRSLE4P25DQJVVCHK2ZU
<urn:uuid:c04d1281-547a-4135-9ea4-2a7de186d7a7>
http://kexue.fm/archives/4176/
length
response
<urn:uuid:bab537df-c41a-455f-a043-a930fc32376b>
robots: classic
hostname: ip-10-236-53-242.ec2.internal
software: Nutch 1.6 (CC)
isPartOf: CC-MAIN-2017-39
operator: Common Crawl Admin
description: Wide crawl of the web for September 2017
publisher: Common Crawl
format: WARC File Format 1.0
conformsTo: http://bibnum.bnf.fr/WARC/WARC_ISO_28500_version1_latestdraft.pdf