欢迎光临
我们一直在努力

Jieba分词器完全使用指南:从安装到实战案例

前言

在中文自然语言处理(NLP)中,分词是最基础且关键的一步。Jieba(结巴)作为Python中最受欢迎的中文分词库,以其简单易用、高效准确的特点,成为众多开发者的首选。

本文对Jieba分词器的所有常见用法进行了系统性梳理,并补充了详细的代码注释与输出结果解释。无论你是NLP初学者,还是希望巩固基础的老手,这篇指南都能帮你做到“一篇在手,用法全有”。

一、Jieba分词器基础

1.1 安装

Jieba的安装非常简单,直接使用pip即可。为了支持最新的Paddle模式,建议一并安装PaddlePaddle。

bash

# 安装jieba
pip install jieba

# 安装paddlepaddle(用于Paddle模式分词,可选)
pip install paddlepaddle-tiny

# 如果遇到网络超时,可以使用清华源加速
pip install paddlepaddle-tiny -i https://pypi.tuna.tsinghua.edu.cn/simple

1.2 四种分词模式

Jieba支持四种核心分词模式,它们各有侧重:

模式特点适用场景
精确模式 将句子最精确地切分,不存在冗余词。 文本分析,如情感分析、文本分类。
全模式 扫描出所有可能的词语,速度快,但会有歧义。 词云生成、关键词发现(不追求精准性)。
搜索引擎模式 在精确模式基础上,对长词再次切分,提高召回率。 搜索引擎的索引构建。
Paddle模式 利用深度学习模型(PaddlePaddle)进行分词,效果更优,支持词性标注。 对分词精度要求极高,且需要词性标注的场景。

二、Jieba的基本用法

2.1 四种分词模式实战

jieba.cut() 是核心的分词函数,它返回一个可迭代的生成器。我们通过参数来控制不同的模式。

python

# -*- coding: utf-8 -*-
import jieba

# 待分词的文本
str1 = '我来到了西北皇家理工学院,发现这儿真不错'

# 1. 全模式 (cut_all=True)
seg_list_full = jieba.cut(str1, cut_all=True)
print('1. 全模式分词结果:')
print('/'.join(seg_list_full))
# 输出: 我/来到/了/西北/皇家/理工/理工学/理工学院/工学/工学院/学院/,/发现/这儿/真不/真不错/不错
print('解释: 全模式将所有可能的词都扫描出来,可以看到“理工学院”被拆成了“理工”、“理工学”、“理工学院”等多个词。\\n')

# 2. 精确模式 (cut_all=False, 默认)
seg_list_acc = jieba.cut(str1, cut_all=False)
print('2. 精确模式分词结果:')
print('/'.join(seg_list_acc))
# 输出: 我/来到/了/西北/皇家/理工学院/,/发现/这儿/真不错
print('解释: 精确模式将句子最精确地切开,不会产生冗余词汇,适合文本分析。\\n')

# 3. Paddle模式 (use_paddle=True)
# 使用Paddle模式前需要启用
jieba.enable_paddle()
seg_list_paddle = jieba.cut(str1, use_paddle=True)
print('3. Paddle模式分词结果:')
print('/'.join(seg_list_paddle))
# 输出: 我/来到/了/西北皇家理工学院/,/发现/这儿/真不错
print('解释: Paddle模式借助深度学习,将“西北皇家理工学院”作为一个整体识别出来,体现了其对实体词的识别能力。\\n')

2.2 词性标注

在Paddle模式下,我们可以使用jieba.posseg模块同时获取词语和对应的词性。

python

import jieba.posseg as pseg

jieba.enable_paddle()
str2 = '上海自来水来自海上'
seg_list = pseg.cut(str2, use_paddle=True)

print('Paddle模式词性标注结果:')
for word, flag in seg_list:
print(f'{word} {flag}')
# 输出:
# 上海 LOC
# 自来水 n
# 来自 v
# 海上 s
print('解释: LOC表示地名,n表示名词,v表示动词,s表示处所词。\\n')

2.3 识别新词(HMM参数)

Jieba内置了隐马尔可夫模型(HMM),用于发现词典中没有的新词(如人名、地名等)。

python

import jieba

str3 = '他知科技研发有限公司是一家互联网行业的公司'
# 开启HMM,尝试识别新词
seg_list = jieba.cut(str3, HMM=True)
print('开启HMM(默认开启)的分词结果:')
print('/'.join(seg_list))
# 输出: 他知/科技/研发/有限公司/是/一家/互联网/行业/的/公司
print('解释: 即使词典中没有“他知科技”,HMM也成功将其识别为一个公司名。\\n')

2.4 搜索引擎模式

jieba.cut_for_search() 是专为搜索引擎设计的函数,它在精确模式的基础上,对长词进行进一步拆分。

python

import jieba

str1 = '我来到了西北皇家理工学院,发现这儿真不错'
seg_list = jieba.cut_for_search(str1)
print('搜索引擎模式分词结果:')
print('/'.join(seg_list))
# 输出: 我/来到/了/西北/皇家/理工/工学/学院/理工学/工学院/理工学院/,/发现/这儿/真不/不错/真不错
print('解释: 它将“理工学院”进一步切分成“理工”、“工学”、“学院”等更短的词,提升了搜索的召回率。\\n')

