Python数据分析(4):jieba分词详解


前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能从入门到精通教程




jieba分词器

1. jieba分词器的分词模式说明

jieba分词器提供4种分词模式,并且支持简体/繁体分词、自定义词典、关键词提取、词性标注。

(1)精确模式

该模式会将句子最精确地切分开,适合在文本分析时使用。

(2)全模式

该模式会将句子中所有成词的词语都扫描出来,速度也非常快,缺点是不能解决歧义问题,有歧义的词语也会被扫描出来。

(3)搜索引擎模式

该模式会在精确模式的基础上对长词再进行切分,将更短的词语切分出来。在搜索引擎中,要求输入词语的一部分也能检索到整个词语相关的文档,所以该模式适用于搜索引擎分词。

(4)Paddle模式

该模式利用PaddlePaddle深度学习框架,训练序列标注网络模型实现分词,同时支持词性标注。该模式在4.0及以上版本的jieba分词器中才能使用。使用该模式需要安装paddlepaddle模块

2. jieba分词器的基本用法

在Python中,可以使用jieba模块的cut()函数进行分词,返回结果是一个迭代器。

cut()函数有4个参数:

  1. 第一个参数:待分词文本
  2. cut_all:设置使用全模式(True)还是精确模式(False); 默认False
  3. use_paddle:控制是否使用Paddle模式进行分词
  4. HMM:控制是否使用HMM模式识别新词

(1)三种模式案例

设置参数cut_all为True:全分词

import jieba
str1 = '我来到了西北皇家理工学院,发现这儿真不错'
seg_list = jieba.cut(str1, cut_all=True)    # 使用全模式进行分词  生成列表
print('全模式分词结果:', '/'.join(seg_list))  # /拼接列表元素
全模式分词结果: 我/来到//西北/皇家/理工/理工学/理工学院/工学/工学院/学院//发现/这儿/真不/真不错/不错

设置参数cut_all为False:精确分词

import jieba
str1 = '我来到了西北皇家理工学院,发现这儿真不错'
seg_list = jieba.cut(str1, cut_all=False)  # 使用精确模式进行分词
print('精确模式分词结果:', '/'.join(seg_list))
精确式分词结果: 我/来到//西北/皇家/理工学院//发现/这儿/真不错

cut_all参数不给定时,默认为false,即精确分词

import jieba
str1 = '我来到了西北皇家理工学院,发现这儿真不错'
seg_list = jieba.cut(str1)
print('全模式分词结果:', '/'.join(seg_list))
精确模式分词结果: 我/来到//西北/皇家/理工学院//发现/这儿/真不错

use_paddle参数可以设置开启paddle模式

import jieba
import paddle
str1 = '我来到了西北皇家理工学院,发现这儿真不错'
#jieba.enable_paddle()   已经停用
paddle.enable_static()
seg_list = jieba.cut(str1, use_paddle=True)  #使用paddle模式进行分词
print('Paddle模式分词结果:', '/'.join(seg_list))
Paddle模式分词结果: 我/来到//西北/皇家/理工学院//发现/这儿/真不错

(2)词性标注

image-20211215163657726

import jieba
import jieba.posseg as pseg
#jieba.enable_paddle()
str2 = '上海自来水来自海上'
seg_list = pseg.cut(str2, use_paddle=True)  #使用posseg进行分词
for seg, flag in seg_list:
    print(seg, flag)
上海 ns
自来水 l
来自 v
海上 s

(3)识别新词:HMM参数

HMM参数设置为True,可以识别新词,即词典中不存在的词。

词典为jieba分词自带的字典。

如下:他知

import jieba
str3 = '他知科技研发有限公司是一家互联网行业的公司'
seg_list = jieba.cut(str3, HMM=True)    #HMM默认为True,所以可以不设置
print('精确模式分词结果:', '/'.join(seg_list))
精确模式分词结果: 他知/科技/研发/有限公司//一家/互联网/行业//公司

(4)搜索引擎模式分词:cut_for_search()函数

cut_for_search()函数可以进行搜索引擎模式分词

该函数只有两个参数:

  1. 第一个参数:待分词文本
  2. 第二个参数:HMM,默认为True
import jieba
str1 = '我来到了西北皇家理工学院,发现这儿真不错'
seg_list = jieba.cut_for_search(str1)
print('搜索引擎模式分词结果:', '/'.join(seg_list))
搜索引擎模式分词结果: 我/来到//西北/皇家/理工/工学/学院/理工学/工学院/理工学院//发现/这儿/真不/不错/真不错

3. 调整词典

