Python中文分词库jieba,pkusegwg性能准确度比较


Posted in Python onFebruary 11, 2020

Python中文分词库jieba,pkusegwg性能准确度比较

中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组。英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文分词难度高很多。

分词主要用于NLP 自然语言处理(Natural Language Processing),使用场景有:

  • 搜索优化,关键词提取(百度指数)
  • 语义分析,智能问答系统(客服系统)
  • 非结构化文本媒体内容,如社交信息(微博热榜)
  • 文本聚类,根据内容生成分类(行业分类)

Python的中文分词

Python的中文分词库有很多,常见的有:

  • jieba(结巴分词)
  • THULAC(清华大学自然语言处理与社会人文计算实验室)
  • pkuseg(北京大学语言计算与机器学习研究组)
  • SnowNLP
  • pynlpir
  • CoreNLP
  • pyltp

通常前三个是比较经常见到的,主要在易用性/准确率/性能都还不错。我个人常用的一直都是结巴分词(比较早接触),最近使用pkuseg,两者的使用后面详细讲。

结巴分词

简介

“结巴”中文分词:做最好的 Python 中文分词组件

  • 支持三种分词模式:
    • 精确模式,试图将句子最精确地切开,适合文本分析;
    • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
    • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • 支持繁体分词
  • 支持自定义词典

jieba分词实例

我们使用京东商场的美的电器评论来看看结巴分词的效果。如果你没有安装结巴分词库则需要在命令行下输入pip install jieba,安装完之后即可开始分词之旅。

评论数据整理在文件meidi_jd.csv文件中,读取数据前先导入相关库。因为中文的文本或文件的编码方式不同编码选择gb18030,有时候是utf-8、gb2312、gbk自行测试。

# 导入相关库
import pandas as pd
import jieba

# 读取数据
data = pd.read_csv('meidi_jd.csv', encoding='gb18030')

# 查看数据
data.head()

Python中文分词库jieba,pkusegwg性能准确度比较

# 生成分词
data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x)))

data.head()

Python中文分词库jieba,pkusegwg性能准确度比较

到这里我们仅仅通过一行代码即可生成中文的分词列表,如果你想要生成分词后去重可以改成这样。

data['cut'] = data['comment'].apply(lambda x : list(set(jieba.cut(x))))

自定义词典

经过前面的分词后,我们可以通过查看分词是否准确,会发现实际上有些词被分隔成单独的汉字,例如:

print(data['cut'].loc[14])

['很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好']

这时候我们就需要导入自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。自定义词典采用一词一行,为了演示我添加了“很好”并保存在dict.txt文件中,让我们开始用自定义的词典吧!

data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x)))

data.head()

print(data['cut'].loc[14])

['很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好']

现在已经按照我们计划的正确分词出来了!很好!

停用词

分词的过程中我们会发现实际上有些词实际上意义不大,比如:标点符号、嗯、啊等词,这个时候我们需要将停用词去除掉。首先我们需要有个停用词词组,可以自定义也可以从网上下载词库,这里我们使用网上下载的停用词文件StopwordsCN.txt。

# 读取停用词数据
stopwords = pd.read_csv('StopwordsCN.txt', encoding='utf8', names=['stopword'], index_col=False)

stopwords.head()

Python中文分词库jieba,pkusegwg性能准确度比较

接下里我们只要适当更改分词的代码即可在分词的时候去掉停用词:

# 转化词列表
stop_list = stopwords['stopword'].tolist()

# 去除停用词
data['cut'] = data['comment'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list])

data.head()

pkuseg

pkuseg简单易用,支持细分领域分词,有效提升了分词准确度。

简介

pkuseg具有如下几个特点:

  1. 多领域分词。不同于以往的通用中文分词工具,此工具包同时致力于为不同领域的数据提供个性化的预训练模型。根据待分词文本的领域特点,用户可以自由地选择不同的模型。 我们目前支持了新闻领域,网络文本领域和混合领域的分词预训练模型,同时也拟在近期推出更多的细领域预训练模型,比如医药、旅游、专利、小说等等。
  2. 更高的分词准确率。相比于其他的分词工具包,当使用相同的训练数据和测试数据,pkuseg可以取得更高的分词准确率。
  3. 支持用户自训练模型。支持用户使用全新的标注数据进行训练。

注:pkuseg目前仅支持Python3,目前已经很多主流库开始不支持Python2,建议使用Python3版本,如需使用Python2可创建虚拟环境来搭建。

Python中文分词库jpkuseg实例

pkuseg的使用跟结巴分词有一点不一样,pkuseg需要先创建模型实例再使用实例方法cut。前面有提到pkuseg是支持加载与训练模型的,这也大大提高了分词准确性,特别是对细分领域数据集进行分词,详细查看GitHub文档。

import pkuseg

# 以默认配置加载模型
seg = pkuseg.pkuseg() 

