中文维基百科文本数据获取与预处理

照例,先讲下环境,Mac OSX 10.11.2 ,Python 3.4.3。

下载数据

方法1:使用官方dump的xml数据

最新打包的中文文档下载地址是:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

方法2:也是官方,结构化数据(json)

下载地址是:https://dumps.wikimedia.org/wikidatawiki/entities/ 。目前尚未测试使用此数据,不多作介绍。但数据模型和已有的工具都可以在wikidata的站点上找到。

解压与转存

我使用方法1,下载后需要对该xml文件的压缩包作处理,所幸gensim的WikiCorpus已经预置了部分处理。几行关键的python代码如下:

input_file = "zhwiki-latest-pages-articles.xml.bz2"
wiki = WikiCorpus(input_file, lemmatize=False, dictionary={})
    for text in wiki.get_texts():
        str_line = bytes.join(b' ', text).decode()
        #以下可以存入文件或数据库

更详细的关于WikiCorpus的介绍可以看这里。

在上面的代码中,补下自己的漏,python3里,str和bytes是两个不同的东西,有点类似python2中的str和unicode。下面是str和bytes的相互转换方法:

# str转bytes
data = ""  #string
data = "".encode()  #bytes
data = b""  #bytes

# bytes转str
data = b""  #bytes
data = b"".decode()  #string
data = str(b"")  #string

除了用gensim,还有个哥们写了一个wikiextractor工具来处理wiki的dump数据,若感兴趣可拿来参考,详见github地址。

根据我的数据,1.17G的原始数据处理所得的文本文件845M,246497篇文章(这个数字随时间往后是越来越大)。

繁简转换

这是个糟糕的话题,占这么大篇幅真得感叹中华崛起之重要。中文维基数据繁简混杂——大家都说存在这个问题,但wikipedia的网站是将繁体中文和简体中文分开处理的,所以一直觉得从数据库到dump结构都应有方法将两者区分开,暂罢,待有空研究其数据时再议。关于繁简转换,来斯惟和52nlp的博文都用到了一个繁简转换工具——OpenCC,关于此,引官方介绍如下:

Open Chinese Convert(OpenCC)是一個中文簡繁轉換開源項目,提供高質量的簡繁轉換詞庫和可供調用的函數庫(libopencc)。還提供命令行簡繁轉換工具,人工校對工具,詞典生成程序,以及圖形用戶界面。

这里使用的是命令行工具。至于安装方法,可以看Google Code上的项目页面。如在Mac下,直接:

brew install opencc

将繁体转为简体的命令如下:

opencc -i wiki_zh.text -o wiki_zhs.text -c zht2zhs_config.json
那个json是什么鬼?OpenCC的配置文件,现在已支持json写法,如下:

{
  "name": "Traditional Chinese to Simplified Chinese",
  "segmentation": {
    "type": "mmseg",
    "dict": {
      "type": "ocd",
      "file": "TSPhrases.ocd"
    }
  },
  "conversion_chain": [{
    "dict": {
      "type": "group",
      "dicts": [{
        "type": "ocd",
        "file": "TSPhrases.ocd"
      }, {
        "type": "ocd",
        "file": "TSCharacters.ocd"
      }]
    }
  }]
}

中文分词

OK,这是个大话题,有很多选择,网上有不少推荐结巴分词,其实是挺不错的。但这里使用哈工大的LTP,github地址,篇幅原因暂时不详细介绍这个了,只讲我认为的三点:

  1. 计算语言学的基本任务,解释地比较透彻,无论是代码还是文档。

  2. 配套论文产量和质量都不错。

  3. 良心的python封装。

尽管,国内大学中不乏类似工作,清华、复旦等也做了不少。

LTP目前我使用release里的3.3.2,模型文件使用3.3.1,python封装使用0.1.9。由于是Mac下使用源文件编译,所以由于OSX编译器类型变迁,pyltp 0.1.9的setup.py中一定要记得修改这行:

extra_compile_args += ['-std=c++11', '-Wno-c++11-narrowing',"-mmacosx-version-min=10.8",'-stdlib=libc++']

其重点是-mmacosx-version-min这个参数。当然,根据issue记录,25天前这个问题已修复且合并进mater分支。所以据拍脑袋估计,git源码安装也是可行:

$ git clone https://github.com/HIT-SCIR/pyltp
$ git submodule init
$ git submodule update
$ python setup.py install

