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

照例,先讲下环境,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
深耕地理信息

用地理学思维和现代信息技术解决城市问题。

101 声望
7 粉丝
0 条评论
推荐阅读
基于Sanic的微服务基础架构
使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力。有些异步框架Tornado、Twisted、Gevent 等就是为了解决性能问题。这些框架在性能上有些提升,但是也出现了各种古怪的问题难以...

jysong6阅读 4k评论 3

又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。

良许5阅读 1.8k

TVP专家夜聊:不用ChatGPT的开发都该被炒掉
引言“可能 ChatGPT 已经有智能了,但就像三体里的黑暗森林法则一样,它不会告诉我们。”“GPT-4 冲击最大的是 AI 炼丹师。”“凡是没有自觉用 ChatGPT 的程序员都可以考虑炒掉。”“ChatGPT 带来的工业革命,其实已经在...

腾讯云开发者3阅读 553

封面图
FastAPI性能碾压Flask?
不止一次的听过,FastAPI性能碾压Flask,直追Golang,不过一直没有测试过,今天闲着没事测试一下看看结果。不知道是哪里出了问题,结果大跌眼镜。

二毛erma02阅读 10.2k评论 3

封面图
GPT-4免费无限制使用教程
今天推荐的这个工具对于这些问题都不是问题,基于GPT-4(官网是这样介绍的,但是有人通过对话让它回答模型,它的回答却不是,运行中也有一定的错误率,实际大家需要自行判断),分分钟即可体验,不需要注册账号,...

南城FE3阅读 1.7k

Python之如何优雅的重试
为了避免偶尔的网络连接失败,需要加上重试机制,那么最简单的形式就是在对应的代码片段加一个循环,循环体里使用异常捕获,连接成功时退出循环,否则就重复执行相关逻辑,此时修改之后的函数f如下

Harpsichord12073阅读 7.3k

Linux终端居然也可以做文件浏览器?
大家好,我是良许。在抖音上做直播已经整整 5 个月了,我很自豪我一路坚持到了现在【笑脸】最近我在做直播的时候,也开始学习鱼皮大佬,直播写代码。当然我不懂 Java 后端,因此就写写自己擅长的 Shell 脚本。但...

良许1阅读 2.1k

用地理学思维和现代信息技术解决城市问题。

101 声望
7 粉丝
宣传栏