一文掌握jieba分词器的常见用法,附带案例

简介: 该文章全面介绍了jieba分词器的使用方法,包括安装步骤、不同分词模式的使用,以及如何通过实例代码进行文本分词处理。

一. jieba分词器的基础知识

安装:pip install jieba
安装:pip3 install paddlepaddle-tiny
如果出现超时的情况,指定清华源:pip3 install paddlepaddle-tiny -i https://pypi.tuna.tsinghua.edu.cn/simple

1.1 jieba分词支持4中方式

  • 精确模式:将句子最精确的切分开,适合文本分析时使用;
  • 全模式:将句子可以生成词语的词都扫描出来,速度非常快,但有歧义的词语也会被扫描出来;
  • 搜索引擎模式:会在精确模式的基础上对长词语再进行切分,将更短的词切分出来,适用于搜索引擎分词;
  • Paddle模式:利用PaddlePaddle深度学习框架,训练序列标注网络模型实现分词,同时支持词性标注。jieba分词器4.0版本以上才能支持。安装命令:pip install paddlepaddle

二. jieba的基本用法

2.1 精确模式、全模式和Paddle分词模式

# -*- encoding: utf-8 -*-

"""
使用jieba模块的cut()函数进行分词,返回结果是一个迭代器。cut()函数有4个参数:
第一个参数是带分词的文本;
参数cut_all设置为True是全分词模式,为False是精确模式;
参数use_paddle: 是否使用paddle模式进行分词;
参数HMM:是否使用HMM模式进行分词
"""
# 设置参数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))  # 精确模式分词结果: 我/来到/了/西北/皇家/理工学院/,/发现/这儿/真不错


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

2.2 词性标注

# 使用paddle模式进行分词并标注词性
import jieba
import jieba.posseg as pseg

jieba.enable_paddle()
str2 = '上海自来水来自海上'
seg_list = pseg.cut(str2, use_paddle=True)
for seg, flag in seg_list:
    print(seg, flag)
    # 上海 LOC
    # 自来水 n
    # 来自 v
    # 海上 s

2.3 识别新词

# 参数HMM识别新词
import jieba
str3 = '他知科技研发有限公司是一家互联网行业的公司'
seg_list = jieba.cut(str3, HMM=True)
print('精确模式分词结果:', '/'.join(seg_list))  # 精确模式分词结果: 他知/科技/研发/有限公司/是/一家/互联网/行业/的/公司

2.4 搜索引擎模式分词

# cut_for_search()函数分词
import jieba
str1 = '我来到了西北皇家理工学院,发现这儿真不错'
seg_list = jieba.cut_for_search(str1)
print('搜索引擎模式分词结果:', '/'.join(seg_list))  # 搜索引擎模式分词结果: 我/来到/了/西北/皇家/理工/工学/学院/理工学/工学院/理工学院/,/发现/这儿/真不/不错/真不错

三. 调整词典

3.1 使用自定义词典

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

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

让水莲花作为一个名词,一低头作为形容词: 用户词典.txt

水莲花 n
一低头 a

3.2 动态修改词典

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

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

3.3 调节次频

词频越大的词,被切分出来的概率就会越大

# 不修改词频
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.1 基于TF-IDF算法的关键词提取

# 基于TF-IDF算法的关键词提取, 提取10个词性为名词或者动词的关键词并返回权重
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)]

4.2 基于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)]

五. 停用词过滤

停用词是指每个文档中都会大量出现,但是对于NLP没有太大作用的词,如:你、我、的、在及标点符号等。过滤掉停用词可以提高NLP的效率。

# 未启动停用词过滤
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/万场/。/电商/给/农民/带来/了/新/的/机遇/。

# 启动停用词过滤
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/万场/电商/农民/带来/新/机遇

六. 词频统计

词频是分词和关键词提取的依据。在构造分词词典时,通常需要为每一个词设置词频。

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
        else:
            word_dict[seg] = 1
print(word_dict)  # {'蒸': 3, '馍馍': 5, '锅锅': 1, '一锅': 1, '锅': 1, '搁': 1, '桌桌': 2, '上面': 1}

案例:新闻关键词的提取与汇总

爬取焦点中国网的今日焦点新闻,然后从抓取到的新闻正文中提取关键词,最后将新闻标题和关键词汇总。

import requests
from bs4 import BeautifulSoup
from jieba import analyse
import os
import pandas as pd


def get_text(url):
    headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'}
    response = requests.get(url, headers)
    response.encoding = 'utf-8'
    html_data = response.text
    soup = BeautifulSoup(html_data, 'lxml')
    parse_url(soup)


def parse_url(soup):
    title = soup.select('.post-title h1')[0].string
    print(title)
    p_list = soup.select('.post-content p')
    for p in p_list:
        if p.string:
            with open(f'新闻/{title}.txt', 'a', encoding='utf-8') as fp:
                fp.write(p.string)

headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'}
url = 'http://www.centrechina.com/news/jiaodian'
response = requests.get(url, headers)
html_data = response.text
soup = BeautifulSoup(html_data, 'lxml')
hotnews_url_list = []
a_list = soup.select('.ajax-load-con h2 a')
for a in a_list:
    hotnews_url_list.append(a['href'])
for url in hotnews_url_list:
    get_text(url)

keywords_dict = {
   '新闻标题': [], '新闻检索关键词': []}
txt_name = os.listdir('新闻')
for txt_file in txt_name:
    with open('新闻/' + txt_file, 'r+', encoding='utf-8') as fp1:
        txt_content = fp1.read()
    keywords = analyse.textrank(txt_content, topK=10, withWeight=False)
    print(keywords)
    keywords_dict['新闻标题'].append(txt_file)
    keywords_dict['新闻检索关键词'].append(keywords)

news_keyswords_info = pd.DataFrame(keywords_dict, columns=['新闻标题', '新闻检索关键词'])
news_keyswords_info.to_csv('新闻关键词.csv', index=False, encoding='utf-8')

代码及资料已上传至git: https://gitee.com/cuiyonghua/Deep-Learning-Cases/tree/master/机器学习模块使用/jieba分词模块使用及案例

相关文章
|
8天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2464 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
4天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1503 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19274 29
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18822 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17515 13
Apache Paimon V0.9最新进展
|
6天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
368 11
|
1月前
|
存储 人工智能 前端开发
AI 网关零代码解决 AI 幻觉问题
本文主要介绍了 AI Agent 的背景,概念,探讨了 AI Agent 网关插件的使用方法,效果以及实现原理。
18697 16
|
2天前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
2天前
|
SQL 监控 druid
Druid连接池学习
Druid学习笔记,使用Druid进行密码加密。参考文档:https://github.com/alibaba/druid
195 82