ik分词器 远程扩展字典 java ik分词器 分词原理_分词器


分词是自然语言处理的第一步,这里主要从序列标注的角度递进介绍HMM如何实现分词,然后介绍分词工具的使用,在NLP中,分词、词性标注和命名实体识别都属于标注任务,也就是对token进行分词,对于分词任务难点有以下几个:

  1. 新词的发现

未登陆此(人名、地名、商标名、公司名称)

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. 隐马尔科夫概率模型


ik分词器 远程扩展字典 java ik分词器 分词原理_分词器_02


这两张图比较简单,这里我们暂时只考虑最简单的一阶马尔科夫模型。

第二张图中的A,B向量也就是我们需要从训练师数据中获得的内容,下面从代码的角度对这个问题进行说明:

1.数据准备——已分好词的语料


ik分词器 远程扩展字典 java ik分词器 分词原理_最大匹配_03


2.根据语料统计转移概率矩阵A和混淆矩阵B,这里进行详细说明

- 对于每个词我们都会按照如下方式为他打上标签:


ik分词器 远程扩展字典 java ik分词器 分词原理_分词器_04


- 根据语料我们会统计四个参数:

1.label的转移概率矩阵,也就是A矩阵:


ik分词器 远程扩展字典 java ik分词器 分词原理_ik分词器 远程扩展字典 java_05


2.每个词中的字出现过的状态:


ik分词器 远程扩展字典 java ik分词器 分词原理_ik分词器 远程扩展字典 java_06


例如“,”就只有s这一种状态

3.接下来就统计每个状态对应的每个字出现过的频率,利用这个频次计算混淆概率B


ik分词器 远程扩展字典 java ik分词器 分词原理_ik分词器 分词原理_07


4.计算下每个label出现的次数


ik分词器 远程扩展字典 java ik分词器 分词原理_最大匹配_08


5.统计下y0,也就是初始状态的概率,显然M,E不可能出现在开头


ik分词器 远程扩展字典 java ik分词器 分词原理_ik分词器 远程扩展字典 java_09


将上述统计值转为频率值,就是最开始PPT中的A,B,y0矩阵

上述的统计值就是我们得到的HMM模型参数,接下来就利用维特比算法来进行decode,维特比的原理大致如下:


ik分词器 远程扩展字典 java ik分词器 分词原理_分词器_10


注意网上好多HMM的维特比解码算法是错误的,无法处理未登录词,主要是对于未登录词的处理,详细过程见代码。

这里可以看一下分词结果!


ik分词器 远程扩展字典 java ik分词器 分词原理_未登录词_11


这只是一个练手的小Demo。

使用海量分词

这里给出海量分词的下载路径,里面的doc文件夹有python接口的使用方式,详细例子见代码hlseg/test.py,这里有些注意事项:


ik分词器 远程扩展字典 java ik分词器 分词原理_ik分词器 分词原理_12


-使用海量分词首先要设置JDK,注意红色部分的说明

- 黄色部分就是压缩包中的lib下的文件路径

- test.py 中给出了分词添加字典和控制分词粒度的代码