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

1 简介

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

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

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

2 编译和安装

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

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

从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%)
MSRA 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 使用默认模型及默认词典分词

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

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

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

代码示例3 指定模型

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

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

代码示例4 支持多线程

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

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

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

代码示例5 训练模型

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

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

5 参数说明

pkuseg.pkuseg(model_name='msra', user_dict='safe_lexicon')
model_name      模型路径。默认是'msra'表示我们预训练好的模型(仅对pip下载的用户)。
用户可以填自己下载或训练的模型所在的路径如model_name='./models'。
user_dict       设置用户词典。默认为'safe_lexicon'表示我们提供的一个中文词典(仅pip)。
用户可以传入一个包含若干自定义单词的迭代器。


pkuseg.test(readFile, outputFile, model_name='msra', user_dict='safe_lexicon', nthread=10)
readFile        输入文件路径
outputFile      输出文件路径
model_name      同pkuseg.pkuseg
user_dict       同pkuseg.pkuseg
nthread         测试时开的进程数
pkuseg.train(trainFile, testFile, savedir, nthread=10)
trainFile       训练文件路径
testFile        测试文件路径
savedir         训练模型的保存路径
nthread         训练时开的进程数

迭代器(iterator)

是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,
每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,
所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。
然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

6 相关论文

本工具包基于以下文献:

  1. 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
  2. Jingjing Xu, Xu Sun. Dependency-based Gated Recursive Neural Network for Chinese Word Segmentation. ACL 2016: 567-572

Python3 filter() 函数

Python3 内置函数 Python3 内置函数

描述
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

语法
以下是 filter() 方法的语法:

filter(function, iterable)

#!/usr/bin/python3
 
def is_odd(n):
    return n % 2 == 1
 
tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
newlist = list(tmplist)
print(newlist)
发布了157 篇原创文章 · 获赞 94 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_42462804/article/details/105022456
今日推荐