用户也可以自己生成一个自定义词典,包含jieba分词自带字典中没有的词语,添加到程序中。比如:

image-20211215163733067

注意:词频、词性可省略。

未加载自定义字典时使用精确切分来进行分词

import jieba
seg_list = jieba.cut(
    '心灵感应般地蓦然回首,才能撞见那一低头的温柔;也最是那一低头的温柔,似一朵水莲花不胜凉风的娇羞;也最是那一抹娇羞,才能让两人携手共白首。')
print('未加载自定义词典时的精确模式分词结果:\n', '/'.join(seg_list))
未加载自定义词典时的精确模式分词结果:
 心灵感应/般地/蓦然回首//才能/撞见/那一/低头//温柔///////低头//温柔///一朵//莲花/不胜/凉风//娇羞//////一抹/娇羞//才能//两人/携手//白首/

(1)使用自定义词典:load_userdict()函数

load_userdict()函数加载用户自定义字典

import jieba
jieba.load_userdict('用户词典.txt')
seg_list = jieba.cut(
    '心灵感应般地蓦然回首,才能撞见那一低头的温柔;也最是那一低头的温柔,似一朵水莲花不胜凉风的娇羞;也最是那一抹娇羞,才能让两人携手共白首。')
print('加载自定义词典时的精确模式分词结果:\n', '/'.join(seg_list))
加载自定义词典时的精确模式分词结果:
 心灵感应/般地/蓦然回首//才能/撞见//一低头//温柔//////一低头//温柔///一朵/水莲花/不胜/凉风//娇羞//////一抹/娇羞//才能//两人/携手//白首/

(2)动态修改词典:add_word()、del_word()函数

1. 动态添加词:add_word()

import jieba
jieba.load_userdict('用户词典.txt')
jieba.add_word('最是')  #添加词,  但是不会添加到   用户字典.txt   文件中
seg_list = jieba.cut(
    '心灵感应般地蓦然回首,才能撞见那一低头的温柔;也最是那一低头的温柔,似一朵水莲花不胜凉风的娇羞;也最是那一抹娇羞,才能让两人携手共白首。')
print('添加自定义词时的精确模式分词结果:\n', '/'.join(seg_list))
添加自定义词时的精确模式分词结果:
 心灵感应/般地/蓦然回首//才能/撞见//一低头//温柔///最是//一低头//温柔///一朵/水莲花/不胜/凉风//娇羞///最是//一抹/娇羞//才能//两人/携手//白首/

2.动态删除词:del_word()

import jieba
jieba.load_userdict('用户词典.txt')
jieba.del_word('一低头')
seg_list = jieba.cut('心灵感应般地蓦然回首,才能撞见那一低头的温柔;也最是那一低头的温柔,似一朵水莲花不胜凉风的娇羞;也最是那一抹娇羞,才能让两人携手共白首。')
print('删除自定义词时的精确模式分词结果:\n', '/'.join(seg_list))
删除自定义词时的精确模式分词结果:
 心灵感应/般地/蓦然回首//才能/撞见/那一/低头//温柔///////低头//温柔///一朵/水莲花/不胜/凉风//娇羞//////一抹/娇羞//才能//两人/携手//白首/

(3)调节词频:suggest_freq()函数

不修改词频前:

#不修改词频
import jieba
str3 = '他认为未来几年健康产业在GDP中将占比第一。'
seg_list = jieba.cut(str3)
print('精确模式分词结果:\n', '/'.join(seg_list))
精确模式分词结果:
 他/认为/未来/几年/健康/产业//GDP/中将///第一/

修改词频后:

#修改词频
import jieba
str3 = '他认为未来几年健康产业在GDP中将占比第一。'
jieba.suggest_freq(('中', '将'), True)   #修改词频  强制“中将”
jieba.suggest_freq('占比', True)         #强制让“占比”作为一次词
seg_list = jieba.cut(str3, HMM=False)
print('精确模式分词结果:\n', '/'.join(seg_list))
精确模式分词结果:
 他/认为/未来/几年/健康/产业//GDP///占比/第一/

4. 关键词提取

从文本文件中提取关键词的理论方法主要有两种:

第一种是有监督的学习方法,该方法将关键词的提取视为一个二分类问题,要么是关键词,要么不是

第二种是无监督的学习方法,该方法对候选词进行打分,大风范最高的候选词为关键词

常见的打分算法有TF-IDF和TextRank

(1)基于TF-IDF算法的关键词提取:extract_tags()函数

extract_tags()函数能基于TF-IDF算法提取关键词

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

