文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)

 3f6a7ab0347a4af1a75e6ebadee63fc1.gif

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


33fd481efa9d4bc7a969904f969e122d.png

中文分词

        中文分词是将中文文本切分成一系列有意义的词语的过程。中文分词可以用于文本分析、机器翻译、信息检索等领域。传统的中文分词方法主要是基于规则和统计方法,其中规则分词法主要通过定义一些分词规则来分词,如基于汉字的笔画、拼音、部首等规则;而统计分词法则是通过训练大规模中文语料库来自动学习分词规律,并使用这些规律进行分词。随着深度学习技术的发展,基于神经网络的中文分词方法也逐渐得到广泛应用。在中文分词领域上,使用最多的就是jieba库,本次我也将重点介绍jieba库进行中文分词。

jieba是目前最好的Python中文分词组件,它主要有以下3种特性:

  • 支持3种分词模式:精确模式、全模式、搜索引擎模式
  • 支持繁体字
  • 支持自定义词典

jieba.cutjieba.lcut接受3个参数:

  • 需要分词的字符串(unicode或UTF-8字符串、GBK字符串)
  • cut_all参数:是否使用全模式,默认值为False
  • HMM参数:用来控制是否使用HMM模型,默认值为True

jieba.cut_for_searchjieba.lcut_for_search接受2个参数:

  • 需要分词的字符串(unicode或UTF-8字符串、GBK字符串)
  • HMM参数:用来控制是否使用HMM模型,默认值为True
     

jieba.cut和jieba.cut_for_search所返回的结果是一个可迭代的generator,可使用for循环来获得分词后得到的每一个词语(unicode)。

jieba.lcut和jieba.lcut_for_search直接返回list结果。

示例:

import jieba
text = '中文分词是将中文文本切分成一系列有意义的词语的过程。'
print(jieba.cut(text))
print(jieba.cut_for_search(text))
print(jieba.lcut(text))
print(jieba.lcut_for_search(text))

运行结果: 

['中文', '分词', '是', '将', '中文', '文本', '切', '分成', '一系列', '有', '意义', '的', '词语', '的', '过程', '。']
['中文', '分词', '是', '将', '中文', '文文', '文本', '切分', '分成', '一系', '一系列', '系列', '列有', '有意', '意义', '的', '词语', '的', '过程', '。']
['中文', '分词', '是', '将', '中文', '文本', '切', '分成', '一系', '系列', '一系列', '有', '意义', '的', '词语', '的', '过程', '。']
<generator object Tokenizer.cut at 0x000001B56EE14740>
<generator object Tokenizer.cut_for_search at 0x000001B56EE14740>
['中文', '分词', '是', '将', '中文', '文本', '切', '分成', '一系列', '有', '意义', '的', '词语', '的', '过程', '。']
['中文', '分词', '是', '将', '中文', '文本', '切', '分成', '一系', '系列', '一系列', '有', '意义', '的', '词语', '的', '过程', '。']

 分词默认使用的是精确模式,我们可以通过cut_all参数来改为全模式。如果想使用搜索引擎模式的话,使用jieba.lcut_for_search即可。

示例

import jieba
text = '中文分词是将中文文本切分成一系列有意义的词语的过程。'
print(jieba.lcut(text,cut_all=False)) # 默认精确模式,即cut_all=False
print(jieba.lcut(text,cut_all=True)) # 改为全模式,即cut_all=True
print(jieba.lcut_for_search(text)) # 搜索引擎模式

运行结果: 

['中文', '分词', '是', '将', '中文', '文本', '切', '分成', '一系列', '有', '意义', '的', '词语', '的', '过程', '。']
['中文', '分词', '是', '将', '中文', '文文', '文本', '切分', '分成', '一系', '一系列', '系列', '列有', '有意', '意义', '的', '词语', '的', '过程', '。']
['中文', '分词', '是', '将', '中文', '文本', '切', '分成', '一系', '系列', '一系列', '有', '意义', '的', '词语', '的', '过程', '。']

