时间:2021-05-23
中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组。英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文分词难度高很多。
分词主要用于NLP 自然语言处理(Natural Language Processing),使用场景有:
Python的中文分词库有很多,常见的有:
通常前三个是比较经常见到的,主要在易用性/准确率/性能都还不错。我个人常用的一直都是结巴分词(比较早接触),最近使用pkuseg,两者的使用后面详细讲。
“结巴”中文分词:做最好的 Python 中文分词组件
jieba分词实例
我们使用京东商场的美的电器评论来看看结巴分词的效果。如果你没有安装结巴分词库则需要在命令行下输入pip install jieba,安装完之后即可开始分词之旅。
评论数据整理在文件meidi_jd.csv文件中,读取数据前先导入相关库。因为中文的文本或文件的编码方式不同编码选择gb18030,有时候是utf-8、gb2312、gbk自行测试。
# 导入相关库import pandas as pdimport jieba# 读取数据data = pd.read_csv('meidi_jd.csv', encoding='gb18030')# 查看数据data.head()# 生成分词data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x)))data.head()到这里我们仅仅通过一行代码即可生成中文的分词列表,如果你想要生成分词后去重可以改成这样。
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()接下里我们只要适当更改分词的代码即可在分词的时候去掉停用词:
# 转化词列表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目前仅支持Python3,目前已经很多主流库开始不支持Python2,建议使用Python3版本,如需使用Python2可创建虚拟环境来搭建。
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()同样的,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提供三种不同数据类型训练得到的模型。
结巴的分词速度说明比较简单,描述中也没有性能对比,更像是分词内容和环境。。
相比之下pkuseg选择jieba、THULAC等国内代表分词工具包与pkuseg做性能比较。以下是在不同数据集上的对比结果:
从结果看pkuseg在精确度、召回率和F分数上表现得相当不错。性能方面我使用jupyter notebook进行简单测试。
%%timeitdata['cut'] = data['comment'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list])%%timeitdata['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)方式二:
# 导入相关库from collections import Counterfrom pprint import pprintcounter = Counter(words)# 打印前十高频词pprint(counter.most_common(10))[('不错', 3913),
('安装', 3055),
('好', 2045),
('很好', 1824),
('买', 1634),
('热水器', 1182),
('挺', 1051),
('师傅', 923),
('美', 894),
('送货', 821)]
结尾
我个人的使用建议,如果想简单快速上手分词可以使用结巴分词,但如果追求准确度和特定领域分词可以选择pkuseg加载模型再分词。另外jieba和THULAC并没有提供细分领域预训练模型,如果想使用自定义模型分词需使用它们提供的训练接口在细分领域的数据集上进行训练,用训练得到的模型进行中文分词。
更多关于Python中文分词库jieba,pkusegwg的相关文章可以点击下面的相关链接
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
第一.优化ik分词词库大部分电商都是通过分词来提高产品的召回率以及相关度的排序,而分词词库则是确保分词准确的要害。而ik词库分为基础词库、扩展词库和stopwo
1、jieba库基本介绍(1)、jieba库概述jieba是优秀的中文分词第三方库-中文文本需要通过分词获得单个的词语-jieba是优秀的中文分词第三方库,需要
PHPCMS的搜索功能相比其他CMS算是比较差的了,搜索精度非常低。虽说他有个搜索关键字分词功能,但有的时候不分词的准确度却会高于分词。如何去掉PHPCMS关闭
本文实例讲述了python实现的读取网页并分词功能。分享给大家供大家参考,具体如下:这里使用分词使用最流行的分词包jieba,参考:https://github
本文实例讲述了Python基于jieba库进行简单分词及词云功能实现方法。分享给大家供大家参考,具体如下:目标:1.导入一个文本文件2.使用jieba对文本进行