欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ACE2005系列2 -- 数据预处理

程序员文章站 2022-03-08 19:28:51
...

ACE2005数据预处理

ACE2005数据预处理,指使用Standford NLP Tools对原始的ACE2005进行词性标注、依存关系标注,并将源标注文件(.apf.xml)中的实体间关系标注出来。这项工作的进行通过Github:ace-data-prep提供的代码完成。

英文语料预处理

环境

根据ace-data-prep,先根据Reqirements安装所需环境。要注意的是,这里要求是Python2.7.x, 最好能保证就用Python.2.7.x。笔者使用的是python3.6,中间在CHUNK生成时会出现一些小的不兼容bug要修改(主要是几个bytes和str的数据类型转换)。

  • Java 1.8+

  • Maven 3.4+

  • Python 2.7.x

  • GNU Make

运行

首先,使用make命令运行ace-data-prep/下的Makefile,README中给出的运行命令如下

make LDC_DIR=<path to LDC dir> \
     OUT_DIR=<path for output dir> \
     ace05splits

LDC_DIR

在该命令中,LDC_DIR是ACE数据所在目录,LDC_DIR目录下应当包含一个名为LDC2006T06的目录,LDC2006T06/下包含dtd/目录与/data/English/目录(这里先只讨论English的情况)。由于笔者是直接对timex2norm/目录下标注的语料进行处理,因此将Makefile中Line51和Line113中的adj改为了timex2norm

OUT_DIR

OUT_DIR是输出文件的目录,手动创建OUT_DIR的空目录即可(创建空目录即可,其他子目录会在代码执行过程中自动生成)。

关于参数命令(ace05splits)

README中给出的参数命令是"ace05splits",如果照此执行会发现程自动创建ace-05-comms/、ace-05-comms-ptb-anno/、ace-05-comms-ptb-anno-chunks/等目录,对每个文件逐步生成.concrete、标注后的.concrete和chunks文件。完成以上文件及json文件的生成后,会通过bash执行.scripts/data/split_ace_dir.sh对bn和nw进行划分。由于觉得这样的生成过程方便数据统计,因此根据Makefile中的伪命令,换一种方式进行数据自动标注过程。

  • Makefile基础说明

  • 命令一:生成原始的.concrete文件 (Converts all the ACE 2005 data to Concrete Communications.)

make LDC_DIR=<path to LDC dir> \
     OUT_DIR=<path for output dir> \
     ace05comms

执行此命令后,会自动创建OUT_DIR/ace-05-comms/目录,并在目录下生成599个英文文件所对应的.concrete文件。

  • 命令二:生成标注后的.concrete文件 (Annotates all of the ACE 2005 data with Stanford tools and chunklink.pl.)
make LDC_DIR=<path to LDC dir> \
     OUT_DIR=<path for output dir> \
     ace05anno

执行此命令后,会自动创建OUT_DIR/ace-05-comms-ptb-anno/目录和OUT_DIR/ace-05-comms-ptb-anno-chunks/目录,并在目录下生成599个英文文件所对应的标注后的.concrete文件。

这一过程可能会比较漫长,且笔者在执行过程中出现了Java堆内存不足的情况,于是调整了JAVAFLAGS,并加大了虚拟机内存,最终执行成果。

也是这一过程中需要用到Github:concrete-chunklink,我是直接手动把这个库下载到本地的ace-data-prep/目录下执行的。同时,也是concrete-chunklink/concrete-chunklink/add_chunks.py在执行的过程中可能出现PYthon3和Pyhton2.7中str和byte不兼容的情况,根据报错情况手动进行了修改。

第32行的
whitespace = re.compile(r"\s+")
改为了
whitespace = re.compile(b"\s+")

get_chunks()函数中的
if line == "" or line.startswith("#")
改为了
if line == b"" or line.startswith(bytes("#", encoding = "utf8")):
因为根据报错和自己的调试发现,get_chunks()输入的是bytes类型的数据

其他几处是在logging.info输出内容的数据类型,由bytes改为了str
  • 命令三:基于以上.concrete文件生成json文件

根据Github:ace-data-prep-README,可以生成三种形式的json文件,笔者选择了pm13的进行生成,命令如下

make LDC_DIR=<path to LDC dir> \
     OUT_DIR=<path for output dir> \
     ace05json-pm13

执行该命令后,会自动创建OUT_DIR/ace-05-comms-ptb-anno-chunks-json-pm13/目录,并在目录下生成599个英文文件所对应的.json文件.例如,CNN_ENG_20030305_170125.1.json的部分数据截图(与Github:ace-data-prep-README选取同一个为例)

{"words":["i","'m","wolf","blitzer","in","washington","."]
,"lemmas":["i","be","wolf","blitzer","in","washington","."]
,"posTags":["LS","VBP","JJ","NN","IN","NN","."]
,"chunks":["O","B-VP","B-NP","I-NP","B-PP","B-NP","O"]
,"parents":[3,3,3,-1,3,4,-2]
,"deprels":["nsubj","cop","amod","root","prep","pobj",null]
,"naryTree":"((ROOT (S (NP (LS i)) (VP (VBP 'm) (NP (NP (JJ wolf) (NN blitzer)) (PP (IN in) (NP (NN washington))))) (. .))))"
,"nePairs":"[{\"m1\":{\"start\":2,\"end\":4,\"head\":3,\"type\":null,\"subtype\":null,\"phraseType\":\"NAM\",\"id\":\"04f12b8b-a459-9d26-fd7b-000063eb74cd\"},\"m2\":{\"start\":5,\"end\":6,\"head\":5,\"type\":null,\"subtype\":null,\"phraseType\":\"NAM\",\"id\":\"04f12b8b-a459-9d26-fd7b-000063eb74ef\"}}]"
,"relLabels":["PHYS(Arg-1,Arg-1)"]}

