赞
踩
http://blog.csdn.net/qdhy199148/article/details/51038637
OpenNLP是Apach下的Java自然语言处理API,功能齐全,但是网上似乎能找到的用于处理中文的资料很少。
正好前段时间面试遇到一个做命名实体识别的任务考题,这里来给大家介绍一下使用OpenNLP进行中文语料命名实体识别的过程。
首先是预处理工作,分词去听用词等等的就不啰嗦了,其实将分词的结果中间加上空格隔开就可以了,OpenNLP可以将这样形式的的语料照处理英文的方式处理,有些关于字符处理的注意点在后面会提到。
首先我们要准备各个命名实体类别所对应的词库,词库被存在文本文档中,文档名即是命名实体类别的TypeName,下面两个function分别是载入某类命名实体词库中的词和载入命名实体的类别。
接下来是对命名实体识别模型的训练,先上代码:
有几个说明的地方,首先是参数,iterations是训练算法迭代的次数,太少了起不到训练的效果,太大了会造成过拟合,所以各位可以自己试试效果;cutoff是语言模型扫描窗口的大小,一般设成5就可以了,当然越大效果越好,时间可能会受不了;还有就是langCode语种代码和type实体类别,因为没有专门针对中文的代码,设成“普通”的即可,实体的类别因为我们想训练成能识别多种实体的模型,于是设置为“默认”。
代码中每个函数都配有注释,稍微有点编程基础的人肯定能看懂。需要说明一下的两个方法是:1.prodFeatureGenerators()方法用于生成个人订制的特征生成器,其意义在于选择什么样的n-gram语义模型,代码当中显示的是选择窗口大小为5,待测命名实体词前后各扫描两个词的范围计算特征(加上自己就是5个),或许有更深更准确的意义,请大家指正;2.就是训练模型的核心方法trainNameEntitySamples(),首先是将如上标注的训练语料字符串传入生成字符流,再通过NameFinderME的train()方法传入上面设定的各个参数,订制特征生成器等等,关于源实体映射对,就按默认传入空Map就好了。
返回训练得到的模型,可以写到磁盘上,形成二进制bin文件。
源代码开源在:https://github.com/Ailab403/ailab-mltk4j,test包里面对应有完整的调用demo,以及file文件夹里面的测试语料和已经训练好的模型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。