“结巴”中文分词:做最好的 Python 中文分词组件
特点
pip install paddlepaddle-tiny==1.6.1
。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,请升级jieba,pip install jieba --upgrade
。PaddlePaddle官网【目前paddlepaddle-tiny
仅支持python 3.7及以前部分版本,即python3.8及以上版本不支持通过paddlepaddle-tiny
使用该模式】算法
功能
分词速度
测试环境: Intel® Core™ i7-2600 CPU @ 3.4GHz;《围城》.txt
pip install jieba
import jieba
分词操作通过分词器进行,分词器可以配置词典。分词时,分词器根据词典内所含有的词语,对输入的中文文字,通过全模式或精确模式或搜索模式进行分词。模块本身提供了一个默认分词器(jieba = jieba.dt = jieba.Tokenizer()),该默认分词器内内置有一个默认词典。当你对默认分词器和词典不满意时,你可以新建一个包含新词典的分词器,或者为默认分词器添加新词典,或者替换默认分词器的词典(不完全替换:使用类方法 和 完全替换:文件覆盖),从而达到个性化的分词体验。
jieba.cut(sentence, cut_all=False, HMM=True, use_paddle=False)
分词的主要函数。
==> jieba.dt.cut(sentence, cut_all=False, HMM=True, use_paddle=False)
参数
【sentence
】:str。要进行分词的句子或文段。
【cut_all=False
】:默认为False,精确模式。True表示全模式
,False表示精确模式
。
HMM=True
:默认为True,使用HMM模型,即会自动发现新词,一般是使用的,即保持默认值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
use_paddle=False
:默认为False,不使用paddle模式,不怎么使用,即保持默认,可忽略。True表示使用paddle模式,False表示不使用paddle模式。
返回
返回可迭代的生成器
。
示例
---代码---
# 待分词文段
sentence = "本学期校内选修课暂定于第3周2022年3月7日起开始上课,如有特殊调整将另行通知。"
# 精确模式
result = jieba.cut(sentence, cut_all=False)
# 未处理结果
print(result)
# 处理结果
print(list(result))
# 全模式
result = jieba.cut(sentence, cut_all=True)
# 未处理结果
print(result)
# 处理结果
print(list(result))
---结果---
精确模式未处理结果:<generator object Tokenizer.cut at 0x00000217B912FA50>
精确模式处理结果:
['本学期', '校内', '选修课', '暂定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '开始', '上课', ',', '如', '有', '特殊', '调整', '将', '另行通知', '。']
全模式未处理结果:<generator object Tokenizer.cut at 0x00000217B959D2E0>
全模式处理结果:
['本学期', '学期', '校内', '选修', '选修课', '修课', '暂定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起开', '开始', '上课', ',', '如有', '特殊', '调整', '将', '另行', '另行通知', '通知', '。']
jieba.cut_for_search(sentence, HMM=True)
搜索引擎模式
。为搜索引擎提供更精细的细分,该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
==> jieba.dt.cut_for_search(sentence, HMM=True)
参数
【sentence
】:str。要进行分词的句子或文段。
HMM=True
:默认为True,使用HMM模型,一般是使用的,即保持默认值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
返回
返回可迭代的生成器
。
示例
---代码---
# 待分词文段
sentence = "本学期校内选修课暂定于第3周2022年3月7日起开始上课,如有特殊调整将另行通知。"
# 搜索引擎模式
result = jieba.cut_for_search(sentence)
# 未处理结果
print(result)
# 处理结果
print(list(result))
---结果---
搜索引擎模式未处理结果:<generator object Tokenizer.cut_for_search at 0x00000213FECAFA50>
搜搜引擎模式处理结果:
['学期', '本学期', '校内', '选修', '修课', '选修课', '暂定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '开始', '上课', ',', '如', '有', '特殊', '调整', '将', '另行', '通知', '另行通知', '。']
jieba.lcut(sentence, cut_all=False, HMM=True, use_paddle=False)
分词列表模式
。
==> jieba.dt.lcut(sentence, cut_all=False, HMM=True, use_paddle=False)
==>list(jieba.cut(sentence, cut_all=False, HMM=True, use_paddle=False))
返回
列表
示例
---代码---
# 待分词文段
sentence = "本学期校内选修课暂定于第3周2022年3月7日起开始上课,如有特殊调整将另行通知。"
# 精确模式列表模式
result = jieba.lcut(sentence, cut_all=False)
# 结果
print(result)
# 全模式列表模式
result = jieba.lcut(sentence, cut_all=True)
# 结果
print(result)
---结果---
精确模式列表模式:
['本学期', '校内', '选修课', '暂定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '开始', '上课', ',', '如', '有', '特殊', '调整', '将', '另行通知', '。']
全模式列表模式:
['本学期', '学期', '校内', '选修', '选修课', '修课', '暂定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起开', '开始', '上课', ',', '如有', '特殊', '调整', '将', '另行', '另行通知', '通知', '。']
jieba.lcut_for_search(sentence, HMM=True)
搜索引擎模式列表模式
。
==> jieba.dt.lcut_for_search(sentence, HMM=True)
==>list(jieba.cut_for_search(sentence, HMM=True))
返回
列表
示例
---代码---
# 待分词文段
sentence = "本学期校内选修课暂定于第3周2022年3月7日起开始上课,如有特殊调整将另行通知。"
# 搜索引擎模式列表模式
result = jieba.lcut_for_search(sentence)
# 结果
print(result)
---结果---
搜索引擎模式列表模式:
['学期', '本学期', '校内', '选修', '修课', '选修课', '暂定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '开始', '上课', ',', '如', '有', '特殊', '调整', '将', '另行', '通知', '另行通知', '。']
jieba.Tokenizer(dictionary=DEFAULT_DICT)
—————— “换机器”
自定义分词器,这是一个分词器的类对象,以上分词函数都是该类的方法。上面出现的jieba.dt == jieba.Tokenizer(dictionary=DEFAULT_DICT)
就是一个默认分词器,默认分词器使用默认词典。
【通俗说,分词器是一个机器,而以上各函数方法是这个机器的按钮,使用哪个函数就进行何种操作。而jieba直接调用以上函数方法,使用的就是默认分词器。所以jieba.cut() == jieba.dt.cut() == jieba.Tokenizer().cut()
】
参数
dictionary=DEFAULT_DICT
:str。分词器使用的词典,默认为模块自带的默认词典。需使用自编词典时,值替换为自编词典路径。
返回
创建分词器对象
。
示例
---默认分词器本质---
# 创建分词器
dt = jieba.Tokenizer()
# 分词器操作
dt.cut()
dt.lcut()
dt.cut_for_search()
dt.lcut_for_search()
---如何自建分词器---
# 自编词典路径
dic = “自建词典路径” # 如何自建词典暂不予以说明
# 创建分词器
tokenizer = jieba.Tokenizer(dictionary=dic)
# 分词器操作
tokenizer.cut()
tokenizer.lcut()
tokenizer.cut_for_search()
tokenizer.lcut_for_search()
“给机器加词典(临时)”
开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。
jieba.load_userdict(file_name)
==> jieba.dt.load_userdict(file_name)
载入附加一个自定义词典,将自定义词典临时附加到分词器(一般默认分词器),将会产生临时缓存文件。
参数
file_name
:str or _io.TextIOWrapper。自定义词典的文件路径或open()打开的文件类对象。若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
返回
None
。
示例
---代码---
# 待分词文段
sentence = "本学期校内选修课暂定于第3周2022年3月7日起开始上课,如有特殊调整将另行通知。"
# 不载入自定义词典进行全模式分词操作
result = jieba.lcut(sentence, cut_all=True)
# 结果
print(result)
# 载入自定义词典(如自定义词典dic.txt在同目录下,词典包含内容“行通 100 n”,该词在jieba默认词典中不具有)
jieba.load_userdict("dic.txt")
# 载入自定义词典后进行全模式分词操作
result = jieba.lcut(sentence, cut_all=True)
# 结果
print(result)
---结果---
不载入自定义词典进行全模式分词操作:
['本学期', '学期', '校内', '选修', '选修课', '修课', '暂定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起开', '开始', '上课', ',', '如有', '特殊', '调整', '将', '另行', '另行通知', '通知', '。']
载入自定义词典后进行全模式分词操作:
['本学期', '学期', '校内', '选修', '选修课', '修课', '暂定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起开', '开始', '上课', ',', '如有', '特殊', '调整', '将', '另行', '另行通知', '行通', '通知', '。']
可见载入自定义词典后进行的分词结果中出现了默认词典中不具有的“行通”一词。
“给机器换词典(临时)”
jieba.set_dictionary(dictionary_path)
==> jieba.dt.set_dictionary(dictionary_path)
等效于 jieba.Tokenizer(dictionary="词典路径")
, 但直接更改分词器词典,不需要创建新的分词器。
和 dict.txt
【jieba模块文件夹中的默认词典】 一样,一个词占一行;每一行分三部分:词语
、词频(可省略)
、词性(可省略)
,用空格隔开
,顺序不可颠倒。词频省略时使用自动计算的能保证分出该词的词频。
默认词典路径(通常)
C:\Users\“用户名”\AppData\Local\Programs\Python\Python38\Lib\site-packages\jieba\dict.txt
获取方式:
jieba.get_dict_file()
==> jieba.dt.get_dict.file()
获取分词器所使用的词典,返回文件类对象。默认返回默认词典。
---代码---
result = jieba.get_dict_file()
print(result.name)
---结果---
'C:\\Users\\Harrison\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\jieba\\dict.txt'
示例
创新办 3 i
云计算 5
凱特琳 nz
台中
词性(部分)
标签 | 含义 | 标签 | 含义 | 标签 | 含义 | 标签 | 含义 |
---|---|---|---|---|---|---|---|
n | 普通名词 | f | 方位名词 | s | 处所名词 | t | 时间 |
nr | 人名 | ns | 地名 | nt | 机构名 | nw | 作品名 |
nz | 其他专名 | v | 普通动词 | vd | 动副词 | vn | 名动词 |
a | 形容词 | ad | 副形词 | an | 名形词 | d | 副词 |
m | 数量词 | q | 量词 | r | 代词 | p | 介词 |
c | 连词 | u | 助词 | xc | 其他虚词 | w | 标点符号 |
PER | 人名 | LOC | 地名 | ORG | 机构名 | TIME | 时间 |
jieba.add_word(word, freq=None, tag=None)
==> jieba.dt.add_word(word, freq=None, tag=None)
向分词器使用词典中添加新词
参数
word
:str。希望向词典中添加的词。
freq=None
: 指定新词词频,默认为None
。词频为None
时使用自动计算的能保证分出该词的词频。
tag=None
:指定新词词性,默认为None
。
返回
None
。
jieba.del_word(word)
==> jieba.dt.del_word(word)
删除分词器使用词典中的某个词
参数
word
:str。希望从词典中删除的词。
返回
None
。
jieba.suggest_freq(segment, tune=False)
==> jieba.dt.suggest_freq(segment, tune=False)
调节单个词语的词频,使其能(或不能)被分出来。(不会改变分词器使用词典内容)
参数
segment
:tuple or str。一个词期待被分成的片段,此时输入为片段的元组;如果希望该词视为整体,则输入为字符串。
tune=False
:是否调整词频,默认为False。一般使用True。
返回
计算机计算的词频
。注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。建议分词时HMM=False。
示例
---代码---
# 待分词文段
sentence = "本学期校内选修课暂定于第3周2022年3月7日起开始上课,如有特殊调整将另行通知。"
# 不调整词频精确模式列表模式
result = jieba.lcut(sentence)
# 结果
print(result)
jieba.suggest_freq("第3周", tune=True)
# 调整词频精确模式列表模式:"第","3","周" —— "第三周"
result = jieba.lcut(sentence, HMM=False)
# 结果
print(result)
jieba.suggest_freq(("日","起"), tune=True)
# 调整词频精确模式列表模式:"日起" —— "日","起"
result = jieba.lcut(sentence, HMM=False)
# 结果
print(result)
---结果---
不调整词频精确模式列表模式:
['本学期', '校内', '选修课', '暂定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '开始', '上课', ',', '如', '有', '特殊', '调整', '将', '另行通知', '。']
调整词频精确模式列表模式:"第","3","周" —— "第3周"
['本学期', '校内', '选修课', '暂定', '于', '第3周', '2022', '年', '3', '月', '7', '日', '起', '开始', '上课', ',', '如', '有', '特殊', '调整', '将', '另行通知', '。']
调整词频精确模式列表模式:"日起" —— "日","起"
['本学期', '校内', '选修课', '暂定', '于', '第3周', '2022', '年', '3', '月', '7', '日', '起', '开始', '上课', ',', '如', '有', '特殊', '调整', '将', '另行通知', '。']
jieba.tokenize(sentence, mode="default", HMM=True)
==> jieba.dt.tokenize(sentence, mode="default", HMM=True)
sentence
:str。要进行分词的字符串。
mode="default"
:默认模式“default”
,搜索模式“search”
,默认为默认模式。
HMM=True
:默认为True,使用HMM模型,一般是使用的,即保持默认值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
返回
(word,start,end)的生成器
,start是word在输入字符串中的开始位置,end是word在输入字符串中的结束位置。
示例
---代码---
# 默认模式
result = jieba.tokenize('永和服装饰品有限公司')
print(result)
for tk in result:
print(tk)
# 搜索模式
result = jieba.tokenize('永和服装饰品有限公司', mode="search")
print(result)
for tk in result:
print(tk)
---结果---
默认模式:
<generator object Tokenizer.tokenize at 0x0000016E5F89FA50>
('永和', 0, 2)
('服装', 2, 4)
('饰品', 4, 6)
('有限公司', 6, 10)
搜索模式:
<generator object Tokenizer.tokenize at 0x0000016E5FCFBD60>
('永和', 0, 2)
('服装', 2, 4)
('饰品', 4, 6)
('有限', 6, 8)
('公司', 8, 10)
('有限公司', 6, 10)
jieba.posseg.lcut(sentence)
= list(jieba.posseg.cut(sentence))
分词后标注每个词的词性,返回jieba.posseg.pair对象(该对象可看成是一个元组)的列表或生成器。
---代码---
# 导入
import jieba.posseg
# 待分词文段
sentence = "本学期校内选修课暂定于第3周2022年3月7日起开始上课,如有特殊调整将另行通知。"
# 返回列表
result = jieba.posseg.lcut(sentence)
# 结果
print(result)
# 返回生成器
result = jieba.posseg.cut(sentence)
# 结果
print(result)
---结果---
返回列表:
[pair('本学期', 'n'), pair('校内', 's'), pair('选修课', 'v'), pair('暂定', 'd'), pair('于', 'p'), pair('第', 'm'), pair('3', 'm'), pair('周', 'nr'), pair('2022', 'm'), pair('年', 'm'), pair('3', 'm'), pair('月', 'm'), pair('7', 'm'), pair('日', 'm'), pair('起', 'v'), pair('开始', 'v'), pair('上课', 'v'), pair(',', 'x'), pair('如', 'v'), pair('有', 'v'), pair('特殊', 'a'), pair('调整', 'vn'), pair('将', 'd'), pair('另行通知', 'i'), pair('。', 'x')]
返回生成器:
<generator object cut at 0x00000240C15F5350>
导入
import jieba.analyse
基于 TF-IDF 算法的关键词抽取
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
参数
sentence
:str。为待提取的文本。
topK=20
:返回TF/IDF 权重最大的关键词的数目,默认值为 20。
withWeight=False
:是否一并返回关键词权重值,默认值为 False。
allowPOS=()
:仅包括指定词性的词,即筛选,默认值为空,即不筛选。
返回
列表
基于 TextRank 算法的关键词抽取
其思想是:通过词之间的相邻关系构建网络,然后用PageRank迭代计算每个节点的rank值,排序rank值即可得到关键词。
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
参数
sentence
topK=20
withWeight=False
allowPOS=('ns', 'n', 'vn', 'v')
:仅包括指定词性的词,即筛选,默认值为(‘ns’, ‘n’, ‘vn’, ‘v’)。
返回
列表
占用内存较小的词典文件
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small
支持繁体分词更好的词典文件
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big