进行ng14格式的生成

make LDC_DIR=<path to LDC dir> \
     OUT_DIR=<path for output dir> \
     ace05json-ng14

得到样例如下:

{"words":["i","'m","wolf","blitzer","in","washington","."]
,"lemmas":["i","be","wolf","blitzer","in","washington","."]
,"posTags":["LS","VBP","JJ","NN","IN","NN","."]
,"chunks":["O","B-VP","B-NP","I-NP","B-PP","B-NP","O"]
,"parents":[3,3,3,-1,3,4,-2]
,"deprels":["nsubj","cop","amod","root","prep","pobj",null]
,"naryTree":"((ROOT (S (NP (LS i)) (VP (VBP 'm) (NP (NP (JJ wolf) (NN blitzer)) (PP (IN in) (NP (NN washington))))) (. .))))"
,"nePairs":"[{\"m1\":{\"start\":2,\"end\":4,\"head\":3,\"type\":null,\"subtype\":null,\"phraseType\":\"NAM\",\"id\":\"04f12b8b-a459-9d26-fd7b-000063eb74cd\"},\"m2\":{\"start\":5,\"end\":6,\"head\":5,\"type\":null,\"subtype\":null,\"phraseType\":\"NAM\",\"id\":\"04f12b8b-a459-9d26-fd7b-000063eb74ef\"}}]"
,"relLabels":["PHYS"]}

根据Github:ace-data-prep-README, words, named-entity pairs (nePairs), and relation labels (relLabels) 是从原始ACE2005数据中直接提取的,其他内容是使用stanford CoreNLP生成的。

中文语料处理

使用与上相同的方法对Chinese语料进行了处理。注意,处理时需要把Line41的数据目录)改为/Chinese, 并将对英文处理时改为timex2norm的目录复原为adj目录。

修改目录后,用与English语料处理的相同的三条命令进行处理,最终可以得到对中文标注的json文件。

例如,对CBS20001006.1000.0074处理后的json文件的一条样例如下:

{"words":["继续播报详细的新闻内容","。","行政院长张俊雄今天在立法院参加跨","党派大陆台商权益促进会成立大会时表示",",","他的理念是以合","作代","替对抗",",","因为过去对抗","、","对立的政治文化让人们付出很多的代价","。","他也希望对敏感的大陆政","策能够找到共同点",",","两岸能够建构正常","、","和平的关系","。","请听记者宫能惠的报导","。"]
,"lemmas":["继续播报详细的新闻内容","。","行政院长张俊雄今天在立法院参加跨","党派大陆台商权益促进会成立大会时表示",",","他的理念是以合","作代","替对抗",",","因为过去对抗","、","对立的政治文化让人们付出很多的代价","。","他也希望对敏感的大陆政","策能够找到共同点",",","两岸能够建构正常","、","和平的关系","。","请听记者宫能惠的报导","。"]
,"posTags":["NN","CD","CD","CD","NN","CD","CD","CD","NN","CD","CD","CD","NN","CD","CD","NN","CD","CD","CD","NN","CD","NN"]
,"chunks":["B-NP","I-NP","B-NP","I-NP","B-NP","I-NP","B-NP","I-NP","I-NP","B-NP","I-NP","B-NP","I-NP","B-NP","I-NP","I-NP","B-NP","I-NP","B-NP","I-NP","B-NP","I-NP"]
,"parents":[8,0,3,0,8,4,8,8,15,10,8,12,10,15,15,21,17,15,19,17,21,-1]
,"deprels":["dep","num","num","dep","dep","num","num","num","dep","number","dep","num","dep","num","num","dep","number","dep","num","dep","num","root"]
,"naryTree":"((ROOT (FRAG (X (X (NP (NP (NN 继续播报详细的新闻内容) (CD 。)) (NP (CD 行政院长张俊雄今天在立法院参加跨) (CD 党派大陆台商权益促进会成立大会时表示))) (NP (NN ,) (CD 他的理念是以合)) (NP (NP (CD 作代) (CD 替对抗) (NN ,)) (NP (NP (QP (CD 因为过去对抗) (CD 、))) (NP (CD 对立的政治文化让人们付出很多的代价) (NN 。))))) (NP (NP (CD 他也希望对敏感的大陆政) (CD 策能够找到共同点) (NN ,)) (NP (NP (QP (CD 两岸能够建构正常) (CD 、))) (NP (CD 和平的关系) (NN 。))))) (NP (CD 请听记者宫能惠的报导) (NN 。)))))"
,"nePairs":"[{\"m1\":{\"start\":2,\"end\":3,\"head\":2,\"type\":null,\"subtype\":null,\"phraseType\":\"NAM\",\"id\":\"881dfc82-1c82-9e4b-da75-00002daa8c31\"},\"m2\":{\"start\":2,\"end\":3,\"head\":2,\"type\":null,\"subtype\":null,\"phraseType\":\"NAM\",\"id\":\"881dfc82-1c82-9e4b-da75-00002daa8c66\"}}]"
,"relLabels":["PHYS(Arg-1,Arg-1)"]}

根据posTags、chunks的标注内容的检查(包括其他一些文件的标注内容),对中文的标注应该是错误也,也就是认为无法对中文进行标注

不知道是不是我的处理出了问题或判断有误,如有小伙伴发现了中文预处理的方法,请在评论区call我一下呀~~~


以上就是基本的数据预处理过程,还需要对json数据的进一步解读

这个数据的处理前后折腾了一周(吐血。。。),因此写文进行记录,也希望能够对进行相同工作的小伙伴有所帮助。

以上如有遗漏之处,欢迎补充与交流。

2019.06.08 更新

相关标签: 自然语言处理