首页Python【Python计算生态】j...

【Python计算生态】jieba——中文分词库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

jieba 是一个用于中文文本分词的 Python 第三方库,并且支持繁体分词。它支持四种分词模式:精确模式、全模式、搜索引擎模式和paddle模式,并且提供了自定义词典、关键词提取和词性标注等功能。
以使用 pip 快速安装 jieba 库:
pip install jieba
如果需要使用paddle模式,在运行jieba.enable_paddle()语句启动paddle模式时,会通过该接口自动下载安装paddlepaddle-tiny并且import相关代码。
但是,需要注意的是,paddlepaddle-tiny仅支持到python 3.7,因此需要创建一个python3.7或以下的虚拟环境来安装jiebapaddlepaddle-tiny,否则可能会报错。另外,有时会因为python版本问题导致程序报错,本次开发环境为:
python==3.7.3jieba==0.42.1protobuf==3.20.0

02
分词

分词功能包含以下几种模式:
  • jieba.cut():
该函数是 jieba 库中用于分词的主要函数之一。接受一个字符串作为输入,并根据 jieba 的分词算法将其分割成一个个词语。函数语法:
jieba.cut(sentence,cut_all,HMM,use_paddle)
其中:
  • sentence:需要分词的字符串;
  • cut_all:用来控制是否采用全模式;
  • HMM:用来控制是否使用 HMM 模型;
  • use_paddle:参数用来控制是否使用paddle模式下的分词模式。
该函数工作模式分为精确模式、全模式和paddle模式。
精确模式是默认的分词模式,旨在尽可能准确地将句子进行分词,适合文本分析:
seg_list = jieba.cut("小明来到北京清华大学", cut_all=False)
print("精确模式: " + "/ ".join(seg_list))
# 精确模式: 小明/ 来到/ 北京/ 清华大学
全模式会将句子中所有可能的词语都扫描出来,但是不能解决歧义问题:
seg_list = jieba.cut("小明来到北京清华大学", cut_all=True)
print("全模式: " + "/ ".join(seg_list))
# 全模式: 小/ 明来/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
使用paddle模式下的分词模式:
jieba.enable_paddle()# 启动paddle模式
seg_list = jieba.cut("小明来到北京清华大学",use_paddle=True)
print("Paddle Mode: " + '/'.join(seg_list))
# Paddle Mode: 小明/来到/北京清华大学


  • jieba.cut_for_search():
该函数是 jieba 库提供的一个专门用于搜索引擎构建索引的分词方法。该方法在精确模式的基础上,对长词再次进行切分,以提高召回率,适合用于搜索引擎构建倒排索引的分词,粒度比较细。函数语法:
jieba.cut_for_search(sentence,HMM)
其中:
  • sentence:需要分词的字符串;
  • HMM:是否使用 HMM 模型。

隐马尔可夫模型(HMM)在新词发现中的应用主要体现在中文分词领域,尤其是在处理未登录词(即不在词典中的词)时。通过分析上下文关系,HMM能够预测未知词汇的可能性分布,从而帮助系统更好地理解和处理新兴网络语言或专业术语。

该方法返回的是一个生成器(generator),因此可以直接遍历,或者使用 list() 函数将其转换为列表。

# 使用 HMM 模型
words = jieba.cut_for_search("小明来到北京清华大学")
list(words)
# ['小明', '来到', '北京', '清华', '华大', '大学', '清华大学']

# 不使用 HMM 模型
words = jieba.cut_for_search("小明来到北京清华大学" , HMM=False)
list(words)
# ['小', '明', '来到', '北京', '清华', '华大', '大学', '清华大学']

03
添加自定义词典:

可以通过添加自定义词典的方式来优化分词效果。
  •  jieba.load_userdict()载入词典:

虽然 jieba 有新词识别能力,但是有时可能不能满足需求。此时就可以加载一个自定义词典文件,添加 jieba 词库里没有的词,以保证更高的正确率。

自定义词典格式如下所示:一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。

新词一 3 i新词二 5新词三 nz新词四
使用jieba.load_userdict()函数来加载一个自定义词典文件:
jieba.load_userdict(file_name) 
其中,file_name 为文件类对象或自定义词典的路径。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
以下是一个使用 jieba 的 load_userdict 方法加载自定义词典文件并进行分词的示例代码,自定义词典文件(mydict.txt)其格式如下:
机器学习 5 n深度学习 3 n自然语言处理 10 n
运行代码,查看分词结果:
# 需要进行分词的文本
text = "机器学习和深度学习是自然语言处理领域的重要技术。"

