维基百科简体中文语料的获取

  最近做实验需要较大规模的中文语料,很自然的就想到使用维基百科的中文数据。

  使用维基百科做训练语料有很多好处:

  1. 维基百科资源获取非常方便,有 Wiki Dump 可以直接下载,所有的最新备份都在里面。最近的一次备份是3月底,也就是5天前。相比之下,其他很多语料都需要用爬虫抓取,或者付费获得。
  2. 维基百科的文档解析有非常多的成熟工具,直接使用开源工具即可完成正文的提取。
  3. 维基百科的质量较高,而且领域广泛(比较适合我要做的问题)。

  当然,缺点也有:最主要的就是数量较少,相比国内的百度百科、互动百科等,数据量要少一个数量级。

  直接切入正题。
  

第一步,下载中文的 Wiki Dump

  链接是:http://download.wikipedia.com/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2。这个压缩包里面存的是标题、正文部分,如果需要其他数据,如页面跳转、历史编辑记录等,可以到目录下找别的下载链接。
  

第二步,使用 Wikipedia Extractor 抽取正文文本

  Wikipedia Extractor 是意大利人用 Python 写的一个维基百科抽取器,使用非常方便。下载之后直接使用这条命令即可完成抽取,运行了大约半小时的时间。
  bzcat zhwiki-latest-pages-articles.xml.bz2 | python WikiExtractor.py -b 1000M -o extracted >output.txt
  参数 -b 1000M 表示以 1000M 为单位切分文件,默认是 500K。由于最后生成的正文文本不到 600M,把参数设置的大一些可以保证最后的抽取结果全部存在一个文件里。
  

第三步,繁简转换

  维基百科的中文数据是繁简混杂的,里面包含大陆简体、台湾繁体、港澳繁体等多种不同的数据。有时候在一篇文章的不同段落间也会使用不同的繁简字。
  解决这个问题最佳的办法应该是直接使用维基百科自身的繁简转换方法(参照 http://zh.wikipedia.org/wiki/Wikipedia:繁简处理)。不过维基百科网站虽然是开源的,但要把里面的繁简转换功能拆解出来,有一定的难度。
  为了方便起见,我直接使用了开源项目 opencc。参照安装说明的方法,安装完成之后,使用下面的命令进行繁简转换,整个过程大约需要1分钟。
  opencc -i wiki_00 -o wiki_chs -c zht2zhs.ini
  命令中的 wiki_00 这个文件是此前使用 Wikipedia Extractor 得到的。

  到此为止,已经完成了大部分繁简转换工作。实际上,维基百科使用的繁简转换方法是以词表为准,外加人工修正。人工修正之后的文字是这种格式,多数是为了解决各地术语名称不同的问题:

他的主要成就包括Emacs及後來的GNU Emacs,GNU C 編譯器及-{zh-hant:GNU 除錯器;zh-hans:GDB 调试器}-。

  对付这种可以简单的使用正则表达式来解决。一般简体中文的限定词是 zh-hans 或 zh-cn,在C#中用以下代码即可完成替换:

s = Regex.Replace(s, @"-\{.*?(zh-hans|zh-cn):([^;]*?);.*?\}-", @"$2");

  由于 Wikipedia Extractor 抽取正文时,会将有特殊标记的外文直接剔除,最后形成类似这样的正文:

西方语言中“数学”(;)一词源自于古希腊语的()

  虽然上面这句话是读不通的,但鉴于这种句子对我要处理的问题影响不大,就暂且忽略了。最后再将「」「」『』这些符号替换成引号,顺便删除空括号,就大功告成了!

  通过上述方法得到的维基百科简体中文纯文本语料约 528M。

53 评论

  1. 我下载了两个文件 运行bzcat zhwiki-latest-pages-articles.xml.bz2 | python WikiExtractor.py -b1000M -o extracted >output.txt命令的时候 显示的是 少参数 是还要传wikidump和outputdir两个参数吗 这两个参数应该写什么

    1. wikidump就是前面的输入,outputdir是extracted。应该能正常运行才是。我用的时候就用的这个命令,一字不差。不知道你那具体的提示是什么呢?

      1. 我跟他的是一样的错误:
        [hadoop@master wiki]$ bzcat zhwiki-latest-pages-articles.xml.bz2 | python WikiExtractor.py -b1000M -o extracted > output.txt
        usage: WikiExtractor.py [-h] [-o OUTPUT] [-b n[KMG]] [-B BASE] [-c] [-l]
        [-ns ns1,ns2] [-q] [–debug] [-s] [-a]
        [–templates TEMPLATES] [–no-templates]
        [–threads THREADS] [-v]
        input
        WikiExtractor.py: error: too few arguments

        现在WikiExtractor.py和压缩文件都在这个目录下运行的

  2. 用了同样读方法,得到的只有数字和名称如下面的格式:
    13 数学
    18 哲学
    21 文學
    22 历史
    25 计算机科学
    ……
    而且总共只有18M多
    但是下载的dump里面明明有全文,不知道是为什么

  3. 博主,我想问一下,我在繁体转简体时,安装那个opencc,安装好了,我输入opencc -i wiki.zh.text -o wiki.zh.text.jian -c zht2zhs.ini后,为什么出现了glibc detected***opencc :realloc():invalid next size…,得到的输出文件永远是空的,怎么回事呢?

    1. 你好 请问你的zht2zhs.ini 文件是如何设置的呢?
      title = trad_to_simp
      description = Standard Configuration for Conversion from Traditional Chinese to Simplified Chinese
      dict0 = OCD trad_to_simp_phrases.ocd
      dict0 = OCD trad_to_simp_characters.ocd
      我设置成上面那样,可是执行之后,出现了下面的错误,谢谢了
      Invalid format: Error parsing JSON

  4. 哭了,楼主的半小时解析完xml是怎么办到的。。。我这儿都跑了19个小时了还在刷。。。现在刷到:

    INFO: 1606843 陈玉先
    INFO: 1606848 格里特·尤拉克
    INFO: 1606855 鎌倉七口
    INFO: 1606860 變身男女Chok Chok Chok

  5. 是用的Python2,还是Python3。我也是这个错误
    WikiExtractor.py -b1000M -o extracted > output.txt
    usage: WikiExtractor.py [-h] [-o OUTPUT] [-b n[KMG]] [-B BASE] [-c] [-l]
    [-ns ns1,ns2] [-q] [–debug] [-s] [-a]
    [–templates TEMPLATES] [–no-templates]
    [–threads THREADS] [-v]
    input
    WikiExtractor.py: error: too few arguments

    1. 我是用Stanford Tokenizer处理了一下,主要就是把标点符号和单词分开。如果任务不区分大小写,还可以把训练语料全转小写。

      1. 你好,我最近又拜读了你的博士论文,有几个问题。你在维基百科上实验的时候是如何打乱文章顺序的,还有就是子集是怎么抽取的,能否参考一下你的实现代码~~

  6. #/bin/sh
    bzcat zhwiki-latest-pages-articles.xml.bz2 | \
    python WikiExtractor.py -o – | \
    sed -e ‘s///g’ -e ‘s///g’ -e ‘/^$/d’ | \
    opencc -c zht2zhs.ini | \
    sed -r -e ‘s/(.)/\ \1/g’ -e ‘s/^\ //g’ > zhs_wiki.txt

发表评论

电子邮件地址不会被公开。 必填项已用*标注