雾雨人偶店

hanLP学习笔记总结

为时两周的学习,总算是把hanlp和NLP的感知机部分基本概念和用法吃透了,在这里记录一下。

首先项目地址:https://github.com/hankcs/HanLP

参考文献:邓知龙 《基于感知器算法的高效中文分词与词性标注系统设计与实现》


  • 文献简述:

该文献并不是针对感知机的介绍,主要的NLP方法还是基于统计的,在该文中还加上的外挂词典以自适应。感知机只是做了锦上添花的事情,也就是传说中的在线学习和并行计算


对文献的第一遍解读之后画了一个架构图,现在看看虽然有一部分是错的但是觉得这种读两遍就有新见解的过程还挺有趣,还是记录一下。


ps:基于统计的方法和词典应该在感知机模型之外


  • 多领域分词及识别:

看了所有hanlp的issue,总结如下。

难点:大规模语料获取与标注

小规模:自定义词典/在线学习

//用户词典无法记忆

大规模1:Stacked Learning//效果不佳,语料重合度高时可用

大规模2:感知机训练。

初始语料→初始模型

               ↓

          新增语料→增量模型

//效果不佳,不如直接训练增量语料,语料重合度高时可用

//可以配合词典、增加语料规模等提高准确率

//训练语料需有标注

大规模3:标注模型对行业语料进行分词、标注,手动修正关键词

//标注集不同,无法在线学习。

里面所说的效果不佳是指准确率没有提升很多,因为本身不用感知机的分词就已经有95%左右的准确率了。


  • 感知机

目标:超平面线性可分(二分类

损失函数:所有错误点到超平面的总距离,最小为0

距离:点到平面的距离 推广到超平面

//损失函数的参数加上梯度上升的反方向,于是就梯度下降了。

//由于损失函数中仅包含错误点,所以有在线学习功能?

收敛:误分类次数收敛

BMES4分类问题:开头、中间、结尾、独立

朴素感知机:损失函数为错误点的个数,无法在线学习,无法求导下降

平均感知机:n个模型的平均权值

语言模型:HMM序列特征标注+viterbi搜索/解码

特征:字符序列为x,标注序列为y。


  • hanlp训练全过程:

不多废话,上图


总得来说就是分为分词、词性标注、实体提取三条任务线,三条线可以分别进行,也可以一起进行之后用一个感知机的analyze来识别。

值得注意的是在线学习如果想要保存结果,必须在一个基础模型上进行序列化,这也就是在线学习的优点所在,在没有基础模型的时候,在线学习是无法保存的,只能在内存中运行。


一点笔记:

NERTrainerTest.java

输入:语料格式txt文本

输出:模型文件.bin

Demo:PLA

输入:1-3个模型文件.bin

输出:分词+标注+实体命名识别

PerceptronTrainer.java是训练基类

其中train函数的输入即为模型训练参数

分词训练CWRTrainer中

//无预处理的语料除了as均可通过

//相同词性的实体可能会被之前的人名、地名、机构名所覆盖,新建实体时需要与人、地、机构相当数量的标注or注释掉对应的人、地、机构

//感知机不可能在线学习标注集之外的标签

//PerceptronLexicalAnalyzer支持自定义词典



  • 训练功能设计:

后端大佬暂时不认同我的方法,那我就先自己记下来,以后要用也好想起来。

1、输入文档

2、自动分词及识别

3、用户修改

3.1增加为词典

3.2分词在线学习(learn到bin文件)

3.3词性标注在线学习(learn到bin文件)

3.4新实体重新训练

这个过程比较麻烦下面详细说。

首先要明确,一次在线学习只能为一种功能学习,也就是分词、词性标注、实体提取必须要分次进行。如果用户想一次进行多种学习,必须要限制掉。

其次,在线学习的实体提取功能,是无法把用户想要新加入的实体学习到的,新实体学习训练必须从文本开始重新训练,如果只做在线学习,那么只能在当前文本中学习原模型中已有的实体。

所以,必须在本地or服务器上存一个实体语料文档,并且每次有新实体待提取的时候,就把当前文档续在语料文档的后面,然后整体进行重新训练,并加入所需新实体的标注。当然这个过程会越来越长,但是准确度也会越来越高。

最后,训练语料文本必须是按照格式标注好的才能进训练机,所以基础语料可以先放一个开源语料文件,后续添加的时候,原文是标注好的,新文本是当前分词功能大致分好,以及用户手动标注的,合在一起之后也能保证语料的格式。






评论(1)