中文维基百科文本数据获取与预处理
照例,先讲下环境,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[br]那个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地址,篇幅原因暂时不详细介绍这个了,只讲我认为的三点:
计算语言学的基本任务,解释地比较透彻,无论是代码还是文档。
配套论文产量和质量都不错。
良心的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运转的系外行星 轨道周期为 地球日 它是距离其中央恒星第三近的行星 其质量接近于土星 该行星于 日被发现 发现[br]和大多数系外行星一样 而之前 巨蟹座 该恒星仍然会出现视向速度位移 进一步的探测发现在距中央恒星 但是即使摒除了这两颗行星的影响[br]中央恒星仍然存在周期为 地球日的扰动现象 由于该周期接近于巨蟹座 a的自转周期 尽管如此 在同一份报告中 科学家宣布发现了巨蟹座 d和巨蟹座[br]对其中央恒星进行的长达 而且视向速度位移的幅度较大 无法为巨蟹座 a不大活跃的光球层活动所解释 轨道和质量 在巨蟹座 行星系统中[br]迄今为止已经发现了 颗行星 颗行星中 巨蟹座 c的轨道属于轻度偏心轨道 其远拱点较之近拱点远了 该行星的轨道周期要长于热木星[br]但是其轨道与巨蟹座 模拟表明该行星与巨蟹座 的比值 由于视向速度法的局限性 如果此预测无误 那么该行星的真实质量就为 倍木星质量 物理特性[br]由于科学家只能间接地探测该行星 所以至今还不知道其半径 物质构成和表面温度 该行星质量接近土星 所以它可能属于类木行星 从而并不拥有固体表面[br]参考文献 外部链接 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/
关键字:nlp, 自然语言处理, Python, 维基百科
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!