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检测主机的连通性并记录到文件的实例
Jun 21 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
详解python中的hashlib模块的使用
Apr 22 Python
Python3模拟curl发送post请求操作示例
May 03 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
Python简单处理坐标排序问题示例
Jul 11 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
新手入门学习python Numpy基础操作
Mar 02 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
python开发制作好看的时钟效果
May 02 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
Python获取文件ssdeep值的方法
2014/10/05 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
python文件选择对话框的操作方法
2019/06/27 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
python Selenium 库的使用技巧
2020/10/16 Python
污水厂厂长岗位职责
2014/01/04 职场文书
美德少年事迹材料
2014/01/23 职场文书
学生保证书范文
2014/04/28 职场文书
创意婚礼策划方案
2014/05/18 职场文书
考试保密承诺书
2014/08/30 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
python源码剖析之PyObject详解
2021/05/18 Python