版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/meiqi0538/article/details/86181846

本部分内容部分来自:https://github.com/lancopku/PKUSeg-python

1.前言

最近看到一些博文介绍了北大的一个开源的中文分词工具包pkuseg。其中说到,它在多个分词数据集上都有非常高的分词准确率,我们所知道的,也经常使用的结巴分词误差率高达 18.55% 和 20.42,而北大的 pkuseg 只有 3.25% 与 4.32%。当然还有其他的分词工具,如:清华大学的THULAC,HanLp,pynlpir等工具。分词的重要性不言而喻,在看到相关介绍后也在第一时间去尝试一下,以下根据github开源信息做出实验,其使用的语言是python。github地址为:https://github.com/lancopku/PKUSeg-python。

2.简介

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

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

3.工具使用

3.1安装

方式1.程序包下载安装

pip install pkuseg
之后通过import pkuseg来引用
  • 1
  • 2

方式2.从github下载(需要下载模型文件)

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

3.2代码示例

1.使用默认模型及默认词典分词

在实际测试中,第一次加载模型时间比较长,并且分词的结果也没有给出各个词语的词性,如下图:

2.设置用户自定义词典

在实际测试中,可以看出,自定义词典确实起到作用,但是这个处理时间似乎有点小长,默认词典与自定义词典比较,代码如下

import pkuseg

lexicon = [‘北京大学’, ‘北京天安门’] #希望分词时用户词典中的词固定不分开
segDefault = pkuseg.pkuseg() #默认分词类型
seg = pkuseg.pkuseg(user_dict=lexicon) #加载模型,给定用户词典
textDefault = segDefault.cut(‘我爱北京天安门’) #进行分词
text = seg.cut(‘我爱北京天安门’) #进行分词
print(textDefault)
print(text)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行结果如下:

loading model
finish
loading model
finish
['我', '爱', '北京', '天安门']
['我', '爱', '北京天安门']
[Finished in 40.2s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.模型训练

训练模型是需要解压的,具体内容可参考github上的内容,其中代码如下:

import pkuseg

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

  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

loading model
finish
['我', '爱', '北京', '天安门']
[Finished in 24.6s]
  • 1
  • 2
  • 3
  • 4

4.对于大型文本数据集,如果需要快速分词的话,我们也可以采用多线程的方式

读取文件,并将分词结果输出到一个文件中,在进行测试的时候,几经报错,也可没出结果,获取我的系统配置有问题,或者输入文件有问题,或者…这里就抛砖引玉,希望大牛能够调出来,代码如下:

import pkuseg

#对input.txt的文件分词输出到output.txt中,使用默认模型和词典,开20个进程
pkuseg.test(‘input.txt’, ‘output.txt’, nthread=20)

  • 1
  • 2
  • 3
  • 4

运行结果:

loading model
finish
Traceback (most recent call last):File "<string>", line 1, in <module>File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 105, in spawn_mainexitcode = _main(fd)File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 114, in _mainprepare(preparation_data)File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 225, in prepare_fixup_main_from_path(data['init_main_from_path'])File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_pathrun_name="__mp_main__")File "C:\Development\Python\Anaconda3\lib\runpy.py", line 263, in run_pathpkg_name=pkg_name, script_name=fname)File "C:\Development\Python\Anaconda3\lib\runpy.py", line 96, in _run_module_codemod_name, mod_spec, pkg_name, script_name)File "C:\Development\Python\Anaconda3\lib\runpy.py", line 85, in _run_codeexec(code, run_globals)File "C:\Users\JackPi\Desktop\test\pkusegtest\test.py", line 10, in <module>pkuseg.test('input.txt', 'output.txt', nthread=20)   File "C:\Development\Python\Anaconda3\lib\site-packages\pkuseg\__init__.py", line 263, in testp.start()File "C:\Development\Python\Anaconda3\lib\multiprocessing\process.py", line 105, in startself._popen = self._Popen(self)File "C:\Development\Python\Anaconda3\lib\multiprocessing\context.py", line 223, in _Popenreturn _default_context.get_context().Process._Popen(process_obj)File "C:\Development\Python\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popenreturn Popen(process_obj)File "C:\Development\Python\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__prep_data = spawn.get_preparation_data(process_obj._name)File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 143, in get_preparation_data_check_not_importing_main()File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_mainis not going to be frozen to produce an executable.''')
RuntimeError: An attempt has been made to start a new process before thecurrent process has finished its bootstrapping phase.
    This probably means that you are not using fork to start yourchild processes and you have forgotten to use the proper idiomin the main module:if __name__ == '__main__':freeze_support()...The "freeze_support()" line can be omitted if the programis not going to be frozen to produce an executable.

loading model
finish
Traceback (most recent call last):
File “C:\Users\JackPi\Desktop\test\pkusegtest\test.py”, line 10, in <module>
pkuseg.test(‘input.txt’, ‘output.txt’, nthread=20)
File “C:\Development\Python\Anaconda3\lib\site-packages\pkuseg_init_.py”, line 263, in test
p.start()
File “C:\Development\Python\Anaconda3\lib\multiprocessing\process.py”, line 105, in start
self._popen = self._Popen(self)
File “C:\Development\Python\Anaconda3\lib\multiprocessing\context.py”, line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File “C:\Development\Python\Anaconda3\lib\multiprocessing\context.py”, line 322, in _Popen
return Popen(process_obj)
File “C:\Development\Python\Anaconda3\lib\multiprocessing\popen_spawn_win32.py”, line 65, in init
reduction.dump(process_obj, to_child)
File “C:\Development\Python\Anaconda3\lib\multiprocessing\reduction.py”, line 60, in dump
ForkingPickler(file, protocol).dump(obj)
BrokenPipeError: [Errno 32] Broken pipe
[Finished in 42.5s]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

其中的input.txt中的内容为:

外星文明探索是一个很特殊的学科,它对研究者的人生观影响很大。夜深人静的时候,从耳机中听着来自宇宙没有生命的噪音,这噪音隐隐约约的,好像比那些星星还永恒;有时又觉得那声音像大兴安岭的冬天里没完没了的寒风,让我感到很冷,那种孤独真是没法形容。地球生命真的是宇宙中偶然里的偶然,人类是这空荡荡的大殿里唯一一只蚂蚁。有时觉得生命真珍贵,一切都重如泰山;有时又觉得人是那么渺小,什么都不值一提。
  • 1

5.重新训练一个分词模型

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

这里我就没有去测试,感兴趣的可以去尝试一下。

6.参数说明

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 训练时开的进程数

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4 各类分词工具包性能比较

在进行比较之前需要说明以下预训练模型

分词模式下,用户需要加载预训练好的模型。这里提供了三种在不同类型数据上训练得到的模型,根据具体需要,用户可以选择不同的预训练模型。以下是对预训练模型的说明:

MSRA: 在MSRA(新闻语料)上训练的模型。新版本代码采用的是此模型。

CTB8: 在CTB8(新闻文本及网络文本的混合型语料)上训练的模型。

WEIBO: 在微博(网络文本语料)上训练的模型。

其中,MSRA数据由第二届国际汉语分词评测比赛提供,CTB8数据由LDC提供,WEIBO数据由NLPCC分词比赛提供。

具体比较

官方数据中:在比较中选择THULAC、结巴分词等国内代表分词工具包与pkuseg做性能比较,测试环境选择Linux,在新闻数据(MSRA)和混合型文本(CTB8)数据上对不同工具包进行了准确率测试(数据在github上,可下载)。该比较使用了第二届国际汉语分词评测比赛提供的分词评价脚本。评测结果如下:

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%)

通过上面的数据,可以说明jieba分词的准确率最低,清华大学的THULAC的准确率也没有pkuseg高。但是,我们需要注意的是:北大的这个分词工具是经过这些数据训练出来的,准确率高也是情理之中的事情。真正的好不好,就看使用者的反馈了。

5 相关论文及作者

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

2.作者

Ruixuan Luo (罗睿轩), Jingjing Xu(许晶晶), Xu Sun (孙栩)

6 总结

从客观来看,该工具还是存在缺点的,虽然官方给出的准确率很高,但是在实际分词过程中,花费时间长,系统稳定性低,分词结果也不可以显示分词的词性,综合来讲与当前成熟的开源的分词工具还是有一定的差距,但是也不否定该工具具有的亮点,以及其非常高的准确性。分词是自然语言处理中底层并且非常重要的一环,当前做得也是比较成熟了,但是也存在很多缺陷,也是一个研究的方向。个人认为,真正做自然语言处理,到最后依然是需要回归到语言到底是什么,语言是如何发出的,语言的发展等等,当今基于统计的自然语言处理不容置疑也确实做出不错的成绩,但基本上都是基于语料的,模型训练的等等。在自然语言处理这一交叉学科上,其发展依然任重而道远,不能一味地崇拜机器学习,深度学习,回归语言本质,用数学的方式进行处理也将会是未来研究的方向。

                                </div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet"></div>![在这里插入图片描述](https://img-blog.csdnimg.cn/20190909125246482.jpg)![在这里插入图片描述](https://img-blog.csdnimg.cn/2019090912525664.jpg)

北京大学开源分词工具pkuseg 初试与使用感受相关推荐

  1. Python工具包-分词工具pkuseg

    pkuseg使用 简介 最近社区推了一些文章介绍了北大开源的一个新的中文分词工具包pkuseg.它在多个分词数据集上都有非常高的分词准确率.其中广泛使用的结巴分词(jieba)误差率高达18.55%和 ...

  2. 几种开源分词工具的比較

    搜集了一些资料,与同学一起进行了简单的測试,总结例如以下. 分词工  具 特点 支持语言 原理 词典及扩展性 StandardAnalyzer 中文.英文(unicode) 中文:单字符切分 英文:依 ...

  3. 几种开源分词工具的比较

    搜集了一些资料,与同学一起进行了简单的测试,总结如下. 分词工  具 特点 支持语言 原理 词典及扩展性 StandardAnalyzer 中文.英文(unicode) 中文:单字符切分 英文:根据空 ...

  4. 开源词法分析工具LAC重大升级!打造属于自己的个性化分词器!

    星标/置顶小屋,带你解锁 最萌最前沿的NLP.搜索与推荐技术 文 | 匿名大佬 编 |  北大小才女小轶 本文将为大家介绍如何使用百度开源的词法分析工具LAC实现个性化分词(附代码),并展示LAC在各 ...

  5. java端分词工具ANSJ插件的基本使用

    前言: Java有11大开源中文分词器,分别是word分词器,Ansj分词器,Stanford分词器,FudanNLP分词器,Jieba分词器,Jcseg分词器,MMSeg4j分词器,IKAnalyz ...

  6. 大数据工具:IKAnalyzer分词工具介绍与使用

    简单介绍IKAnalyzer分词工具与使用 文章目录 简介 IKAnalyzer的引入使用 IK的两个重要词典 IK的使用 简介 以下简介参考前辈和项目文档介绍 为什么要分词呢,当大数据处理中要提取语 ...

  7. 准确率创新高,北大开源中文分词工具包 pkuseg

    北京大学近日开源了一个全新的中文分词工具包 pkuseg ,相比于现有的同类开源工具,pkuseg 大幅提高了分词的准确率. pkuseg 由北大语言计算与机器学习研究组研制推出,具备如下特性: 高分 ...

  8. jieba textrank关键词提取 python_五款中文分词工具在线PK: Jieba, SnowNLP, PkuSeg,THULAC, HanLP...

    最近玩公众号会话停不下来:玩转腾讯词向量:Game of Words(词语的加减游戏),准备把NLP相关的模块搬到线上,准确的说,搬到AINLP公众号后台对话,所以,趁着劳动节假期,给AINLP公众号 ...

  9. python 分词工具对比_五款中文分词工具在线PK: Jieba, SnowNLP, PkuSeg, THULAC, HanLP

    最近玩公众号会话停不下来: 玩转腾讯词向量:Game of Words(词语的加减游戏) ,准备把NLP相关的模块搬到线上,准确的说,搬到AINLP公众号后台对话,所以,趁着劳动节假期,给AINLP公 ...

最新文章

  1. legend3---lavarel中使用qq邮箱发送邮件
  2. 数据库性能调优之后,进一步的验证和分析
  3. iOS 删除、重新排序xcdatamodel
  4. 1线程概念:线程和进程之间的关系,线程间可共享资源,线程间非共享资源,线程的优缺点
  5. 【UVA - 11383】Claw Golden Tiger (二分图最优匹配,KM算法原理)
  6. LeetCode 135 分发糖果
  7. 构建ASP.NET网站十大必备工具
  8. 吴恩达深度学习 —— 2.13 逻辑回归的向量化
  9. Resnet-18-训练实验-warm up操作
  10. 如何开发神经网络来预测汽车保险支出
  11. 毕设题目:Matlab图像融合
  12. Barrett And Montgomery of Polynomials
  13. virtualbox安装步骤
  14. 讯飞离线语音合成(语记|语音+)
  15. 使用 mesh 实现多边形裁剪图片!Cocos Creator!
  16. h5新语义化标签(重要)
  17. 怎样更改计算机管理员用户名,Administrator怎么修改账户用户名教程
  18. 大阪第14天——韩寒同学语录
  19. 华为路由器和交换机在BootROM下清除Console口密码
  20. win10怎么把屏幕分成多个屏幕 win10把屏幕分成多个屏幕方法

热门文章

  1. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型
  2. Go 知识点(08) — 对未初始化的 channel 进行读写操作
  3. python实现二叉树的重建1 之由前序遍历和中序遍历重建
  4. tryexceptelse可以嵌套
  5. 各种优化算法公式快速回忆优化器-深度学习
  6. 白化(预处理步骤)【转】
  7. Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10
  8. LeetCode简单题之连续字符
  9. GPU、AI芯片技术市场分析
  10. GPU上的图像和信号处理