该函数有四个参数:

  1. sentence:待提取关键词的文本
  2. topK:关键词数
  3. withWeight:是否返回权重
  4. allowPOS:指定筛选关键词的词性;默认不分词性

基于TF-IDF算法的关键词提取

# 基于TF-IDF算法的关键词提取
from jieba import analyse
text = '记者日前从中国科学院南京地质古生物研究所获悉,该所早期生命研究团队与美国学者合作,在中国湖北三峡地区的石板滩生物群中,发现了4种形似树叶的远古生物。这些“树叶”实际上是形态奇特的早期动物,它们生活在远古海洋底部。相关研究成果已发表在古生物学国际专业期刊《古生物学杂志》上。'
keywords = analyse.extract_tags(text, topK=10, withWeight=True, allowPOS=('n', 'v'))
print(keywords)
[('古生物学', 0.783184303024), ('树叶', 0.6635900468544), ('生物群', 0.43238540794400004), ('古生物', 0.38124919198039997), ('期刊', 0.36554014868720003), ('石板', 0.34699723913040004), ('形似', 0.3288202017184), ('研究成果', 0.3278758070928), ('团队', 0.2826627565264), ('获悉', 0.28072960723920004)]

(2)基于TextRank算法的关键词提取:textrank()函数

textrank()函数能基于TextRank算法提取关键字

jieba.analyse.textrank(sentance, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))

两种方法的区别是默认提取的词性不同

当然算法不同,结果可能有差异

基于TextRank算法的关键词提取

# 基于TextRank算法的关键词提取
from jieba import analyse
text = '记者日前从中国科学院南京地质古生物研究所获悉,该所早期生命研究团队与美国学者合作,在中国湖北三峡地区的石板滩生物群中,发现了4种形似树叶的远古生物。这些“树叶”实际上是形态奇特的早期动物,它们生活在远古海洋底部。相关研究成果已发表在古生物学国际专业期刊《古生物学杂志》上。'
keywords = analyse.textrank(text, topK=10, withWeight=True, allowPOS=('n', 'v'))
print(keywords)
[('古生物学', 1.0), ('树叶', 0.8797803471074045), ('形似', 0.6765568513591282), ('专业', 0.6684901270801065), ('生物', 0.648692596888148), ('发表', 0.6139083953888275), ('生物群', 0.59981945604977), ('期刊', 0.5651065025924439), ('国际', 0.5642917600351786), ('获悉', 0.5620719278559326)]

5. 停用词过滤

停用词:“你”、“我”、“的”、“在”及标点符号等大量出现但非关键词的词。

我们可以把它们过滤掉

启动停用词过滤前:

#未启动停用词过滤
import jieba
text = '商务部4月23日发布的数据显示,一季度,全国农产品网络零售额达936.8亿元,增长31.0%;电商直播超过400万场。电商给农民带来了新的机遇。'
seg_list = jieba.cut(text)
print('未启用停用词过滤时的分词结果:\n', '/'.join(seg_list))
未启用停用词过滤时的分词结果:
 商务部/4//23//发布//数据/显示//一季度//全国/农产品/网络/零售额//936.8/亿元//增长/31.0%//电商/直播/超过/400/万场//电商//农民/带来////机遇/

为了过滤停用词,需要有一个停用词词典。

我们可以自己制作停用词词典,停用词词典的内容是根据NLP的目的变化的。

如果制作太慢,可以百度下载一个停用词词典,稍作修改成自己想要的。如下:

image-20211215163754231

启动停用词过滤后:

#启动停用词过滤
import jieba
with open('stopwords.txt', 'r+', encoding = 'utf-8')as fp:
    stopwords = fp.read().split('\n')  #将停用词词典的每一行停用词作为列表中的一个元素
word_list = []  #用于存储过滤停用词后的分词结果
text = '商务部4月23日发布的数据显示,一季度,全国农产品网络零售额达936.8亿元,增长31.0%;电商直播超过400万场。电商给农民带来了新的机遇。'
seg_list = jieba.cut(text)
for seg in seg_list:
    if seg not in stopwords:
        word_list.append(seg)
print('启用停用词过滤时的分词结果:\n', '/'.join(word_list))
启用停用词过滤时的分词结果:
 商务部/4//23//发布/数据/显示/一季度/全国/农产品/网络/零售额//936.8/亿元/增长/31.0%/电商/直播/超过/400/万场/电商/农民/带来//机遇

注意:我们根据不同的编码方式,修改encoding参数

6. 词频统计