具体分词的写法就比较简单了,例子如下:

# -*- coding: utf-8 -*-
from pyltp import Segmentor
segmentor = Segmentor()
segmentor.load("/path/to/your/cws/model")
words = segmentor.segment("这句句子要分词")
print "|".join(words)
segmentor.release()

找一篇语料对比下分词前后,分词前:

巨蟹座 是一颗环绕巨蟹座 a运转的系外行星 轨道周期为 地球日 它是距离其中央恒星第三近的行星 其质量接近于土星 该行星于 日被发现 发现
和大多数系外行星一样 而之前 巨蟹座 该恒星仍然会出现视向速度位移 进一步的探测发现在距中央恒星 但是即使摒除了这两颗行星的影响
中央恒星仍然存在周期为 地球日的扰动现象 由于该周期接近于巨蟹座 a的自转周期 尽管如此 在同一份报告中 科学家宣布发现了巨蟹座 d和巨蟹座
对其中央恒星进行的长达 而且视向速度位移的幅度较大 无法为巨蟹座 a不大活跃的光球层活动所解释 轨道和质量 在巨蟹座 行星系统中
迄今为止已经发现了 颗行星 颗行星中 巨蟹座 c的轨道属于轻度偏心轨道 其远拱点较之近拱点远了 该行星的轨道周期要长于热木星
但是其轨道与巨蟹座 模拟表明该行星与巨蟹座 的比值 由于视向速度法的局限性 如果此预测无误 那么该行星的真实质量就为 倍木星质量 物理特性
由于科学家只能间接地探测该行星 所以至今还不知道其半径 物质构成和表面温度 该行星质量接近土星 所以它可能属于类木行星 从而并不拥有固体表面
参考文献 外部链接 extrasolar visions cancri

分词后:

巨蟹座|是|一|颗|环绕|巨蟹座|a|运转|的|系|外行星|轨道|周期|为|地球日|它|是|距离|其|中央|恒星|第三|近|的|行星|其|质量|接近|于|土星|该|行星|于|日|被|发现|发现|和|大多数|系外|行星|一样|而|之前|巨蟹座|该|恒星|仍然|会|出现|视|向|速度|位移|进一步|的|探测|发现|在|距|中央|恒星|但是|即使|摒除|了|这|两|颗|行星|的|影响|中央|恒星|仍然|存在|周期|为|地球日|的|扰动|现象|由于|该|周期|接近|于|巨蟹座|a|的|自转|周期|尽管|如此|在|同一|份|报告|中|科学家|宣布|发现|了|巨蟹座|d|和|巨蟹座|对|其|中央|恒星|进行|的|长|达|而且|视|向|速度|位移|的|幅度|较|大|无法|为|巨蟹座|a|不|大|活跃|的|光球层|活动|所|解释|轨道|和|质量|在|巨蟹座|行星|系统|中|迄今为止|已经|发现|了|颗|行星|颗|行星|中|巨蟹座|c|的|轨道|属于|轻度|偏心|轨道|其|远|拱点|较之|近|拱点|远|了|该|行星|的|轨道|周期|要|长|于|热|木星|但是|其|轨道|与|巨蟹座|模拟|表明|该行星|与|巨蟹座|的|比值|由于|视|向|速度|法|的|局限性|如果|此|预测|无误|那么|该行星|的|真实|质量|就|为|倍|木星|质量|物理|特性|由于|科学家|只能|间接|地|探测|该行|星所|以至今|还|不|知道|其|半径|物质|构成|和|表面|温度|该行|星|质量|接近|土星|所以|它|可能|属于|类|木行星|从而|并|不|拥有|固体|表面|参考|文献|外部|链接|extrasolar|visions|cancri

小结

这篇主要基于网络上的资料,重走了一遍数据下载到中文分词的技术点,并汇总了已知的工具链。上述结果对比维基的原网页,明显还存在不少问题,例如语料中的数字均丢失了,对于其中数量、年份等信息对于文本理解其实很重要。尚不确定是否是WikiCorpus造成的问题。

下一篇计划尝试用此语料做词嵌入相关的部分实验。

To be continued.

原文链接:http://qiancy.com/2016/05/08/wiki-text-analysis-prepare/

    原文作者:cyqian
    原文地址: https://segmentfault.com/a/1190000005089690
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