Press "Enter" to skip to content

中文分词工具盘点:FoolNLTK

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

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 进行安装,但我安装完后执行却报如下错误:

 

Traceback (most recent call last):
  File "D:/CodeHub/NLP/test_new.py", line 1, in <module>
    import fool
  File "D:\CodeHub\NLP\venv\lib\site-packages\fool\__init__.py", line 10, in <module>
    from fool import lexical
  File "D:\CodeHub\NLP\venv\lib\site-packages\fool\lexical.py", line 8, in <module>
    from fool.predictor import Predictor
  File "D:\CodeHub\NLP\venv\lib\site-packages\fool\predictor.py", line 8, in <module>
    from tensorflow.contrib.crf import viterbi_decode
ModuleNotFoundError: No module named 'tensorflow.contrib'

 

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

 

pip uninstall tensorflow
pip install tensorflow==1.15

 

FoolNLTK的使用

 

示例代码:

 

import fool
 
sentence = "中文分词测试:我爱北京天安门"
 
print(fool.cut(sentence))  # 
print(fool.pos_cut(sentence))  # 词性标注
print(fool.analysis(sentence)[1]) # 明名实体识别

 

 

[['', '分词', '测试', ':', '我', '爱', '北京', '天安', '门']]
[[('中文', 'nz'), ('分词', 'n'), ('测试', 'n'), (':', 'wm'), ('我', 'r'), ('爱', 'v'), ('北京', 'ns'), ('天安', 'nz'), ('门', 'n')]]
[[(9, 15, 'company', '北京天安门')]]

 

参考链接:

https://github.com/rockyzhengwu/FoolNLTK
https://www.jiqizhixin.com/articles/2017-12-28

Be First to Comment

发表评论

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