语料获取不在赘述,可以去LDC上申请,也可以找找别人放出的免费资源。语料编码默认都是UTF8。
在这里,我们使用FBIS语料,规模在24万句对左右。英语和汉语是两个文件,行对应,行数相同,train.en,train.ch。
系统环境:linux ubuntu 64bit
第一步做训练语料处理:
汉语端需要做分词,全半角转换。
英语端需要做转小写,token(分隔标点和单词),全半角转换
工具:
stanford-segmenter-2015-04-20
stanford-ner-2015-04-20
下载地址:http://nlp.stanford.edu/software/index.shtml
装ner工具是想使用其中的Tokenizer工具,因为该工具被集成到NER和Parser中,不提供单独下载。
两套工具都是以jar包的形式提供调用,需要的jre环境为1.8(jre 8 ),否则会报Exception in thread "main" java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0
stanford segmenter:
斯坦福分词器下载完,解压后,目录如下:
segment.sh就是linux下的运行脚本了,运行一下,会出现命令提示:
其中ctb和pku是两种分词训练语料,中间存在分词标准差异,后面是文件名,编码,是否输出kbest。在这里,我们的命令是: ./segment.sh ctb train.ch UTF-8 0 > train.ch.seg
汉语端分词过程完毕。
ner-tokenizer:
解压后的目录结构:
token.sh和english_fbis_jiujiu.lower是我自己的文件。
token.sh就是调用tokenizer的脚本
由于我的机器上并存了多个版本的jre,所以在前面要加$JAVA_HOME来指定使用哪个java,如果你机器上只有一个,且环境变量配置好了,那就直接用java。
命令里面的-preserveLines可以保证处理完的文件以句子的形式存在,而不是每行一个token,-lowerCase使得小写转换同时做。
调用脚本的命令很简单:./token.sh train.en > train.en.token
全角转半角:
对两种语言都做全半角转换,去除这些全半角不一致造成的噪音。
下面的两个句子,第一行是全角,第二行是半角,字母和数字在文件中编码不同,但代表的是同一个符号,所以需要做转换。VIte
转化后
转化用的python代码,full2half.py,
参考了http://blog.csdn.net/haoni123321/article/details/42552345,
编码问题:
#! /usr/bin/python
# encoding:utf-8
import sys
reload(sys);
sys.setdefaultencoding("utf8")
def strQ2B(ustring):
rstring = ""
for uchar in ustring:
inside_code=ord(uchar)
if inside_code==0x3000:#deal with space
inside_code=0x0020
else:
inside_code-=0xfee0 #deal with other
if inside_code < 0x0020 or inside_code > 0x7e:
rstring +=uchar
else:
rstring += unichr(inside_code)
return rstring
if __name__=='__main__':
for line in open(sys.argv[1]):
print strQ2B(line.strip('\n').decode('utf-8'))
调用的方式:
./full2half.py src > tgt
至此训练语料预处理完毕,得到两个文件 train.ch.seg_stanford.half , train.en.token.half
下一篇讲使用词对齐环境。