分词是自然语言处理的第一步,这里主要从序列标注的角度递进介绍HMM如何实现分词,然后介绍分词工具的使用,在NLP中,分词、词性标注和命名实体识别都属于标注任务,也就是对token进行分词,对于分词任务难点有以下几个:
- 新词的发现
未登陆此(人名、地名、商标名、公司名称)
2. 词典与算法优先级
我们 中信 仰 佛教 的 人
3. 歧义(颗粒度、交集等)
股份 有限公司 、郑州天和服装厂
分词的算法大致分为两种:
1.基于词典的分词算法
正向最大匹配算法
逆向最大匹配算法
双向匹配分词法
2.基于统计的机器学习算法
HMM、CRF、SVM、LSTM+CRF
这里列出一些开源的分词系统:
语义分析系统 NLPchina/ansj_segHIT-SCIR/ltp清华大学
The Stanford Natural Language Processing GroupHanlp分词器
yanyiwu/cppjiebakoth/kcws
frcchang/zpar
wks/ik-analyzer
接下来采取理论与代码相结合的方式,介绍HMM分词器的使用:
2. 隐马尔科夫概率模型
这两张图比较简单,这里我们暂时只考虑最简单的一阶马尔科夫模型。
第二张图中的A,B向量也就是我们需要从训练师数据中获得的内容,下面从代码的角度对这个问题进行说明:
1.数据准备——已分好词的语料
2.根据语料统计转移概率矩阵A和混淆矩阵B,这里进行详细说明
- 对于每个词我们都会按照如下方式为他打上标签:
- 根据语料我们会统计四个参数:
1.label的转移概率矩阵,也就是A矩阵:
2.每个词中的字出现过的状态:
例如“,”就只有s这一种状态
3.接下来就统计每个状态对应的每个字出现过的频率,利用这个频次计算混淆概率B
4.计算下每个label出现的次数
5.统计下y0,也就是初始状态的概率,显然M,E不可能出现在开头
将上述统计值转为频率值,就是最开始PPT中的A,B,y0矩阵
上述的统计值就是我们得到的HMM模型参数,接下来就利用维特比算法来进行decode,维特比的原理大致如下:
注意网上好多HMM的维特比解码算法是错误的,无法处理未登录词,主要是对于未登录词的处理,详细过程见代码。
这里可以看一下分词结果!
这只是一个练手的小Demo。
使用海量分词
这里给出海量分词的下载路径,里面的doc文件夹有python接口的使用方式,详细例子见代码hlseg/test.py,这里有些注意事项:
-使用海量分词首先要设置JDK,注意红色部分的说明
- 黄色部分就是压缩包中的lib下的文件路径
- test.py 中给出了分词添加字典和控制分词粒度的代码