seg_list = jieba.cut(text, cut_all=False)
print("分词结果: " + "/ ".join(seg_list))
# 分词结果: 机器/ 学习/ 和/ 深度/ 学习/ 是/ 自然语言/ 处理/ 领域/ 的/ 重要/ 技术/ 。

# 加载自定义词典文件
jieba.load_userdict('mydict.txt')

seg_list = jieba.cut(text, cut_all=False)
print("加载自定义词典后的分词结果: " + "/ ".join(seg_list))
# 加载自定义词典后的分词结果: 机器学习/ 和/ 深度学习/ 是/ 自然语言处理/ 领域/ 的/ 重要/ 技术/ 。

  • jieba.add_word() 和 jieba.del_word() 修改词典:

使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

# 需要进行分词的文本
text = "机器学习和深度学习是自然语言处理领域的重要技术。"

seg_list = jieba.cut(text, cut_all=False)
print("分词结果: " + "/ ".join(seg_list))
# 分词结果: 机器学习/ 和/ 深度学习/ 是/ 自然语言处理/ 领域/ 的/ 重要/ 技术/ 。

# 加载自定义词典文件
jieba.add_word('自然语言处理领域')

seg_list = jieba.cut(text, cut_all=False)
print("添加自定义词后的分词结果: " + "/ ".join(seg_list))
# 添加自定义词后的分词结果: 机器学习/ 和/ 深度学习/ 是/ 自然语言处理领域/ 的/ 重要/ 技术/ 。

# 加载自定义词典文件
jieba.del_word('机器学习')

seg_list = jieba.cut(text, cut_all=False)
print("删除自定义词后的分词结果: " + "/ ".join(seg_list))
# 删除自定义词后的分词结果: 机器/ 学习/ 和/ 深度学习/ 是/ 自然语言处理领域/ 的/ 重要/ 技术/ 。


  • jieba.suggest_freq() 调节词频:

使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

该函数是 jieba 库提供的一个用于调整词语频率的函数,它可以用来影响分词结果,特别是在处理特定的词语或者专有名词时非常有用。

jieba.suggest_freq(segment, tune=True)

其中:

  • segment:待调整词频的词语,可以是一个词语(字符串),也可以是包含多个词语的列表或元组;

  • tune:布尔类型的变量,表示是否开启调优模式,默认为 True。当该参数为 True 时,该函数会根据语料库中词语的出现频率来调整词频。这通常用于对特定的词语进行手动调整,以解决分词不准确的问题,比如某个专有名词或新词在默认分词中被错误切分。

例如,在下面的示例中,原本的分词结果将“机器学习”分成了“机器/学习”两部分。通过使用 jieba.suggest_freq 函数来调整“机器学习”的词频,可以得到更准确的分词结果:

# 需要进行分词的文本
text = "小明在机器学习方面有很高的研究成果。"

# 分词前的结果
seg_list = jieba.cut(text, cut_all=False)
print("分词结果: " + "/ ".join(seg_list))
# 分词结果: 小明/ 在/ 机器/ 学习/ 方面/ 有/ 很/ 高/ 的/ 研究成果/ 。

# 调整单词"机器学习"的词频
jieba.suggest_freq("机器学习", tune=True)

# 分词后的结果
seg_list = jieba.cut(text, cut_all=False)
print("调节词频后的分词结果: " + "/ ".join(seg_list))
# 调节词频后的分词结果: 小明/ 在/ 机器学习/ 方面/ 有/ 很/ 高/ 的/ 研究成果/ 。


04
关键词提取:

jieba 提供了基于 TF-IDF 和 TextRank 两种算法的关键词提取功能的函数。
  • 基于 TF-ID 算法:
TF-IDF(Term Frequency-Inverse Document Frequency)算法是一种用于信息检索和文本挖掘的常用加权技术。它反映了一个词对于一个文档集或一个语料库中的其中一份文档的重要性。TF-IDF值随着词语在文档中出现的频率成正比增加,但同时会随着词语在语料库中出现的频率成反比下降。这意味着,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
基于 TF-IDF算法的关键词提取功能的函数:
jieba.analyse.extract_tags(sentence,                            topK=20                           withWeight=False                           allowPOS=())

