NLP系列(一)pkuseg-python:一个高准确度的中文分词工具包

2019-02-13 10:16:29 浏览数 (1)

1 简介

pkuseg-python简单易用,支持多领域分词,在不同领域的数据上都大幅提高了分词的准确率。

pkuseg是由北京大学语言计算与机器学习研究组研制推出的一套全新的中文分词工具包。pkuseg具有如下几个特点:

  1. 高分词准确率。相比于其他的分词工具包,我们的工具包在不同领域的数据上都大幅提高了分词的准确度。根据我们的测试结果,pkuseg分别在示例数据集(MSRA和CTB8)上降低了79.33%和63.67%的分词错误率。
  2. 多领域分词。我们训练了多种不同领域的分词模型。根据待分词的领域特点,用户可以自由地选择不同的模型。
  3. 支持用户自训练模型。支持用户使用全新的标注数据进行训练。

2 编译和安装

  1. 通过pip下载(自带模型文件)

pip install pkuseg 之后通过import pkuseg来引用

  1. 从github下载(需要下载模型文件,见预训练模型)

将pkuseg文件放到目录下,通过import pkuseg使用 模型需要下载或自己训练。

3 性能对比

pkuseg官方给出与来自清华的THULAC和目前主流中文分词工具jieba的比较效果,pkuseg的准确率远超于THULAC和jieba。

实验人员选择Linux作为测试环境,在新闻数据(MSRA)和混合型文本(CTB8)数据上对不同工具包进行了准确率测试,使用了第二届国际汉语分词评测比赛提供的分词评价脚本。评测结果如下:

MSRA

F-score

Error Rate

jieba

81.45

18.55

THULAC

85.48

14.52

pkuseg

96.75 ( 13.18%)

3.25 (-77.62%)

CTB8

F-score

Error Rate

jieba

79.58

20.42

THULAC

87.77

12.23

pkuseg

95.64 ( 8.97%)

4.36 (-64.35%)

我们可以看到从F1-Score和错误率上,pkuseg都明显优于另外两者

4 使用教程

代码实例1 使用默认模型及默认词典分词

代码语言:javascript复制
import pkuseg
seg = pkuseg.pkuseg() #以默认配置加载模型
text = seg.cut('我爱北京天安门') #进行分词
print(text)
代码语言:javascript复制
loading model
finish
['我', '爱', '北京', '天安门']

代码示例2 设置用户自定义词典

代码语言:javascript复制
import pkuseg
lexicon = ['北京大学', '北京天安门'] #希望分词时用户词典中的词固定不分开
seg = pkuseg.pkuseg(user_dict=lexicon)  #加载模型,给定用户词典
text = seg.cut('我爱北京天安门')       #进行分词
print(text)
代码语言:javascript复制
loading model
finish
['我', '爱', '北京天安门']

代码示例3 指定模型

默认情况下,pkuseg使用的预模型是msra

代码语言:javascript复制
import pkuseg
seg = pkuseg.pkuseg(model_name='ctb8') #假设用户已经下载好了ctb8的模型并放在了'./ctb8'目录下,通过设置model_name加载该模型
text = seg.cut('我爱北京天安门') #进行分词
print(text)
代码语言:javascript复制
loading model
finish
['我', '爱', '北京', '天安门']

代码示例4 支持多线程

可以指定输入和输出文件,直接从输入读取文本,将分词结果输出到结果文件

代码语言:javascript复制
import pkuseg
pkuseg.test('data/input.txt', 'data/output.txt', nthread=20) #对input.txt的文件分词输出到output.txt中,使用默认模型和词典,开20个进程
代码语言:javascript复制
loading model
finish
Total time: 128.30054664611816

刚开始input.txt只有一句话用了两分钟。另外怀疑时间不是按句子个数线性增加的,然后又向input.txt添了一篇文章,差不多100句话也是两分钟

代码示例5 训练模型

这部分因为还没确定msr_training.utf8里面数据的格式,没有训练集,先不做测试

代码语言:javascript复制
import pkuseg
#训练文件为'msr_training.utf8',测试文件为'msr_test_gold.utf8',模型存到'./models'目录下,开20个进程训练模型
pkuseg.train('msr_training.utf8', 'msr_test_gold.utf8', './models', nthread=20) 

5 参数说明

代码语言:javascript复制
pkuseg.pkuseg(model_name='msra', user_dict='safe_lexicon')
model_name      模型路径。默认是'msra'表示我们预训练好的模型(仅对pip下载的用户)。用户可以填自己下载或训练的模型所在的路径如model_name='./models'。
user_dict       设置用户词典。默认为'safe_lexicon'表示我们提供的一个中文词典(仅pip)。用户可以传入一个包含若干自定义单词的迭代器。
代码语言:javascript复制
pkuseg.test(readFile, outputFile, model_name='msra', user_dict='safe_lexicon', nthread=10)
readFile        输入文件路径
outputFile      输出文件路径
model_name      同pkuseg.pkuseg
user_dict       同pkuseg.pkuseg
nthread         测试时开的进程数
代码语言:javascript复制
pkuseg.train(trainFile, testFile, savedir, nthread=10)
trainFile       训练文件路径
testFile        测试文件路径
savedir         训练模型的保存路径
nthread         训练时开的进程数

6 相关论文

本工具包基于以下文献:

  • Xu Sun, Houfeng Wang, Wenjie Li. Fast Online Training with Frequency-Adaptive Learning Rates for Chinese Word Segmentation and New Word Detection. ACL. 253–262. 2012
  • Jingjing Xu, Xu Sun. Dependency-based Gated Recursive Neural Network for Chinese Word Segmentation. ACL 2016: 567-572

7 客观看待

  • 第一条 与其余分词工具包的性能对比是否公平

针对这个问题,有人也在issue提出了质疑,有兴趣大家可以看下,这里不做过多评价

  • 第二条 不支持词性标注 感觉这个可以和jieba结合使用,分完词之后空格隔开,然后jieba再进行一次词性标注(未验证)。

欢迎大家关注我的简书 致Great

0 人点赞