# 进行分词
data['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list])

data.head()

Python中文分词库jieba,pkusegwg性能准确度比较

自定义词典

同样的,pkuseg也支持自定义词典来提高分词准确率。

# 使用默认模型,并使用自定义词典
seg = pkuseg.pkuseg(user_dict='dict.txt') 

# 进行分词
data['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list])

print(data['cut'].loc[14])

自定义预训练模型

分词模式下,用户需要加载预训练好的模型。pkuseg提供三种不同数据类型训练得到的模型。

  • MSRA: 在MSRA(新闻语料)上训练的模型。下载地址
  • CTB8: 在CTB8(新闻文本及网络文本的混合型语料)上训练的模型。下载地址
  • WEIBO: 在微博(网络文本语料)上训练的模型。下载地址
  • MixedModel: 混合数据集训练的通用模型。随pip包附带的是此模型。下载地址
# 下载后解压出来,并复制文件夹路径
file_path = '/Users/jan/anaconda3/lib/python3.6/site-packages/pkuseg/ctb8'

# 加载其他预训练模型
seg = pkuseg.pkuseg(model_name=file_path)

text = seg.cut('京东商城信得过,买的放心,用的省心、安心、放心!')

print(text)

jieba与pkusegwg性能对比

结巴的分词速度说明比较简单,描述中也没有性能对比,更像是分词内容和环境。。

  • 1.5 MB / Second in Full Mode
  • 400 KB / Second in Default Mode
  • 测试环境: Intel(R) Core(TM) i7-2600 CPU @ 3.4GHz;《围城》.txt

相比之下pkuseg选择jieba、THULAC等国内代表分词工具包与pkuseg做性能比较。以下是在不同数据集上的对比结果:

Python中文分词库jieba,pkusegwg性能准确度比较

从结果看pkuseg在精确度、召回率和F分数上表现得相当不错。性能方面我使用jupyter notebook进行简单测试。

%%timeit
data['cut'] = data['comment'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list])
%%timeit
data['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list])

输出结果:

结巴:2.54 s ± 3.77 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

pkuseg:7.45 s ± 68.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

从数据结果上看,pkuseg分词的时间要高于结巴分词的时间,当然pkuseg提供多进程来进行分词,性能方面也是可以提高的。

词频统计

到这里我们基本是已经学会用Python库进行分词,关于词频统计的方式也很多,我们先将所有分词合并在一起方便统计。

# 将所有的分词合并
words = []

for content in data['cut']:
 words.extend(content)

方式一:

# 创建分词数据框
corpus = pd.DataFrame(words, columns=['word'])
corpus['cnt'] = 1

# 分组统计
g = corpus.groupby(['word']).agg({'cnt': 'count'}).sort_values('cnt', ascending=False)

g.head(10)

Python中文分词库jieba,pkusegwg性能准确度比较

方式二:

# 导入相关库
from collections import Counter
from pprint import pprint
counter = Counter(words)

# 打印前十高频词
pprint(counter.most_common(10))

[('不错', 3913),

('安装', 3055),

('好', 2045),

('很好', 1824),

('买', 1634),

('热水器', 1182),

('挺', 1051),

('师傅', 923),

('美', 894),

('送货', 821)]

结尾

我个人的使用建议,如果想简单快速上手分词可以使用结巴分词,但如果追求准确度和特定领域分词可以选择pkuseg加载模型再分词。另外jieba和THULAC并没有提供细分领域预训练模型,如果想使用自定义模型分词需使用它们提供的训练接口在细分领域的数据集上进行训练,用训练得到的模型进行中文分词。

更多关于Python中文分词库jieba,pkusegwg的相关文章可以点击下面的相关链接

Python 相关文章推荐
Python入门篇之列表和元组
Oct 17 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
Python中整数的缓存机制讲解
Feb 16 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
Python实现对adb命令封装
Mar 06 Python
Python批量将图片灰度化的实现代码
Apr 11 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
python 实现超级玛丽游戏
Nov 25 Python
解决numpy数组互换两行及赋值的问题
Apr 17 Python
Python 一键获取电脑浏览器的账号密码
May 11 Python
pytorch中图像的数据格式实例
Feb 11 #Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
Feb 11 #Python
python中文分词库jieba使用方法详解
Feb 11 #Python
Transpose 数组行列转置的限制方式
Feb 11 #Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 #Python
tensorflow多维张量计算实例
Feb 11 #Python
python误差棒图errorbar()函数实例解析
Feb 11 #Python
You might like
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
初级的用php写的采集程序
2007/03/16 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
laravel学习教程之关联模型
2016/07/30 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
python线程中同步锁详解
2018/04/27 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
Python3多线程操作简单示例
2018/05/22 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
Django--权限Permissions的例子
2019/08/28 Python
python反扒机制的5种解决方法
2021/02/06 Python
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
团员的自我评价
2013/12/01 职场文书
回门宴父母答谢词
2014/01/26 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
python基础之函数的定义和调用
2021/10/24 Python
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers