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

1.1. jieba介绍

jieba 是目前最好的 Python 中文分词组件(其他:如Ansj、盘古分词等)

安装:

pip install common dual tight data prox paddle
pip install jieba

1.1.1. 特点

支持 4 种分词模式:

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

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

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

  • 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 = '我来到北京清华大学'
>>> print(str)
>>> print('精确模式:', jieba.lcut(str))
>>> print('全模式:', jieba.lcut(str, cut_all=True))
>>> print('搜索引擎模式:', jieba.lcut_for_search(str))
>>> print('paddle模式:', jieba.lcut(str, use_paddle=True))
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
我来到北京清华大学
Loading model cost 0.790 seconds.
Prefix dict has been built successfully.
精确模式: ['我', '来到', '北京', '清华大学']
全模式: ['我', '来到', '北京', '清华', '清华大学', '华大', '大学']
搜索引擎模式: ['我', '来到', '北京', '清华', '华大', '大学', '清华大学']
paddle模式: ['我', '来到', '北京', '清华大学']
  • 支持繁体分词

  • 支持自定义词典

  • MIT 授权协议

1.1.2. 安装说明

代码对 Python 2/3 均兼容

  • 全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba

  • 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install

  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录

  • 通过 import jieba 来引用

  • 如果需要使用paddle模式下的分词和词性标注功能,请先安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。

1.1.3. 算法

  • 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)

  • 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合

  • 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

_images/img1.jpeg

有向无环图 (DAG)

1.1.4. 主要功能

  1. 分词

  • 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 直接返回 list

  • 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}
长春/地处/中国/东北地区/,/位于/东北/的/地理/中心/,/别称/北国/春城/。

1.1.5. 添加自定义词典

开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率

用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径

词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。

词频省略时使用自动计算的能保证分出该词的词频。

  1. 关键词提取

  2. 词性标注

  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。

  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。

  • 除了jieba默认分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载方式,通过enable_paddle()安装paddlepaddle-tiny,并且import相关代码;

  1. 并行分词

  • 原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升

  • 基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows

  • 用法:

    • jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数

    • jieba.disable_parallel() # 关闭并行分词模式

  1. Tokenize:返回词语在原文的起止位置

  2. ChineseAnalyzer for Whoosh 搜索引擎

  3. 命令行分词