三、调整词典:让分词更“懂你”

当默认词典无法满足需求时(例如出现专业术语、网络新词),我们可以通过调整词典来优化结果。

3.1 使用自定义词典

假设我们有自定义词典 user_dict.txt,内容如下:

text

水莲花 n
一低头 a

python

import jieba

text = '心灵感应般地蓦然回首,才能撞见那一低头的温柔;也最是那一低头的温柔,似一朵水莲花不胜凉风的娇羞。'

# 未加载自定义词典时
seg_list = jieba.cut(text, cut_all=False)
print('加载前:')
print('/'.join(seg_list))
# 输出: 心灵感应/般地/蓦然回首/,/才能/撞见/那一/低头/的/温柔/;/也/最/是/那/一/低头/的/温柔/,/似/一朵/水/莲花/不胜/凉风/的/娇羞/。

# 加载自定义词典
jieba.load_userdict('user_dict.txt')
seg_list = jieba.cut(text, cut_all=False)
print('\\n加载后:')
print('/'.join(seg_list))
# 输出: 心灵感应/般地/蓦然回首/,/才能/撞见/那/一低头/的/温柔/;/也/最/是/那/一低头/的/温柔/,/似/一朵/水莲花/不胜/凉风/的/娇羞/。
print('解释: 加载后,“一低头”被正确地当作一个形容词,“水莲花”被当作一个名词,而不是被拆分。\\n')

3.2 动态修改词典

在代码运行过程中,可以使用 add_word() 和 del_word() 动态增删词条。

python

import jieba

text = '心灵感应般地蓦然回首,才能撞见那一低头的温柔;也最是那一低头的温柔。'

# 先加载自定义词典
jieba.load_userdict('user_dict.txt')

# 动态添加一个新词
jieba.add_word('最是')
seg_list = jieba.cut(text, cut_all=False)
print('添加“最是”后:')
print('/'.join(seg_list))
# 输出: 心灵感应/般地/蓦然回首/,/才能/撞见/那/一低头/的/温柔/;/也/最是/那/一低头/的/温柔/。
print('解释: 原本的“也/最/是”合并成了“也/最是”。\\n')

# 动态删除一个词
jieba.del_word('一低头')
seg_list = jieba.cut(text, cut_all=False)
print('删除“一低头”后:')
print('/'.join(seg_list))
# 输出: 心灵感应/般地/蓦然回首/,/才能/撞见/那一/低头/的/温柔/;/也/最是/那/一低头/的/温柔/。
print('解释: 删除后,“一低头”又被拆开了。\\n')

3.3 调节词频

词频决定了词语被切分出来的概率。使用 suggest_freq() 可以调整单个词的词频。

python

import jieba

str3 = '他认为未来几年健康产业在GDP中将占比第一。'

# 不调整词频
print('调整前:')
print('/'.join(jieba.cut(str3, HMM=False)))
# 输出: 他/认为/未来/几年/健康/产业/在/GDP/中将/占/比/第一/。

# 调整词频:告诉Jieba“中将”和“占比”应该分开/合并
jieba.suggest_freq(('中', '将'), True) # 希望“中将”分开
jieba.suggest_freq('占比', True) # 希望“占比”合并

print('\\n调整后:')
print('/'.join(jieba.cut(str3, HMM=False)))
# 输出: 他/认为/未来/几年/健康/产业/在/GDP/中/将/占比/第一/。
print('解释: 通过调节词频,我们纠正了默认分词器的错误。\\n')

四、关键词提取

Jieba的analyse模块提供了两种经典的关键词提取算法:TF-IDF和TextRank。

4.1 基于TF-IDF算法

python

from jieba import analyse

text = '记者日前从中国科学院南京地质古生物研究所获悉,该所早期生命研究团队与美国学者合作,在中国湖北三峡地区的石板滩生物群中,发现了4种形似树叶的远古生物。这些“树叶”实际上是形态奇特的早期动物,它们生活在远古海洋底部。相关研究成果已发表在古生物学国际专业期刊《古生物学杂志》上。'

# 提取关键词
# topK: 返回前10个关键词
# withWeight: 是否返回权重
# allowPOS: 限制词性,这里只保留名词(n)和动词(v)
keywords = analyse.extract_tags(text, topK=10, withWeight=True, allowPOS=('n', 'v'))

print('TF-IDF关键词(带权重):')
for word, weight in keywords:
print(f'{word}: {weight:.4f}')
# 输出:
# 古生物学: 0.7832
# 树叶: 0.6636
# 生物群: 0.4324
# 古生物: 0.3812
# 期刊: 0.3655
# 石板: 0.3470
# 形似: 0.3288
# 研究成果: 0.3279
# 团队: 0.2827
# 获悉: 0.2807
print('解释: TF-IDF通过词频和逆文档频率来衡量词的重要性。\\n')

4.2 基于TextRank算法

python

from jieba import analyse