自定义分词词典 

        很多时候使用jieba分词的结果会不尽人意,它的分词里如果没有该词语,就会将其分开,比如下面的示例:

import jieba
text = '艾派森是创新办主任也是大数据专家'
jieba.lcut(text)
['艾派', '森是', '创新', '办', '主任', '也', '是', '大', '数据', '专家']

可以发现,我们是不想让它把“艾派森”、“创新办”、“大数据”分开的,但是在它的词典里是没有这些新词语的,所以这时候我们需要自定义分词词典进行补充。

方法1:直接定义词典列表

我们可以直接将我们自定义的词语放入一个列表中,然后使用jieba.load_userdict进行应用

b = ['艾派森','创新办','大数据']
jieba.load_userdict(b) # 应用自定义词典列表
jieba.lcut(text)
['艾派森', '是', '创新办', '主任', '也', '是', '大数据', '专家']

方法2:外部文件载入

外部文件的话我们需要创建一个自定义词典txt文件,里面写入自定义词语即可,注意是一行一个词语。然后将该文件的路径传入jieba.load_userdict即可,我这里是代码和文件在同一路径下,所以直接写入文件名即可。

c8a53d37a672461d9933ec9a355b887b.png

# 方法2:外部文件载入
jieba.load_userdict('自定义词典.txt')
jieba.lcut(text)
['艾派森', '是', '创新办', '主任', '也', '是', '大数据', '专家']

方法3:动态增加或删除词语

优点:比添加自定义词典灵活,随用随机。

比如当我们遇到如下情况时:

text2 = '我们中出了一个叛徒'
jieba.lcut(text2)
['我们', '中出', '了', '一个', '叛徒']

可以发现它误解了我们的初始意思,将“中出”作为一个词语进行分开,我们汉语里面哪有这个词语,似乎日语里面有这个词,要么就是csgo里面的口头语“中出”,意思是从中路出了。所以这时候我们将需要“中出”进行删除,然后加入“出了”这个词语。

jieba.del_word('中出')  # 删除单词
jieba.lcut(text2)
['我们', '中', '出', '了', '一个', '叛徒']

可以发现将“中出”删除后,它就不会将中和出进行组合了。 

jieba.add_word('出了')
jieba.lcut(text2)
['我们', '中', '出了', '一个', '叛徒']

当我们添加了“出了”词语后,它就可以将出和了进行组合了,这就符合了我们最初的意思。 

问题:如果我们不想删除“中出”这个词,但是又不想让它合在一起,该怎么办?

 那么我们就需要提高“中”和“出”这两个词的权重,这样就不会在进行组合了。

# 如果我们不想删除“中出”这个词,但是又不想让它合在一起,可以增大它的词频
jieba.add_word('中出')  # 为了演示效果,我们需要回到最初始的样子
jieba.del_word('出了')
print(jieba.lcut(text2))
# 调节词的词频,使其能(或不能)被分词
# tune=True:执行词频调整,默认False不执行
jieba.suggest_freq(('中','出'),tune=True)
print(jieba.lcut(text2))
['我们', '中出', '了', '一个', '叛徒']
['我们', '中', '出', '了', '一个', '叛徒']

可以看出,我们同样实现了前面的效果。

去除停用词 

        去除停用词是一种常用的自然语言处理技术,它可以大大提高文本分类、情感分析、机器翻译等任务的效果。常用的停用词包括数字、时间、标点符号、常见单词等。

在中文分词之后, 就需要进行去除停用词。

首先我们需要准确一个停用词库,这里我建议大家使用哈工大的中文停用词库,比较齐全。如果里面没有你想去除的词语,你也可以再文件里面进行添加,注意还是一行一个词语。这里我们读取停用词库文件,将里面的停用词进行存储,后面做筛选用。

a6676073341e441d994b4741b3d32efd.png

with open('停用词库.txt', encoding='utf-8') as f: # 可根据需要打开停用词库,然后加上不想显示的词语con = f.readlines()stop_words = set() # 集合可以去重for i in con:i = i.replace("\n", "")   # 去掉读取每一行数据的\nstop_words.add(i)
stop_words

 4a1fd9a1a1674221ad2fd99fa0acbc6b.png