import jieba
text = '蒸馍馍锅锅蒸馍馍,馍馍蒸了一锅锅,馍馍搁上桌桌,桌桌上面有馍馍。'
with open('stopwords.txt', 'r+', encoding = 'utf-8')as fp:
    stopwords = fp.read().split('\n')    #加载停用词
word_dict = {}                           #用于存储词频统计结果的词典
jieba.suggest_freq(('桌桌'), True)        #让“桌桌”作为一个词
seg_list = jieba.cut(text)
for seg in seg_list:
    if seg not in stopwords:
        if seg in word_dict.keys():
            word_dict[seg] += 1     #存在则词频+1
        else:
            word_dict[seg] = 1      #不存在则存入键值对
print(word_dict)
{'蒸': 3, '馍馍': 5, '锅锅': 1, '一锅': 1, '锅': 1, '搁': 1, '桌桌': 2, '上面': 1}
  • 89
    点赞
  • 542
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
结巴分词早期版本。 * 结巴分词(java版) jieba-analysis 首先感谢jieba分词原作者[[https://github.com/fxsjy][fxsjy]],没有他的无私贡献,我们也不会结识到结巴 分词,更不会有现在的java版本。 结巴分词的原始版本为python编写,目前该项目在github上的关注量为170, 打星727次(最新的数据以原仓库为准),Fork238次,可以说已经有一定的用户群。 结巴分词(java版)只保留的原项目针对搜索引擎分词的功能(cut_for_index、cut_for_search),词性标注,关键词提取没有实现(今后如用到,可以考虑实现)。 * 简介 ** 支持分词模式 - Search模式,用于对用户查询词分词 - Index模式,用于对索引文档分词 ** 特性 - 支持多种分词模式 - 全角统一转成半角 - 用户词典功能 - conf 目录有整理的搜狗细胞词库 - 支持词性标注(感谢 [[https://github.com/linkerlin][@linkerlin]] 的贡献) * 如何获取 - 当前稳定版本 #+BEGIN_SRC xml com.huaban jieba-analysis 0.0.2 #+END_SRC - 当前快照版本 - 支持词性标注 [[https://github.com/huaban/jieba-analysis/pull/4][#4]] - 修复以'-'连接词分词错误问题 [[https://github.com/huaban/jieba-analysis/issues/3][#3]] #+BEGIN_SRC xml com.huaban jieba-analysis 1.0.0-SNAPSHOT #+END_SRC * 如何使用 - Demo #+BEGIN_SRC java @Test public void testDemo() { JiebaSegmenter segmenter = new JiebaSegmenter(); String[] sentences = new String[] {"这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱Python和C++。", "我不喜欢日本和服。", "雷猴回归人间。", "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作", "结果婚的和尚未结过婚的"}; for (String sentence : sentences) { System.out.println(segmenter.process(sentence, SegMode.INDEX).toString()); } } #+END_SRC * 算法(wiki补充...) - [ ] 基于 =trie= 树结构实现高效词图扫描 - [ ] 生成所有切词可能的有向无环图 =DAG= - [ ] 采用动态规划算法计算最佳切词组合 - [ ] 基于 =HMM= 模型,采用 =Viterbi= (维特比)算法实现未登录词识别 * 性能评估 - 测试机配置 #+BEGIN_SRC screen Processor 2 Intel(R) Pentium(R) CPU G620 @ 2.60GHz Memory:8GB 分词测试时机器开了许多应用(eclipse、emacs、chrome...),可能 会影响到测试速度 #+END_SRC - [[src/test/resources/test.txt][测试文本]] - 测试结果(单线程,对测试文本逐行分词,并循环调用上万次) #+BEGIN_SRC screen 循环调用一万次 第一次测试结果: time elapsed:12373, rate:2486.986533kb/s, words:917319.94/s 第二次测试结果: time elapsed:12284, rate:2505.005241kb/s, words:923966.10/s 第三次测试结果: time elapsed:12336, rate:2494.445880kb/s, words:920071.30/s 循环调用2万次 第一次测试结果: time elapsed:22237, rate:2767.593144kb/s, words:1020821.12/s 第二次测试结果: time elapsed:22435, rate:2743.167762kb/s, words:1011811.87/s 第三次测试结果: time elapsed:22102, rate:2784.497726kb/s, words:1027056.34/s 统计结果:词典加载时间1.8s左右,分词效率每秒2Mb多,近100万词。 2 Processor Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz 12G 测试效果 time elapsed:19597, rate:3140.428063kb/s, words:1158340.52/s time elapsed:20122, rate:3058.491639kb/s, words:1128118.44/s #+END_SRC

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zdb呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值