text = '记者日前从中国科学院南京地质古生物研究所获悉,该所早期生命研究团队与美国学者合作,在中国湖北三峡地区的石板滩生物群中,发现了4种形似树叶的远古生物。这些“树叶”实际上是形态奇特的早期动物,它们生活在远古海洋底部。相关研究成果已发表在古生物学国际专业期刊《古生物学杂志》上。'

# 使用TextRank算法
keywords = analyse.textrank(text, topK=10, withWeight=True, allowPOS=('n', 'v'))

print('\\nTextRank关键词(带权重):')
for word, weight in keywords:
print(f'{word}: {weight:.4f}')
# 输出:
# 古生物学: 1.0000
# 树叶: 0.8798
# 形似: 0.6766
# 专业: 0.6685
# 生物: 0.6487
# 发表: 0.6139
# 生物群: 0.5998
# 期刊: 0.5651
# 国际: 0.5643
# 获悉: 0.5621
print('解释: TextRank利用词之间的共现关系构建图模型,计算节点重要性。\\n')

五、停用词过滤

停用词(如“的”、“了”、“在”)对NLP任务贡献不大,通常需要过滤掉。

python

import jieba

# 假设我们有一个停用词文件 stopwords.txt
# 内容示例: 的 了 在 , 。 等
with open('stopwords.txt', 'r', encoding='utf-8') as fp:
stopwords = set(fp.read().splitlines()) # 使用集合提高查找效率

text = '商务部4月23日发布的数据显示,一季度,全国农产品网络零售额达936.8亿元,增长31.0%;电商直播超过400万场。电商给农民带来了新的机遇。'

# 分词并过滤
word_list = []
for word in jieba.cut(text):
if word not in stopwords:
word_list.append(word)

print('过滤停用词后:')
print('/'.join(word_list))
# 输出: 商务部/4/月/23/日/发布/数据/显示/一季度/全国/农产品/网络/零售额/达/936.8/亿元/增长/31.0%/电商/直播/超过/400/万场/电商/农民/带来/新/机遇
print('解释: 常见的停用词如“的”、“了”、“,”都被过滤掉了。\\n')

六、词频统计

词频统计是很多NLP任务的基础。

python

import jieba

text = '蒸馍馍锅锅蒸馍馍,馍馍蒸了一锅锅,馍馍搁上桌桌,桌桌上面有馍馍。'
stopwords = set([',', '。', '了', '上']) # 简单的停用词

# 调节词频,确保“桌桌”不被切错
jieba.suggest_freq(('桌桌'), True)

word_dict = {}
for word in jieba.cut(text):
if word not in stopwords:
word_dict[word] = word_dict.get(word, 0) + 1

print('词频统计结果:')
print(word_dict)
# 输出: {'蒸': 3, '馍馍': 5, '锅锅': 1, '一锅': 1, '锅': 1, '搁': 1, '桌桌': 2, '上面': 1}
print('解释: 统计出了每个非停用词在文本中出现的次数。\\n')

七、实战案例:新闻关键词的提取与汇总

这个案例综合了网络爬虫、分词和关键词提取技术,从新闻网站抓取内容,并生成关键词汇总表。

由于该案例涉及网络爬虫,运行时请确保已安装 requests 和 beautifulsoup4。

python

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

def get_text(url):
"""根据URL获取新闻正文并保存到文件"""
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml')

# 获取标题
title = soup.select('.post-title h1')[0].string.strip()
print(f'正在处理: {title}')

# 获取正文段落并写入文件
p_list = soup.select('.post-content p')
os.makedirs('新闻', exist_ok=True) # 创建目录
with open(f'新闻/{title}.txt', 'w', encoding='utf-8') as fp:
for p in p_list:
if p.string:
fp.write(p.string + '\\n')

# 1. 抓取焦点新闻列表页
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
url = 'http://www.centrechina.com/news/jiaodian'
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')

# 提取新闻详情页链接
hotnews_urls = []
for a in soup.select('.ajax-load-con h2 a'):
hotnews_urls.append(a['href'])

# 2. 逐个抓取新闻正文
for news_url in hotnews_urls:
try:
get_text(news_url)
except Exception as e:
print(f"抓取 {news_url} 失败: {e}")

# 3. 对保存的新闻进行关键词提取
keywords_dict = {'新闻标题': [], '新闻检索关键词': []}
txt_files = os.listdir('新闻')

for txt_file in txt_files:
with open('新闻/' + txt_file, 'r', encoding='utf-8') as f:
content = f.read()

# 使用TextRank提取关键词
keywords = analyse.textrank(content, topK=5, withWeight=False, allowPOS=('n', 'v'))

keywords_dict['新闻标题'].append(txt_file)
keywords_dict['新闻检索关键词'].append(','.join(keywords)) # 用逗号连接

# 4. 保存结果到CSV
df = pd.DataFrame(keywords_dict, columns=['新闻标题', '新闻检索关键词'])
df.to_csv('新闻关键词汇总.csv', index=False, encoding='utf-8-sig')
print('\\n关键词提取完成,结果已保存到 新闻关键词汇总.csv')

赞(0)
未经允许不得转载:171主机测评 » Jieba分词器完全使用指南:从安装到实战案例
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址