读取完停用词库我们将可以去除停用词了,示例如下: 

text3 = '昨天我吃了一大碗米饭,真的是太好吃了!###@'
result = []
for word in jieba.lcut(text3):if word not in stop_words:result.append(word)
result
['昨天', '吃', '大碗', '米饭', ',', '真的', '太', '好吃', '!', '###', '@']

可以发现它确实去除了停用词库中的词语,但是还有标点符号等字符没有去除。

所以这里我们还需要使用re正则进行去除字符,只保留中文。

# 去除一些无用的字符只提取出中文出来
import re
new_text = "".join(re.findall('[\u4e00-\u9fa5]+', text3, re.S))
new_text
'昨天我吃了一大碗米饭真的是太好吃了'

可以发现经过这一步处理,我们原来语句中的标点符号等异常字符都去除掉了。此时再进行分词和去停用词就可以算完美了。

result = []
for word in jieba.lcut(new_text):if word not in stop_words:result.append(word)
result
['昨天', '吃', '大碗', '米饭', '真的', '太', '好吃']

可以看出分词的结果都只有中文了。

如果我们不想保留单词,比如上面的“吃”、“太”,这样的词语没有什么价值,只需要在去重的时候加上过滤条件即可。原理就是判断字的长度是否大于1。

result = []
for word in jieba.lcut(new_text):if word not in stop_words and len(word) > 1:result.append(word)
result
['昨天', '大碗', '米饭', '真的', '好吃']

综合

        前面我们学习了中文分词、去除停用词、去除标点符号。在实际应用的时候当然还是把这些功能封装为一个函数,即提高效率也提高代码可读性。这里我放出我自己封装的函数供大家参考,可以直接拿去用。

import re
import jiebadef chinese_word_cut(mytext):jieba.load_userdict('自定义词典.txt')  # 这里你可以添加jieba库识别不了的网络新词,避免将一些新词拆开jieba.initialize()  # 初始化jieba# 文本预处理 :去除一些无用的字符只提取出中文出来new_data = re.findall('[\u4e00-\u9fa5]+', mytext, re.S)new_data = " ".join(new_data)# 文本分词seg_list_exact = jieba.lcut(new_data)result_list = []# 读取停用词库with open('停用词库.txt', encoding='utf-8') as f: # 可根据需要打开停用词库,然后加上不想显示的词语con = f.readlines()stop_words = set()for i in con:i = i.replace("\n", "")   # 去掉读取每一行数据的\nstop_words.add(i)# 去除停用词并且去除单字for word in seg_list_exact:if word not in stop_words and len(word) > 1:result_list.append(word)      return result_list

封装好之后,我们需要用的时候直接调用即可。

text3 = '昨天我吃了一大碗米饭,真的是太好吃了!###@'
chinese_word_cut(text3)
['昨天', '大碗', '米饭', '真的', '好吃']

案例实战

中文分词是文本分析必须要经历的环节,关于具体案例,我前面写了很多,大家可以学习参考。

基于sklearn实现LDA主题模型(附实战案例)

基于gensim实现word2vec模型(附案例实战)

数据分析案例-文本挖掘与中文文本的统计分析

基于TF-IDF+KMeans聚类算法构建中文文本分类模型(附案例实战)

大数据分析案例-基于朴素贝叶斯算法构建微博谣言检测模型

大数据分析案例-基于逻辑回归算法构建微博评论情感分类模型

文末福利

3d43aa82afe94bab88a829e131f48de5.jpeg

北京大学出版社,618促销活动安排来啦
当当活动日期:6.1-6.18
京东活动日期: 5.31晚上8点-6.18
活动期间半价5折销售 
希望大家关注参618北大社促销活动 

