>>> from env_helper import info; info()
页面更新时间: 2024-05-09 15:17:37
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-20-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

1.3.1. jieba分词

为了让计算机更容易理解文本,通常中文信息处理的第一步是中文分词。中文分词是在中文句子中的词与词之间加上边界标记。

特点

支持 4 种分词模式:

  • 精确模式:试图将句子 最精确地切开 ,适合文本分析。

  • 全模式:把句子中 所有可以成词的词语都扫描出来 ,速度非常快,但是不能解决歧义。

  • 搜索引擎模式: 在精确模式的基础上,对长词再次切分 ,提高召回率,适合用于搜索引擎分词。

  • paddle模式: 不必安装额外类库,可直接在 jieba 中使用。

原资料: paddle模式:利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tinypip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,请升级jieba,pip install jieba --upgrade 。PaddlePaddle官网 (https://www.paddlepaddle.org.cn/)

原资料: paddle模式在较新版本的Python中无法使用。Google关键词paddlepaddle-tiny,第二个链接就是jieba分词中的issue,指出paddlepaddle-tiny仅支持到python 3.7。python官网显示最新的版本为python 3.7.13但是conda不支持,使用conda search命令发现最新支持到python 3.7.10

四种分词模式

>>> import jieba
>>> # import paddle
>>> # paddle.enable_static()
>>> str_text = '我来到北京清华大学'
>>> print(str)
>>> print('精确模式:', jieba.lcut(str_text))
>>> print('全模式:', jieba.lcut(str_text, cut_all=True))
>>> print('搜索引擎模式:', jieba.lcut_for_search(str_text))
>>> print('paddle模式:', jieba.lcut(str_text, use_paddle=True))
<class 'str'>
精确模式: ['我', '来到', '北京', '清华大学']
全模式: ['我', '来到', '北京', '清华', '清华大学', '华大', '大学']
搜索引擎模式: ['我', '来到', '北京', '清华', '华大', '大学', '清华大学']
paddle模式: ['我', '来到', '北京', '清华大学']

函数说明

  • jieba.cut 方法接受四个输入参数: 需要分词的字符串; cut_all 参数用来控制是否采用全模式; HMM 参数用来控制是否使用 HMM 模型; use_paddle 参数用来控制是否使用paddle分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且 import 相关代码;

  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8

  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用 jieba.lcut 以及 jieba.lcut_for_search 直接返回列表

  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。 jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

代码示例如下:

>>> import jieba,math
>>> import jieba.analyse
>>>
>>> # import paddle
>>> # paddle.enable_static()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
>>>
>>> str_text="长春地处中国东北地区,位于东北的地理中心,别称北国春城。"

全模式 cut_all=True

>>> str_quan1=jieba.cut(str_text,cut_all=True)
>>> print('全模式分词:{ %d}' % len(list(str_quan1)))
>>> str_quan2=jieba.cut(str_text,cut_all=True)
>>> print("/".join(str_quan2))
全模式分词:{ 19}
长春/春地/地处/中国/东北/东北地区/北地/地区/,/位于/东北/的/地理/中心/,/别称/北国/春城/。

精准模式cut_all=False,默认即是:

>>> str_jing1=jieba.cut(str_text,cut_all=False)
>>> print('精准模式分词:{ %d}' % len(list(str_jing1)))
>>> str_jing2=jieba.cut(str_text,cut_all=False)
>>> print("/".join(str_jing2))
精准模式分词:{ 15}
长春/地处/中国/东北地区/,/位于/东北/的/地理/中心/,/别称/北国/春城/。

搜索引擎模式 cut_for_search

>>> str_soso1=jieba.cut_for_search(str_text)
>>> print('搜索引擎分词:{ %d}' % len(list(str_soso1)))
>>> str_soso2=jieba.cut_for_search(str_text)
>>> print("/".join(str_soso2))
搜索引擎分词:{ 18}
长春/地处/中国/东北/北地/地区/东北地区/,/位于/东北/的/地理/中心/,/别称/北国/春城/。

使用paddle模式 use_paddle=True

>>> seg_list = jieba.cut(str_text,use_paddle=True)
>>> print('Paddle 模式分词:{ %d}' % len(list(seg_list)))
>>> seg_list2 = jieba.cut(str_text,use_paddle=True)
>>> print( '/'.join(list(seg_list2)))
Paddle 模式分词:{ 15}
长春/地处/中国/东北地区/,/位于/东北/的/地理/中心/,/别称/北国/春城/。
>>> str_text = '''其一,中国的城市,包括直辖市、副省级市、普通地级市、县级市,但不包括县。
>>>
>>> 正如《中国城市大趋势》一书所分析的,县与县级市虽然级别相同,但定位有巨大差别。县是以农业为基础的管理单元,县级市则以工商业为主。
>>>
>>> 对于县,地级市进行直管;对于县级市,地级市则只是代管。
>>>
>>> 名义之别,导致了县级市与其所在地级市,均被视为独立城市,从而单薄市级层面的人口规模,如昆山与苏州,晋江与泉州,义乌与金华。
>>>
>>> 其二,衡量城市规模,看的是城区人口,而非全市人口。
>>>
>>> 城区人口,顾名思义,不包括镇区及乡村人口,明显低于全市常住人口。城区人口占全市人口比例最高可达9成以上,最低甚至不到20%。
>>>
>>> 凡是城镇化率不高的地区,或者下辖县乡过多的城市,即使全市人口迈过了千万大关,也未必能晋级为超大特大城市。
>>>
>>> 02
>>>
>>> 7个超大城市:4大一线+成渝津
>>>
>>> 超大城市,是我国城市规模层级的金字塔尖城市。
>>>
>>> 目前,我国共有7个超大城市,除了北上广深四大一线城市,还有重庆、天津两大直辖市,以及成都。'''
>>>
>>> print(jieba.lcut(str_text))
['其一', ',', '中国', '的', '城市', ',', '包括', '直辖市', '、', '副', '省级', '市', '、', '普通', '地级市', '、', '县级市', ',', '但', '不', '包括', '县', '。', 'n', 'n', '正如', '《', '中国', '城市', '大', '趋势', '》', '一书', '所', '分析', '的', ',', '县', '与', '县级市', '虽然', '级别', '相同', ',', '但', '定位', '有', '巨大', '差别', '。', '县', '是', '以', '农业', '为', '基础', '的', '管理', '单元', ',', '县级市', '则', '以', '工商业', '为主', '。', 'n', 'n', '对于', '县', ',', '地级市', '进行', '直管', ';', '对于', '县级市', ',', '地级市', '则', '只是', '代管', '。', 'n', 'n', '名义', '之别', ',', '导致', '了', '县级市', '与其', '所在', '地级市', ',', '均', '被', '视为', '独立', '城市', ',', '从而', '单薄', '市级', '层面', '的', '人口', '规模', ',', '如', '昆山', '与', '苏州', ',', '晋江', '与', '泉州', ',', '义乌', '与', '金华', '。', 'n', 'n', '其二', ',', '衡量', '城市', '规模', ',', '看', '的', '是', '城区', '人口', ',', '而', '非', '全市', '人口', '。', 'n', 'n', '城区', '人口', ',', '顾名思义', ',', '不', '包括', '镇区', '及', '乡村人口', ',', '明显', '低于', '全市', '常住人口', '。', '城区', '人口', '占', '全市', '人口比例', '最高', '可达', '9', '成', '以上', ',', '最低', '甚至', '不到', '20%', '。', 'n', 'n', '凡是', '城镇化率', '不高', '的', '地区', ',', '或者', '下辖', '县乡', '过多', '的', '城市', ',', '即使', '全市', '人口', '迈过', '了', '千万', '大关', ',', '也', '未必', '能', '晋级', '为', '超大', '特大城市', '。', 'n', 'n', '02', 'n', 'n', '7', '个', '超大', '城市', ':', '4', '大', '一线', '+', '成渝', '津', 'n', 'n', '超大', '城市', ',', '是', '我国', '城市', '规模', '层级', '的', '金字塔', '尖', '城市', '。', 'n', 'n', '目前', ',', '我国', '共有', '7', '个', '超大', '城市', ',', '除了', '北上', '广深', '四大', '一线', '城市', ',', '还有', '重庆', '、', '天津', '两大', '直辖市', ',', '以及', '成都', '。']
>>> print(jieba.lcut(str_text, use_paddle=True))
['其一', ',', '中国', '的', '城市', ',', '包括', '直辖市', '、', '副', '省级', '市', '、', '普通', '地级市', '、', '县级市', ',', '但', '不', '包括', '县', '。', 'n', 'n', '正如', '《', '中国', '城市', '大', '趋势', '》', '一书', '所', '分析', '的', ',', '县', '与', '县级市', '虽然', '级别', '相同', ',', '但', '定位', '有', '巨大', '差别', '。', '县', '是', '以', '农业', '为', '基础', '的', '管理', '单元', ',', '县级市', '则', '以', '工商业', '为主', '。', 'n', 'n', '对于', '县', ',', '地级市', '进行', '直管', ';', '对于', '县级市', ',', '地级市', '则', '只是', '代管', '。', 'n', 'n', '名义', '之别', ',', '导致', '了', '县级市', '与其', '所在', '地级市', ',', '均', '被', '视为', '独立', '城市', ',', '从而', '单薄', '市级', '层面', '的', '人口', '规模', ',', '如', '昆山', '与', '苏州', ',', '晋江', '与', '泉州', ',', '义乌', '与', '金华', '。', 'n', 'n', '其二', ',', '衡量', '城市', '规模', ',', '看', '的', '是', '城区', '人口', ',', '而', '非', '全市', '人口', '。', 'n', 'n', '城区', '人口', ',', '顾名思义', ',', '不', '包括', '镇区', '及', '乡村人口', ',', '明显', '低于', '全市', '常住人口', '。', '城区', '人口', '占', '全市', '人口比例', '最高', '可达', '9', '成', '以上', ',', '最低', '甚至', '不到', '20%', '。', 'n', 'n', '凡是', '城镇化率', '不高', '的', '地区', ',', '或者', '下辖', '县乡', '过多', '的', '城市', ',', '即使', '全市', '人口', '迈过', '了', '千万', '大关', ',', '也', '未必', '能', '晋级', '为', '超大', '特大城市', '。', 'n', 'n', '02', 'n', 'n', '7', '个', '超大', '城市', ':', '4', '大', '一线', '+', '成渝', '津', 'n', 'n', '超大', '城市', ',', '是', '我国', '城市', '规模', '层级', '的', '金字塔', '尖', '城市', '。', 'n', 'n', '目前', ',', '我国', '共有', '7', '个', '超大', '城市', ',', '除了', '北上', '广深', '四大', '一线', '城市', ',', '还有', '重庆', '、', '天津', '两大', '直辖市', ',', '以及', '成都', '。']