接着上篇内容,这篇我们来看一下jieba分词。
3.2 Jieba分词
Jieba库是一款优秀的 Python 第三方中文分词库。Jieba的用途广泛,包括文本挖掘、自然语言处理等领域,能够有效地处理中文文本中的分词、词性标注等。Jieba分词自带了一个叫做dict.txt的词典,里面有34万+条词,其每行包含了词条、词条出现的次数和词性。接下来我们重点讲一下jieba分词功能,它是基于词典和统计相结合的分词方法,可以支持简体和繁体两种形式文本。
3.2.1 Jieba分词算法原理
- 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
- 采用了动态规划查找最大概率路径,找出基于词频的最大切分组合
- 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
3.2.2 Jieba支持的分词模式
Jieba库支持四种分词模式:
- 精确模式:试图将句子最精确地切开,适合文本分析,语法为 jieba.cut(text, cut_all=False)。
- 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义,可能会有重叠,适合词频统计,语法为 jieba.cut(text, cut_all=True)。
- 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词、处理用户查询,语法为 jieba.cut_for_search(text)。
- Paddle模式:利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。这种模式特别适合需要更高准确性分词的应用场景。jieba.cut(text, use_paddle=True)。
注:双向GRU(Gated Recurrent Unit)指的是在循环神经网络(RNN)中,同时使用正向和反向GRU来处理序列数据。这样做可以让网络不仅捕捉到从前到后的序列信息,也能捕捉到从后到前的信息,从而提高模型对序列数据的理解和预测能力。双向GRU广泛应用于自然语言处理和语音识别等领域,特别是在需要理解上下文信息时。
3.2.3 Jieba调用方法
jieba.cut 或 jieba.lcut:该方法接受四个参数,jieba.cut(text,cut_all=True,HMM=True,use_paddle=True) 或 jieba.lcut(text,cut_all=True,HMM=True,use_paddle=True)
参数1:text,待切分的字符串(文本)
参数2:cut_all,用来控制是否采用全模式(cut_all=True),默认为精确模式(cut_all=False)
参数3:HMM,用来控制是否适用HMM模型
参数4:use_paddle,用来控制是否使用paddle模式下的分词模式
jieba.cut_for_search 或 jieba.lcut_for_search:该方法接受两个参数, 该方法适用于搜索引擎构建倒排索引的分词,粒度比较细,jieba.cut_for_search(text,HMM=True) 或 jieba.lcut_for_search(text,HMM=True)
参数1:text,待切分的字符串(文本)
参数2:HMM,用来控制是否适用HMM模型
jieba.cut 和 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语。
jieba.lcut 和 jieba.lcut_for_search 直接返回 list。
3.2.4 Jieba安装
Pycharm中pip方式jieba库安装(百度镜像):
pip install -i https://mirror.baidu.com/pypi/simple jieba
Pycharm中pip方式paddlepaddle安装:
1、查看环境,需要确认 python 的版本是否满足要求,使用以下命令确认是 3.8/3.9/3.10/3.11/3.12
python --version
2、确认 pip 的版本是否满足要求,要求 pip 版本为 20.2.2 或更高版本
python -m ensurepip
python -m pip --version
3、确认 Python 和 pip 是 64bit,并且处理器架构是 x86_64(或称作 x64、Intel 64、AMD64)架构。下面的第一行输出的是”64bit”,第二行输出的是”x86_64”、”x64”或”AMD64”即可:
python -c "import platform;print(platform.architecture()[0]);print(platform.machine())"
4、满足以上环境后,安装PaddlePaddle(CPU 版)
python -m pip install paddlepaddle==2.6.0 -i https://mirror.baidu.com/pypi/simple
注:如需安装GPU版,或者使用其他系统其他安装方式,可参考PaddlePaddle官网:https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/windows-pip.html#cpu
3.2.5 Jieba分词应用示例
四种分词模式分词代码示例:
jieba.cut 和 jieba.cut_for_search方法:
import jieba
jieba.enable_paddle() # 启用Paddle模式
text = "我来到南京长江大桥,我喜欢看周处除三害这个电影"
print(f'精确模式分词:{"/".join(jieba.cut(text, cut_all=False))}')
print(f'全模式分词:{"/".join(jieba.cut(text, cut_all=True))}')
print(f'搜索模式分词:{"/".join(jieba.cut_for_search(text))}')
print(f'Paddle模式分词:{"/".join(jieba.cut(text, use_paddle=True))}')
print(f'HMM模式分词:{"/".join(jieba.cut(text, use_paddle=False, HMM=True))}')
jieba.lcut 和 jieba.lcut_for_search方法:
import jieba
jieba.enable_paddle() # 启用Paddle模式
text = "我来到南京长江大桥,我喜欢看周处除三害这个电影"
print(f'精确模式分词:{(jieba.lcut(text, cut_all=False))}')
print(f'全模式分词:{(jieba.lcut(text, cut_all=True))}')
print(f'搜索模式分词:{(jieba.lcut_for_search(text))}')
print(f'Paddle模式分词:{(jieba.lcut(text, use_paddle=True))}')
print(f'HMM模式分词:{(jieba.lcut(text, use_paddle=False, HMM=True))}')
3.2.6 Jieba自定义词典
指定自己自定义的词典,以便包含 jieba 词库里没有的词。通过这种方式,jieba分词能够更准确地识别文本中的专有名词和行业术语,从而提升分词效果。
用法:jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径。
词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
代码示例:
import jieba
# 示例文本
text = "我喜欢看热辣滚烫和周处除三害"
# 默认分词
default_seg_list = jieba.cut(text, cut_all=False)
print("默认分词:", "/ ".join(default_seg_list))
# 加载自定义词典
jieba.load_userdict(r"user_dict.txt") # 替换为自定义词典的路径
# 使用自定义词典后的分词
custom_seg_list = jieba.cut(text, cut_all=False)
print("加载自定义词典后的分词:", "/ ".join(custom_seg_list))
3.2.7 Jieba词典增加词、删除词
有时针对实际问题,需要为jieba词典增加、删除一些词,但增加或删除词只对长词起作用,对于比jieba自己的词还短的词,分词时不起作用。
使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
代码示例:
import jieba
text = "我喜欢看热辣滚烫和周处除三害"
# 增加短词“热”,分词结果不变
jieba.add_word("热")
seg_list = jieba.cut(text,cut_all=False)
print("/ ".join(seg_list))
# 增加长词“热辣滚烫”,分词结果改变
jieba.add_word("热辣滚烫")
jieba.add_word("周处除三害")
seg_list = jieba.cut(text,cut_all=False)
print("/ ".join(seg_list))
# 使用del_word删除词“热辣”
jieba.del_word("热辣")
seg_list = jieba.cut(text,cut_all=False)
print("/ ".join(seg_list))
# 使用del_word删除词“热辣滚烫”
jieba.del_word("热辣滚烫")
seg_list = jieba.cut(text,cut_all=False)
print("/ ".join(seg_list))
3.2.8 案例:使用Jieba分词对豆瓣评论进行分词
import pandas as pd
import jieba
# 加载数据
file_path = r"douban_comments.xlsx"
df = pd.read_excel(file_path)
# 初始化jieba模式
jieba.initialize()
# 精确模式
df['精确模式分词'] = df['评论内容'].apply(lambda x: '/'.join(jieba.cut(x, cut_all=False)))
# 全模式
df['全模式分词'] = df['评论内容'].apply(lambda x: '/'.join(jieba.cut(x, cut_all=True)))
# 搜索引擎模式
df['搜索模式分词'] = df['评论内容'].apply(lambda x: '/'.join(jieba.cut_for_search(x)))
# Paddle模式
try:
jieba.enable_paddle()
df['Paddle模式分词'] = df['评论内容'].apply(lambda x: '/'.join(jieba.cut(x, use_paddle=True)))
except Exception as e:
df['Paddle模式分词'] = f"启用Paddle模式失败: {str(e)}"
# HMM模式
df['HMM模式分词'] = df['评论内容'].apply(lambda x: '/'.join(jieba.cut(x, HMM=True)))
# 添加自定义词典后的分词(此处假设自定义词典路径为 user_dict.txt,需要预先准备好)
user_dict_path = r"user_dict.txt"
jieba.load_userdict(user_dict_path)
df['自定义词典分词'] = df['评论内容'].apply(lambda x: '/'.join(jieba.cut(x)))
# 保存结果
output_path = 'douban_comments_processed.xlsx'
df.to_excel(output_path, index=False)
3.2.9 停用词过滤
在分词过后,遍历一下停用词表,去掉停用词,这样可以提高文本分析和关键词提取的准确性。停用词一般指高频但信息量小的词,如“的”、“是”等,这些词对于文本所表达的内容几乎没有任何贡献,即对于文本分类没有太大作用。因此,有必要将这些停用词从原始文本中过滤掉,这个过程称为停用词过滤。常用的停用词字典库包含“哈工大停用词词库”、“四川大学机器学习智能实验室停用词库”、百度停用词表“等。当然,也可以自己定义停用词,使用方法类似于jieba自定义词典。
停用词的过滤一方面可以降低特征维度,以提高文本分类算法的效率和速度,节省计算资源;另一方面可以准确地表示文本。
用jieba.lcut或jieba.cut时,过滤停用词代码示例:
import jieba
import pandas as pd
# 加载停用词表
stopwords = set()
with open(r"stopwords.txt", 'r', encoding='utf-8') as f:
for line in f:
stopwords.add(line.strip())
# 分词并过滤停用词
text = "jieba分词是一个很好用的Python库"
words = jieba.cut(text)
filtered_words = [word for word in words if word not in stopwords]
print("/ ".join(filtered_words))
# 文本数据替换为EXCEL表中“评论内容”列
# 加载EXCEL表
file_path = r"douban_comments.xlsx"
df = pd.read_excel(file_path)
# 自定义函数:对评论内容进行分词,过滤停用词
def filtered_words(content):
words = jieba.cut(content)
filtered_words = [word for word in words if word not in stopwords]
return '/ '.join(filtered_words)
# 应用函数,对每条评论进行分词,过滤停用词
df['分词结果'] = df['评论内容'].apply(filtered_words)
# 查看结果
print(df[['评论内容', '分词结果']].head())
# 保存结果
output_path = r"douban_comments_processed.xlsx"
df.to_excel(output_path, index=False)
这段代码首先从stopwords.txt文件中读取停用词并存储在一个集合中,然后对文本进行分词,并通过列表推导式过滤掉那些在停用词集合中的词。最后,输出过滤停用词后的分词结果。