中文分词工具盘点:FoolNLTK

26 sec read

FoolNLTK简介

FoolNLTK是一个使用双向 LSTM (BiLSTM 模型)构建的便捷的中文处理工具包,该工具不仅可以实现分词、词性标注和命名实体识别,同时还能使用用户自定义字典加强分词的效果。根据该项目所述,这个中文工具包可能不是最快的开源中文分词,但很可能是最准的开源中文分词。

BiLSTM 模型简介

如该项目所述,作者使用了双向 LSTM 来构建整个模型,这也许是作者对分词性能非常有信心的原因。在中文分词上,基于神经网络的方法,往往使用「字向量 + 双向 LSTM + CRF」模型,利用神经网络来学习特征,将传统 CRF 中的人工特征工程量将到最低。

中文分词系统的一般神经网络架构,其中特征层就是使用的 LSTM,来源 Xinchi Chen et al.(2017)。除了该工具包所使用的深度方法,其实今年 ACL 的杰出论文就有一篇专门描述了分词方法。复旦大学的陈新驰、施展、邱锡鹏和黄萱菁在 Adversarial Multi-Criteria Learning for Chinese Word Segmentation 论文中提出了一个新框架,可以利用多标准的中文分词语料进行训练。因为该工具包主要使用的是双向 LSTM,所以我们先简要解释一下这种网络再讨论我们测试的分词效果。首先顾名思义,双向 LSTM 结合了从序列起点开始移动的 LSTM 和另一个从序列末端开始移动的 LSTM。其中正向和逆向的循环网络都由一个个 LSTM 单元组成。以下是 LSTM 单元的详细结构,其中 Z 为输入部分,Z_i、Z_o 和 Z_f 分别为控制三个门的值,即它们会通过激活函数 f 对输入信息进行筛选。一般激活函数可以选择为 Sigmoid 函数,因为它的输出值为 0 到 1,即表示这三个门被打开的程度。

若我们输入 Z,那么该输入向量通过激活函数得到的 g(Z) 和输入门 f(Z_i ) 的乘积 g(Z) f(Z_i ) 就表示输入数据经筛选后所保留的信息。Z_f 控制的遗忘门将控制以前记忆的信息到底需要保留多少,保留的记忆可以用方程 c*f(z_f)表示。以前保留的信息加上当前输入有意义的信息将会保留至下一个 LSTM 单元,即我们可以用 c’ = g(Z)f(Z_i) + cf(z_f) 表示更新的记忆,更新的记忆 c’ 也表示前面与当前所保留的全部有用信息。我们再取这一更新记忆的激活值 h(c’) 作为可能的输出,一般可以选择 tanh 激活函数。最后剩下的就是由 Z_o 所控制的输出门,它决定当前记忆所激活的输出到底哪些是有用的。因此最终 LSTM 的输出就可以表示为 a = h(c’)f(Z_o)。若我们将这一系列 LSTM 单元组织为如下形式,那么它们就构成了一个 BiLSTM 网络:

如上所示,我们将两个反向读取的 LSTM 网络连接就成了 BiLSTM。如果我们同时训练正向 LSTM 与逆向 LSTM,并把这两个循环网络的隐藏层拿出来都接入一个输出层,那么我们就能得到最后的输出结果 y。使用这种 BiLSTM 的好处是模型的观察范围比较广,因为当我们只采用单向循环网络时,在时间步 t+1 只能观察到 x_t 以及之前的输入数据,而不能观察到 x_t+2 及之后的情况。而当我们使用双向循环网络,模型在每一个时间步都会观察全部的输入序列,从而决定最后的输出。

FoolNLTK的安装

官方提供的安装方式是直接使用 pip install foolnltk 进行安装,但我安装完后执行却报如下错误:

导致此问题的原因是foolnltk的后端使用的是tensorflow,与已经安装的tersorflow 2.0.2版本不兼容,解决方案:

FoolNLTK的使用

示例代码:

输出:

参考链接:

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

如何选择scikit-learn中的算法

scikit-learn中自带了很多机器学习的算法,在日常使用过程中可能产生疑问,以下2张图获取可以帮助你解决
标点符
0 sec read

斯坦福大学的词向量工具:GloVe

GloVe简介 GloVe的全称叫Global Vectors for Word Representation
标点符
2 min read

深入理解fbprophet

Prophet简介 在先前的文章中简单介绍了Facebook的prophet,最近在使用prophet的时候遇
标点符
5 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注