每天学习一个Python第三方库之jieba库
目录
简介
1.jieba库
1.jieba库原理分析
2.jieba库的解析
3.jieba库的使用
(1.)精确模式
(2.)全模式
(3.)搜索引擎模式
(4.)添加新词
2.项目分析(判断好评或差评)
简介
在处理中文文本的 Python 第三方库中,jieba 库绝对是不可或缺的 “利器”。它专注于中文分词,能将连续的中文语句精准拆分成有意义的词语,为后续的文本分析、自然语言处理等工作打下坚实基础。无论是新闻数据的关键词提取、社交媒体评论的情感分析,还是聊天机器人的语义理解,jieba 库都能发挥重要作用。对于数据分析师,它能让中文文本数据的处理效率大幅提升;对于自然语言处理爱好者,掌握 jieba 库是深入探索中文语义世界的第一步。
1.jieba库
1.jieba库原理分析
jieba 库可用于将中文的一段语句切分为单词,通常用于解析中文语句的含义。例如在分析中文语句含义时,首先需将这句话正确地分解为单个词,即 “我们”“在”“学习”“Python”“办公自动化”,而中文语句是一直连续的文字组合,倘若单词分解错误就无法理解这句话的含义,例如 “我”“们在”。jieba库的安装命令如下:
pip install jieba
2.jieba库的解析
接下来对 jieba 库做一个简单的分析。使用 pip 工具下载、安装完 jieba 库后,打开 jieba 库安装目录(可使用命令 pip show jieba 返回的 Location 获取到安装目录地址)后,文件分布如下:
其中最为关键的是__init__.py 文件,包含用于创建分词对象的类 Tokenizer,类 Tokenizer 包含分词相关的方法。analyse 文件夹中是用于设计算法以实现分词对象的类 Tokenizer,类 Tokenizer 包含分词完成后处理的相关代码。lac 文件夹中是用于实现分析词语的相关代码。lac_small 文件夹中是用于实现创建词法分析模型和模型数据读取器的相关代码。main.py 文件可以实现使用命令的形式运行 jieba 库中函数的功能(与 Pyinstaller 库的使用方法不同)。dict.txt 文件是 jieba 库中的词典,用于保存所有的词语。
类Tokenizer 的简洁定义:
class Tokenizer(object):def __init__(self, dictionary=None): # 构造函数passdef initialize(self):passdef cut(self, sentence, HMM=True): # 计算分词passdef cut_for_search(self, sentence, HMM=True): # 搜索引擎模式分词,返回一个分词对象passdef lcut(self, sentence, HMM=True): # 精确模式分词,返回一个列表passdef lcut_for_search(self, sentence, HMM=True): # 搜索引擎模式分词,返回一个列表passdef tokenize(self, sentence, mode='default'): # 获取词图passdef insert_word(self, word, freq=None, tag=None): # 向词典中添加单词passdef del_word(self, word): # 删除一个单词passdef suggest_freq(self, segment, tune=False): # 调节单词的频率passdef posseg(self, sentence, HMM=True): # 词性标注,HMM=Truepassdef tokenize(self, sentence, mode='default', HMM=True): # 设置分词依赖的词典passdef set_dictionary(self, dictionary_path): # 设置分词依赖的词典pass
这里只要简单看一下理解一下就行
3.jieba库的使用
(1.)精确模式
精确模式指对句子进行精确的切分,是文本分析中较为常用的一种模式。其使用形式如下:
cut(sentence, cut_all=False, HMM=True, use_paddle=False)
参数 sentence:需要分词的中文句子,值的数据类型为字符串类型。
参数 cut_all:参数值的数据类型为布尔值类型,值为 False 表示使用精确模式,值为 True 表示使用全模式。
参数 HMM:是否使用隐马尔可夫模型(一种优化模型算法)。
import jieba
s = '我们在学习Python办公自动化'
jb_a = jieba.Tokenizer() #类Tokenizer所包含的处理分词的方法
result = jb_a.cut(sentence = s) #精确模式
print(result,list(result))
# 运行结果:['我们', '在', '学习', 'Python', '办公自动化']
第 3 行代码使用 jieba 库中的类 Tokenizer 初始化一个分词对象 jb_a。
第 4 行代码使用了分词对象中的 cut () 方法,并对第 2 行代码中的字符串内容进行了精确模式分词。
第 5 行代码输出结果,由于 cut () 方法分词后会返回一种 Python 内部数据,因此可以使用 list () 函数将该数据转换为列表类型数据。
(2.)全模式
全模式指把句子中所有可以成词的词语都扫描出来,这种分词模式虽然速度快,但不能解决歧义问题。在 cut () 方法中的参数 cut_all 的值设置为 True 即可使用全模式。
import jieba
s = '我们在学习Python办公自动化'
jb_a = jieba.Tokenizer()
result = jb_a.cut(sentence = s,cut_all=True)#全模式
print(list(result))
# 运行结果为:['我们', '在', '学习', 'Python', '办公', '办公自动化', '自动', '自动化']
结果中每个可以作为一个单词的文字都将展示出来。
(3.)搜索引擎模式
搜索引擎模式指在精确模式基础上,对长词再次切分,适用于搜索引擎分词。其使用形式如下:
cut_for_search(sentence, HMM=True)
参数 sentence:需要分词的中文句子,值的数据类型为字符串类型。
参数 HMM:是否使用隐马尔可夫模型。
import jieba
s = '我们在学习Python办公自动化'
jb_a = jieba.Tokenizer()
result = jb_a.cut_for_search(sentence = s)#搜索引擎模式
print(list(result))
# 运行结果:['我们', '在', '学习', 'Python', '办公', '自动', '自动化', '办公自动化']
第 4 行代码使用 cut_for_search () 对第 2 行代码中的文字进行搜索引擎模式分词,在精确模式的基础上再次对 “办公自动化” 进行分词。
(4.)添加新词
除了以上 3 种分词模式,由于社会还会不断地创造出新的词语,因此为了满足当前社会对分词的需求,还可以使用 add_word () 方法向词典中添加新词(添加的词语不是永久的,仅在当前代码中有效)。其使用形式如下:
add_word(word, freq=None, tag=None)
参数 word:需要添加到词典中的词语。
import jieba
s = '我们在学习Python办公自动化'
jb_a = jieba.Tokenizer()
jb_a.add_word('Python办公自动化')#添加新词
result = jb_a.cut(sentence = s)
print(list(result))
#运行结果:['我们', '在', '学习', 'Python办公自动化']
第 4 行代码使用 add_word () 方法将单词 “Python 办公自动化” 添加到词典中。
第 5 行代码使用 cut () 方法进行精确模式分词。
2.项目分析(判断好评或差评)
为了自动识别例如抖音的某个视频、微博的某个文案、淘宝的某个商品的评论为好评或差评,需要设计一个可以自动判断用户评论好坏的代码程序。
项目任务
任务 1:使用 jieba 库将用户的评论分词为一个个单词,并建立一套好评、差评论库,例如在以下代码中列表 good 中为好评词语,列表 bad 中为差评词语。
任务 2:将用户评论分词后的单词分别与列表 good、bad 进行匹配,并统计好评词语和差评词语的个数。
import jieba
good = ['好评','好看']
bad = ['差评','垃圾']
s_1 = '衣服好看,显得皮肤白'
s_2 = '尺寸不差评分必须高'
s_3 = '差评买过最垃圾的东西'
def get_value(s):good_value = bad_value = 0result = list(jieba.cut(sentence=s))print(result)for r in result:if r in good:good_value += 1if r in bad:bad_value += 1print('好评词语个数:',good_value,'差评词语个数:',bad_value)if good_value > bad_value:print('此条评论为好评')elif good_value == bad_value:print('此条评论暂无法判断')else:print('此条评论为差评')
get_value(s_1)
get_value(s_2)
get_value(s_3)
第 5 行代码s_2 = '尺寸不差评分必须高'
中虽然存在 “差评” 两个字,但其实际含义为 “尺寸不差,评分必须高”,因此需要使用 jieba 库对评论文字进行分词,最大概率地确保评论中的词语没有歧义。
第 2、3 行代码中的 good 和 bad 分别保存好评词语和差评词语。在实际开发中的词语可能会远比代码中的词语多,读者在实际开发中可以自行增加。
第 4 - 6 行代码中为 3 条待分析的评论。
第 7 - 22 行代码创建了一个用于分析评论的函数 get_value ()。其中第 8 行代码中的 good_value 和 bad_value 用于统计好评词语和差评词语的个数。第 9 行代码使用 jieba.cut () 方法将评论解析为单词。第 10 - 14 行代码使用 for 循环依次判断解析后的词语中是否有好评词语或差评词语,如果有好评词语则 good_value 加 1,如果有差评词语则 bad_value 加 1。第 17 - 22 行代码用于判断 good_value 和 bad_value 的大小,如果好评词语的个数大于差评词语的个数,则表明评论为好评;如果个数相同则暂时无法判断评论是好评还是差评;如果好评词语的个数小于差评词语的个数,则表明评论为差评。