参与福利 

  • 抽奖方式:评论区随机抽取2位小伙伴免费送出!
  • 参与方式:关注博主、点赞、收藏、评论区评论“人生苦短,拒绝内卷!”(切记要点赞+收藏,否则抽奖无效,每个人最多评论三次!
  • 活动截止时间:2023-06-07 20:00:00
  •  京东自营店购买链接:https://item.jd.com/13985606.html

名单公布时间:2023-06-07 21:00:00   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29521.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解单词拆分问题

问题描述&#xff1a; 题目&#xff1a;Leetcode第139题 难度&#xff1a;中等 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重…

一次 Netty 不健壮导致的无限重连分析

由于 OOM 导致不健壮的 Netty 一系列诡异的行为&#xff0c;这次的问题分析会比上次那个更有意思一点。&#xff08;备注&#xff1a;本文 Netty 版本是上古时代的 3.7.0.Final) 现象描述 开发的同学反馈 dubbo 客户端无法调用远程的服务&#xff0c;抓包来看&#xff0c;客户…

G2SAT: Learning to Generate SAT Formulas论文精读

0. Abstract SAT&#xff08;布尔可满足&#xff09;问题被证明是一个经典的np完全问题&#xff0c;作为一个计算机科学的基本问题&#xff0c;在决策、验证和理论证明等很多方面都有应用。目前的SAT求解器的开发和评估依赖于现有的有限的现实问题&#xff0c;且现有的手工制作…

【论文精读】A Survey on Knowledge Graphs Representation, Acquisition and Applications

A Survey on Knowledge Graphs Representation, Acquisition and Applications 前言Abstract1. INTRODUCTIONII. OVERVIEWA. A Brief History of Knowledge BasesB. Definitions and NotationsC. Categorization of Research on Knowledge GraphD. Related Surveys III. KNOWLE…

SharpContour论文精读

SharpContour: A Contour-based Boundary Refinement Approach for Efficient and Accurate Instance Segmentation 论文链接&#xff1a;[2203.13312] SharpContour: A Contour-based Boundary Refinement Approach for Efficient and Accurate Instance Segmentation (arxiv…

【论文精读】HumanNeRF

目录 Abstract1.Introduction2.Related workHuman specific renderingNeural radiance fieldsHuman-specific neural renderingConcurrent work 3.Representing a Human as a Neural FieldCanonical volumeSkeletal motionNon-rigid motionPose correction 4.Optimizing a Huma…

GAN论文精读以及基础讲解

GAN精读论文&#xff1a;Neurips-2014-Generative Adversarial Nets 根据李沐老师的讲解加上笔者个人的理解做的一个笔记&#xff0c;希望能够对想了解GAN的求学者有所帮助&#xff01; 一、标题、作者、期刊 论文的标题名为Generative Adversarial Nets&#xff0c;中文解释…

我在工作群和ChatGPT聊了会天,找到了升职加薪的新思路

ChatGPT 大火&#xff01; 我们知道&#xff0c;基于 AIGC 的 ChatGPT 可以整合信息并“回复”给我们所需的很多类答案&#xff0c;比如写论文、作诗、画画&#xff0c;不过现在&#xff0c;ChatGPT 已经从火出圈的现象级 AI 应用&#xff0c;迅速被更多开发者融入到更多产品工…

容联七陌:ChatGPT大模型能力为智能客服带来新方向

科技云报道原创。 近几个月来&#xff0c;大众对ChatGPT预期的持续走高&#xff0c;也影响到了智能客服领域公司的命运。 一方面&#xff0c;ChatGPT的出现为智能客服场景带来了更加“智能”的可能性&#xff1b;但另一方面&#xff0c;有人认为ChatGPT完全可以替代现有的智能…

ChatGPT爆火之后,视觉研究者坐不住了?谷歌将ViT参数扩大到220亿

本文来源 机器之心 编辑&#xff1a;泽南 视觉模型有很大的提升空间&#xff0c;研究者们在以往的 LLM 中学到经验教训&#xff0c;认为扩展是一个很有前途的方法。来自谷歌的研究者将 ViT 扩展到 22B 参数量&#xff0c;这是迄今为止报道的最大的视觉主干。 与自然语言处理类…

Android之Android studio实现智能聊天机器人

Android实现智能聊天机器人 最近在做项目中,突然来了灵感,要做一个聊天机器人.聊天机器人在很多大型App上都有使用,比如QQ群里的QQ小冰,淘宝京东等App上在没有人工客服之前会有机器人跟你聊天,根据你发的问题关键词,向你推荐一些答案,可以省下很多人工的时间以及减小服务器的压…

图像复原之维纳滤波

基本原理 图像复原是图像处理的重要组成部分&#xff0c;由于图像在获取和传输过程中通常不可避免的要受到一些噪声的干扰&#xff0c;因此在进行其他图像处理以及图像分析之前&#xff0c;应该尽量将图像复原到其原始真实状态。图像复原的关键问题是在于建立退化模型。图像退…

图像复原

1图像复原的而理论模型 定义&#xff1a;在成像过程中&#xff0c;由于成像系统各种因素的影响&#xff0c;可能使获得的图像不是真实景物的完善影像。图像在形成、传播和保存过程中使图像质量下降的过程&#xff0c;称为图像退化。图像复原就是重建退化的图像&#xff0c;使其…

UBI.city白皮书发布与空投领取方法

在经历了至少5次的全面推翻与重构后&#xff0c;UBI.city的方案终于可以发布了。 UBI.city简介 UBI.city是去中心化组织的动态治理协议&#xff0c;白皮书可在官网 www.ubi.city 中查阅。 随着The DAO在2016年募集了1170万枚ETH&#xff08;价值约2.45亿美元&#xff09;&am…

WhatsApp被禁用操作教程|实操WhatsApp解封的过程|2023三月

我是上周被WhatsApp被禁用了&#xff0c;按照网上的方法&#xff0c;点击Support提交&#xff0c;会自动跳转一个邮件&#xff0c;发送到WhatsApp官方&#xff0c;我满心欢喜地等待解封&#xff0c;以为会像大家说的那样&#xff0c;第二天可以解封。 就是点击那个 支持 提交了…

微信网页版解封方法

最近&#xff0c;微信又推出了网页版的【文件传输助手】&#xff0c;也就是说&#xff0c;无需登录客户端的微信&#xff0c;即可进行文件或图片的传输。 网址是 https://filehelper.weixin.qq.com网址巨长&#xff0c;咋一看&#xff0c;又长又难记&#xff0c;玩个锤子 经…

微信小程序-获取用户头像信息以及修改用户头像

这里主要用到button的open-type功能&#xff0c;官网已有说明&#xff1a; 给button设置open-type"chooseAvatar"&#xff0c;来使bindchooseavatar方法生效&#xff0c;在bindchooseavatar指定的函数中获取用户的头像信息 <button open-type"chooseAvata…

小程序中新版本的获取用户头像与昵称:bind:chooseavatar

前言&#xff1a; 自从微信官方把获取用户昵称与头像的功能改动以后&#xff0c;给我们开发和用户的操作又增加了很多负担&#xff0c;但是没办法&#xff0c;只能使用最新的使用方法了。 小程序用户头像昵称获取规则调整公告 新版实现效果&#xff1a; 注意&#xff0c;真机…

关于QQ群头像以及微信讨论组头像的工具类

QQ群头像以及微信讨论组头像工具类介绍 介绍&#xff1a; 由于段时间公司项目需求&#xff0c;在翻了网上很多代码后发现&#xff0c;很多人用的是自定义View的办法来实现此类头像的效果&#xff0c;但是&#xff0c;这样一来就必须改变项目中原有的控件&#xff0c;而且当需要…

桌面宠物!

电脑桌宠&#xff1a; 天选姬 下载地址&#xff1a;https://www.asus.com.cn/supportonly/FA506QR/HelpDesk_download/ 选择系统&#xff0c;点击软件程序下的查看更多&#xff0c;选择天选姬桌面大鹅&#xff08;Desktop Goose&#xff09; 下载地址&#xff1a;https://wwu.…