jieba 中文分词

这里写目录标题

  • 介绍 Introduction
  • 模块安装 Install
  • 导入模块 Import
  • 机制 Mechanism
  • 功能详解 Function
    • 分词
    • 添加自定义词典
      • 载入自定义词典【词典 = 默认词典 + 自定义词典】 —————— `“给机器加词典(临时)”`
      • 使用自定义词典【使用词典 = 自定义词典】 —————— `“给机器换词典(临时)”`
      • 词典格式
      • 调整词典(添加、删除、调整词频)
    • Tokenize:分词后返回词语在原文的起止位置
    • 词性标注
    • 提取关键词
  • 其他词典

介绍 Introduction

“结巴”中文分词:做最好的 Python 中文分词组件

  1. 特点

    • 支持四种分词模式】:
      • 精确模式】,试图将句子根据词典中有的词最精确地切开,适合文本分析;
      • 全模式】,把句子中所有的词典中存在的词语都扫描出来, 速度非常快,但是不能解决歧义;
      • 搜索引擎模式】,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
      • paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tiny,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使用该模式
    • 支持繁体分词
    • 支持自定义词典
    • MIT 授权协议
  2. 算法

    • 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
    • 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
    • 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
  3. 功能

    • 分词
    • 添加自定义词典
    • 关键词提取
    • 词性标注
    • 并行分词 —— 不说明
    • Tokenize:返回词语在原文的起止位置
    • ChineseAnalyzer for Whoosh 搜索引擎 —— 不说明
    • 命令行分词 —— 不说明
  4. 分词速度

    测试环境: Intel® Core™ i7-2600 CPU @ 3.4GHz;《围城》.txt

    • 全模式:1.5 MB/s
    • 默认模式:400 KB/s

模块安装 Install

pip install jieba

导入模块 Import

import jieba

机制 Mechanism

分词操作通过分词器进行,分词器可以配置词典。分词时,分词器根据词典内所含有的词语,对输入的中文文字,通过全模式或精确模式或搜索模式进行分词。模块本身提供了一个默认分词器(jieba = jieba.dt = jieba.Tokenizer()),该默认分词器内内置有一个默认词典。当你对默认分词器和词典不满意时,你可以新建一个包含新词典的分词器,或者为默认分词器添加新词典,或者替换默认分词器的词典(不完全替换:使用类方法 和 完全替换:文件覆盖),从而达到个性化的分词体验。


功能详解 Function

分词

  • 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 时间

    调整词典(添加、删除、调整词频)

    1. 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

    2. jieba.del_word(word)

      ==> jieba.dt.del_word(word)

      删除分词器使用词典中的某个词

      • 参数

        word:str。希望从词典中删除的词。

      • 返回

        None

    3. 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', '日', '起', '开始', '上课', ',', '如', '有', '特殊', '调整', '将', '另行通知', '。']
        
        
        

Tokenize:分词后返回词语在原文的起止位置

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

  1. 基于 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=():仅包括指定词性的词,即筛选,默认值为空,即不筛选。

    • 返回

      列表

  2. 基于 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’)。

    • 返回

      列表


其他词典

  1. 占用内存较小的词典文件
    https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small

  2. 支持繁体分词更好的词典文件
    https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big

你可能感兴趣的:(Python第三方库,中文分词,自然语言处理,python)