其中:

  • sentence:待提取的文本;

  • topK:返回几个 TF/IDF 权重最大的关键词,默认值为 20;
  • withWeight:是否一并返回关键词权重值,默认值为 False,此时将返回一个包含关键词的列表。如果为 True,将返回一个包含 (关键词, 权重) 元组的列表;
  • allowPO:仅包括指定词性的词,默认值为空,即不筛选。

示例代码:

import jieba.analyse

# 待提取的文本
text = "我爱自然语言处理,尤其是中文分词"

# 使用 TF-IDF 算法提取关键词
keywords = jieba.analyse.extract_tags(text, topK=5, withWeight=True)

# 打印关键词及其权重
print("TF-IDF 算法提取的关键词:")
for tag, weight in keywords:
    print(f"tag: {tag}     weight:{weight}")

返回结果如下:

TF-IDF 算法提取的关键词:
tag: 分词   weight: 2.340691
tag: 自然语言   weight: 2.086988
tag: 中文   weight: 1.629621
tag: 处理   weight: 1.082171
tag: 尤其   weight: 1.055573

另外,关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径,使用 jieba.analyse.set_idf_path(file_name) 函数进行设置 。

关键词提取所使用停止词(Stop Words)文本语料库也可以切换成自定义语料库的路径,使用 jieba.analyse.set_stop_words(file_name) 函数进行设置。
  • 基于 TextRank 算法:

TextRank 算法的基本思想是将文本中的词语表示为一张无向有权图,其中词为图的节点,词之间的共现关系体现为图的边的权值。通过计算图中节点的权重,找出权重排名 TopK 的节点,即关键词。

基于 TextRank 算法的关键词提取功能的函数:

jieba.analyse.textrank(sentence,                        topK=20                       withWeight=False                       allowPOS=('ns''n''vn''v'))

其中,各参数与jieba.analyse.extract_tags()函数一样,不过需要注意的是,jieba.analyse.textrank()函数默认过滤词性。

示例代码:

import jieba.analyse

# 待提取的文本
text = "我爱自然语言处理,尤其是中文分词。自然语言处理是人工智能领域的一个重要方向,它涉及到计算机科学与语言学的交叉。"

# 使用 TextRank 算法提取关键词
keywords = jieba.analyse.textrank(text, topK=5, withWeight=True , allowPOS=('ns''n''vn''v'))

# 打印关键词及其权重
print("TextRank 算法提取的关键词:")
for tag, weight in keywords:
    print(f"{tag}     {weight}")

返回结果如下:

TextRank 算法提取的关键词:
处理     1.0
领域     0.9437607498603509
涉及     0.8535948576747164
语言学     0.8499729087700155
计算机科学     0.8473805633753241

需要注意的是,因为该函数默认过滤词性,因此可能会由于以下原因导致返回结果为空:

  • 文本太短:如果输入的文本太短,可能不足以提取出关键词。

  • 参数设置问题:topK 参数设置得太小,或者 allowPOS 参数设置得太严格,导致没有关键词被提取。


05
词性标注:

jieba 提供了两种词性标注功能,可以帮助了解每个词语的词性。
  • 默认词性标注分词器:

jieba库的默认词性标注分词器是jieba.posseg.dt。这个分词器可以在分词的同时获取每个词的词性标注信息,采用的是和ictclas兼容的标记法。

示例代码:

# 待提取的文本
text = "我爱自然语言处理"

# 使用默认词性标注分词器进行分词和词性标注
words = jieba.posseg.cut(text)

# 打印每个词及其词性
for word, flag in words:
    print(f"分词文本: {word} ----> 词性标签:{flag}")

返回结果如下:

分词文本: 我 ----> 词性标签:r
分词文本: 爱 ----> 词性标签:v
分词文本: 自然语言 ----> 词性标签:l
分词文本: 处理 ----> 词性标签:v


  • paddle模式下的词性标注:

paddle模式词性和专名类别标签集合如下表,其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母):

示例代码:

jieba.enable_paddle() #启动paddle模式

# 使用paddle模式下的词性标注
words = jieba.posseg.cut(text,use_paddle=True)

# 打印每个词及其词性
for word, flag in words:
    print(f"分词文本: {word} ----> 词性标签:{flag}")

返回结果如下:

分词文本: 我 ----> 词性标签:r
分词文本: 爱 ----> 词性标签:v
分词文本: 自然语言处理 ----> 词性标签:nz


更多内容,可以前往官方GitHub页面查看:

https://github.com/fxsjy/jieba


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments