文章目录

  • 一、CRF分词
  • 二、CRF模型训练
    • 1、语料库准备
    • 2、词性标注
    • 3、训练
    • 4、结果文件
    • 5、BEMS标注
  • 三、实验结果

CRF是序列标注场景中常用的一种语言模型,与基于隐马尔可夫模型(HMM)的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。CRF的效果比感知机稍好一些,然而训练速度较慢,也不支持在线学习。

一、CRF分词

官网给出的CRF分词方法如下:

public class DemoCRFSegment
{public static void main(String[] args){HanLP.Config.ShowTermNature = false;    // 关闭词性显示Segment segment = new CRFSegment();String[] sentenceArray = new String[]{"HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。","鐵桿部隊憤怒情緒集結 馬英九腹背受敵",           // 繁体无压力"馬英九回應連勝文“丐幫說”:稱黨內同志談話應謹慎","高锰酸钾,强氧化剂,紫红色晶体,可溶于水,遇乙醇即被还原。常用作消毒剂、水净化剂、氧化剂、漂白剂、毒气吸收剂、二氧化碳精制剂等。", // 专业名词有一定辨识能力"《夜晚的骰子》通过描述浅草的舞女在暗夜中扔骰子的情景,寄托了作者对庶民生活区的情感",    // 非新闻语料"这个像是真的[委屈]前面那个打扮太江户了,一点不上品...@hankcs",                       // 微博"鼎泰丰的小笼一点味道也没有...每样都淡淡的...淡淡的,哪有食堂2A的好次","克里斯蒂娜·克罗尔说:不,我不是虎妈。我全家都热爱音乐,我也鼓励他们这么做。","今日APPS:Sago Mini Toolbox培养孩子动手能力","财政部副部长王保安调任国家统计局党组书记","2.34米男子娶1.53米女粉丝 称夫妻生活没问题","你看过穆赫兰道吗","乐视超级手机能否承载贾布斯的生态梦"};for (String sentence : sentenceArray){List<Term> termList = segment.seg(sentence);System.out.println(termList);}}
}

针对项目需求,主要对地址文本进行分词,但是由于地址文本与一般文本相比,是具有空间结构和空间嵌套关系的字符串,尤其注重对地址元素的抽取和拆分。例如以`湖北省荆州市荆州区荆秘路266-1号`门牌号地址为例,在Hanlp原生训练的CRF模型下,得到的分词结果为:

该模型无法区分地址元素【荆州区】【荆秘路】,因此无法满足实际需要。
本文对其做出的改进为,在默认语料库添加地址语料库进行自定义模型训练。

二、CRF模型训练

1、语料库准备

hanlp提供了默认的训练模型,默认模型训练语料库为 OpenCorpus/pku98/199801.txt,随1.6.2以上版本发布。
语料库格式为人民日报2014语料格式:

  1. 单词与词性之间使用/分割,如华尔街/nsf,且任何单词都必须有词性,包括标点等。
  2. 单词与单词之间使用空格分割,如美国/nsf 华尔街/nsf 股市/n。
  3. 支持用[]将多个单词合并为一个复合词,如[纽约/nsf 时报/n]/nz,复合词也必须遵守1和2两点规范。

训练时将满足上述格式的语料以纯文本txt导出到一个目录下即可。OpenCorpus/pku98/199801.txt即为一个单文档的例子,可供参考。

2、词性标注

HanLP使用的HMM词性标注模型训练自2014年人民日报切分语料,随后增加了少量98年人民日报中独有的词语。
本文所用到的词性标注包括:

  • ns 地名
  • q 量词
  • m 数词

其余词性标注集如链接所示。
语料库示例:

3、训练

CRF模型训练可以直接使用在hanlp Java API进行,使用CRFSegmenter.train,确定好语料库和输出文件路径即可。

private static final String CWS_MODEL_PATH = "模型输出路径/文件名.txt";
public static void main(String[] args) throws IOException {CRFSegmenter segmenter = new CRFSegmenter(null);segmenter.train("语料库路径/文件名.txt", CWS_MODEL_PATH);}

训练过程为:

4、结果文件

生成结果文件为:

其中version说明了模型的版本,通过-c参数指定的cost-factormaxid特征函数的最大id,xsize是特征维数,也就是训练语料列数-1。

训练时候用到的模板文件如下:

U0:%x[-1,0]
U1:%x[0,0]
U2:%x[1,0]
U3:%x[-2,0]%x[-1,0]
U4:%x[-1,0]%x[0,0]
U5:%x[0,0]%x[1,0]
U6:%x[1,0]%x[2,0]
B

后面部分为特征函数和依照id顺序对应的特征函数权值:

5、BEMS标注

如果想采用CRF++的方法进行训练,也可以将其转换为CRF++支持的格式。CRF++是著名的条件随机场开源工具,也是目前综合性能最佳的CRF工具,有直接的工具包可以进行使用。CRF++工具包使用介绍

同时java-hanlp也提供了CRF++支持的语料库格式转换方法,该格式使用BEMS对文本进行标注。

public static void main(String[] args) throws IOException {CRFSegmenter segmenter = new CRFSegmenter(null);segmenter.convertCorpus("语料库路径/文件名.txt", "文件输出路径/文件名.tsv");}

BEMS所说是中科院的提出一种标注,也有说BEIS的,hanlp用的是BEMS
B:开始
E:结束
M/I:中间
S:单独成词的位置

HMM模型就采用了状态为(B,E,M,S)这四种状态来标记中文词语,比如北京可以标注为BE,即 北/B 京/E,表示“北”是开始位置,“京”是结束位置,“中华民族”可以标注为BMME,就是开始-中间-中间-结束。地址文本标注结果如下:

参考链接:CRF++模型格式说明

三、实验结果

将训练好的文本模型替换原语料库的模型。在hanlp.properties中进行路径设置,
若选择模型替换,模型路径参数直接缺省即可。或者使用HanLP.Config.CRFCWSModelPath读取新模型路径。

以下两种方式调用CRF分词均可。

public static void main(String[] args) throws IOException {CRFLexicalAnalyzer segment = new CRFLexicalAnalyzer(HanLP.Config.CRFCWSModelPath);System.out.println(HanLP.Config.CRFCWSModelPath);segment.enablePartOfSpeechTagging(true);System.out.println(segment.seg("湖北省荆州市荆州区珞南街道金山路29-9号"));CRFSegmenter segmenter = new CRFSegmenter();List<String> wordList = segmenter.segment("湖北省荆州市荆州区荆秘路266-1号");System.out.println(wordList);}

实验结果如下,成功满足项目需要。

使用Java-Hanlp训练CRF模型相关推荐

  1. crf模型 java_定制你自己的CRF模型

    如何训练自己的CRF模型 Ansj从5.0版本之后支持训练自己的crf模型,在此之前虽然已经很早支持了CRF模型,但是在用户的自训练上要求苛刻,而且本身实现的CRF从性能到准确率都不如CRF++或者第 ...

  2. 自然语言处理(NLP)学习笔记——HMM与CRF模型

    一.HMM模型 1.HMM模型的输入和输出 HMM(Hidden Markov Model),中文称作隐含马尔可夫模型,因俄国数学家马尔可夫而得名.它一般以文本序列数据为输入,以该序列对应得隐含序列为 ...

  3. Java如何跨语言调用Python/R训练的模型

    在 如何使用sklearn进行在线实时预测(构建真实世界中可用的模型) 这篇文章中,我们使用 sklearn + flask 构建了一个实时预测的模型应用.无论是 sklearn 还是 flask,都 ...

  4. 定制你自己的CRF模型以及JAVA实现的Word2Vec模型和一些java版NLP的工具

    定制自己的CRF模型 JAVE 用户自定义词典 这个项目是一个基本包.封装了大多数nlp项目中常用工具 word2vec java版本的一个实现 CRF详解

  5. DeepLearning4j-使用Java训练YOLO模型

    DeepLearning4j-使用Java训练YOLO模型 在这个Yolo v3发布的大好日子. Deeplearning4j终于迎来了新的版本更新1.0.0-alpha,在zoo model中引入T ...

  6. JAVA训练nlp模型,完胜 BERT,谷歌最佳 NLP 预训练模型开源

    雷锋网 AI 源创评论按:近日,谷歌宣布将 AI 语言模型 ELECTRA 作为 TensorFlow 之上的开源模型发布.该方法用到了一种称为替换令牌检测(RTD)的新预训练任务,使其能够在从所有输 ...

  7. 开源自然语言处理工具包hanlp中CRF分词实现详解

     CRF简介 CRF是序列标注场景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗标记偏置的问题. [gerative-discriminative.png] CRF训练 这类耗时的任务,还 ...

  8. 零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)

    https://github.com/mali19064/LSTM-CRF-pytorch-faster 中文分词 说到命名实体抽取,先要了解一下基于字标注的中文分词. 比如一句话 "我爱北 ...

  9. HMM、MEMM、CRF模型比较和标注偏置问题(Label Bias Problem)

    本文转自:http://www.cnblogs.com/syx-1987/p/4077325.html 路径1-1-1-1的概率:0.4*0.45*0.5=0.09 路径2-2-2-2的概率:0.01 ...

最新文章

  1. 人造卫星为什么会绕着地球转而不是停在太空中或者越飞越远.掉进地球的卫星为什么烧不完....
  2. java数组复制的方式和效率比较
  3. vue生命周期详解、钩子函数的调用(简单易懂)
  4. stm32 vscode 编译_STM32开发之 VSCode+gcc环境编译
  5. C/C++ 头文件的作用和用法
  6. java 多个项目间事物_Java-web-多个独立项目之间相互调用实践
  7. Python 学习笔记【12】字典
  8. 基于matlab的16QAM调制解调仿真
  9. 计算机联锁 2x2,二乘二取二计算机联锁系统.pdf
  10. TCPMP播放器UI的修改方法
  11. 只有程序猿才知道的12个人艰不拆的真相
  12. 什么是AMD;什么是CMD
  13. linux串口工具 kermit,转:Linux下的串口工具kermit
  14. 2011高教社杯全国大学生数学建模竞赛题目(MATLAB)
  15. Cadence PSpice 教程 基础篇(转载)
  16. 宠物狗网页制作作业 保护动物网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
  17. Z370技嘉主板通过U盘刷BIOS和恢复MAC地址的方法
  18. 探索脑机接口技术的潜在医学应用
  19. R语言ARIMA集成模型预测时间序列分析
  20. python【数据结构与算法】一种判断哈密尔顿回路的解决方法

热门文章

  1. 'utf-8' codec can't decode byte 0xb5 in position : invalid start byte
  2. html5 苹果 dock,基于JQuery模仿苹果桌面的Dock效果(初级版)
  3. 新天绿色能源与建投国融续签温室气体减排项目协议
  4. 1080P、2k、4k、帧、fps等概念区别
  5. (Emitted value instead of an instance of Error) Do not use v-for index as key on <transition-group>
  6. 婴儿监护物联网系统设计系统源码开放
  7. Tika 1.16架构及核心模块
  8. mybatis替代mysql_怎样将mybatis替换成nutz,求大神指导
  9. 腾讯可信区块链方案白皮书 QA
  10. 学会感谢--谈辞职信的写法