2025年3月31日 星期一 乙巳(蛇)年 正月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python 中文分词 jieba(小白进)

时间:07-01来源:作者:点击数:39

0、安装

法1:Anaconda Prompt下输入conda install jieba

法2:Terminal下输入pip3 install jieba

1、分词

1.1、CUT函数简介
  • cut(sentence, cut_all=False, HMM=True)
  • 返回 生成器,遍历生成器即可获得分词的结果
  • lcut(sentence)
  • 返回 分词列表
  • import jieba
  • sentence = '我爱自然语言处理'
  • # 创建【Tokenizer.cut 生成器】对象
  • generator = jieba.cut(sentence)
  • # 遍历生成器,打印分词结果
  • words = '/'.join(generator)
  • print(words)
  • 打印结果
  • 我/爱/自然语言/处理
  • import jieba
  • print(jieba.lcut('我爱南海中学'))
  • 打印结果
  • [‘我’, ‘爱’, ‘南海中学’]
1.2、分词模式
  • 精确模式
  • 精确地切开
  • 全模式
  • 所有可能的词语都切出,速度快
  • 搜索引擎模式
  • 在精确模式的基础上,对长词再次切分
  • import jieba
  • sentence = '订单数据分析'
  • print('精准模式:', jieba.lcut(sentence))
  • print('全模式:', jieba.lcut(sentence, cut_all=True))
  • print('搜索引擎模式:', jieba.lcut_for_search(sentence))
  • 打印结果
  • 精准模式: [‘订单’, ‘数据分析’]
    全模式: [‘订单’, ‘订单数’, ‘单数’, ‘数据’, ‘数据分析’, ‘分析’]
    搜索引擎模式: [‘订单’, ‘数据’, ‘分析’, ‘数据分析’]
1.3、词性标注
  • jieba.posseg
  • import jieba.posseg as jp
  • sentence = '我爱Python数据分析'
  • posseg = jp.cut(sentence)
  • for i in posseg:
  • print(i.__dict__)
  • # print(i.word, i.flag)
  • 打印结果
  • {‘word’: ‘我’, ‘flag’: ‘r’}
    {‘word’: ‘爱’, ‘flag’: ‘v’}
    {‘word’: ‘Python’, ‘flag’: ‘eng’}
    {‘word’: ‘数据分析’, ‘flag’: ‘l’}

词性标注表

标注 解释 标注 解释 标注 解释
a 形容词 mq 数量词 tg 时语素
ad 副形词 n 名词 u 助词
ag 形语素 ng 例:义 乳 亭 ud 例:得
an 名形词 nr 人名 ug 例:过
b 区别词 nrfg 也是人名 uj 例:的
c 连词 nrt 也是人名 ul 例:了
d 副词 ns 地名 uv 例:地
df 例:不要 nt 机构团体 uz 例:着
dg 副语素 nz 其他专名 v 动词
e 叹词 o 拟声词 vd 副动词
f 方位词 p 介词 vg 动语素
g 语素 q 量词 vi 例:沉溺于 等同于
h 前接成分 r 代词 vn 名动词
i 成语 rg 例:兹 vq 例:去浄 去过 唸过
j 简称略语 rr 人称代词 x 非语素字
k 后接成分 rz 例:这位 y 语气词
l 习用语 s 处所词 z 状态词
m 数词 t 时间词 zg 例:且 丗 丟
1.4、词语出现的位置
  • jieba.tokenize(sentence)
  • import jieba
  • sentence = '订单数据分析'
  • generator = jieba.tokenize(sentence)
  • for position in generator:
  • print(position)
  • 打印结果
  • (‘订单’, 0, 2)
    (‘数据分析’, 2, 6)

2、词典

2.1、默认词典
  • import jieba, os, pandas as pd
  • # 词典所在位置
  • print(jieba.__file__)
  • jieba_dict = os.path.dirname(jieba.__file__) + r'\dict.txt'
  • # 读取字典
  • df = pd.read_table(jieba_dict, sep=' ', header=None)[[0, 2]]
  • print(df.head())
  • # 转字典
  • dt = dict(df.values)
  • print(dt.get('暨南大学'))
这里写图片描述
2.2、添词和删词
  • 往词典添词
  • add_word(word, freq=None, tag=None)
  • 往词典删词,等价于 add_word(word, freq=0)
  • del_word(word)
  • import jieba
  • sentence = '天长地久有时尽,此恨绵绵无绝期'
  • # 添词
  • jieba.add_word('时尽', 999, 'nz')
  • print('添加【时尽】:', jieba.lcut(sentence))
  • # 删词
  • jieba.del_word('时尽')
  • print('删除【时尽】:', jieba.lcut(sentence))
  • 打印结果
  • 添加【时尽】: [‘天长地久’, ‘有’, ‘时尽’, ‘,’, ‘此恨绵绵’, ‘无’, ‘绝期’]
    删除【时尽】: [‘天长地久’, ‘有时’, ‘尽’, ‘,’, ‘此恨绵绵’, ‘无’, ‘绝期’]
2.3、自定义词典加载
  1. 新建词典,按照格式【单词 词频 词性】添词,以UTF-8编码保存
  2. 使用函数load_userdict加载词典
  • import os, jieba
  • # 创建自定义字典
  • my_dict = 'my_dict.txt'
  • with open(my_dict, 'w', encoding='utf-8') as f:
  • f.write('慕容紫英 9 nr\n云天河 9 nr\n天河剑 9 nz')
  • # 加载字典进行测试
  • sentence = '慕容紫英为云天河打造了天河剑'
  • print('加载前:', jieba.lcut(sentence))
  • jieba.load_userdict(my_dict)
  • print('加载后:', jieba.lcut(sentence))
  • os.remove(my_dict)
  • 打印结果
  • 加载前: [‘慕容’, ‘紫英为’, ‘云’, ‘天河’, ‘打造’, ‘了’, ‘天河’, ‘剑’]
    加载后: [‘慕容紫英’, ‘为’, ‘云天河’, ‘打造’, ‘了’, ‘天河剑’]
2.4、使单词中的字符连接或拆分
  • suggest_freq(segment, tune=False)
  • import jieba
  • sentence = '上穷碧落下黄泉,两处茫茫皆不见'
  • print('修正前:', ' | '.join(jieba.cut(sentence)))
  • jieba.suggest_freq(('落', '下'), True)
  • print('修正后:', ' | '.join(jieba.cut(sentence)))
  • 打印结果
  • 修正前: 上穷 | 碧 | 落下 | 黄泉 | , | 两处 | 茫茫 | 皆 | 不见
    修正后: 上穷 | 碧落 | 下 | 黄泉 | , | 两处 | 茫茫 | 皆 | 不见

3、jieba分词原理

  1. 基于词典,对句子进行词图扫描,生成所有成词情况所构成的有向无环图Directed Acyclic Graph)
  2. 根据DAG,反向计算最大概率路径(动态规划算法;取对数防止下溢,乘法运算转为加法)
  3. 根据路径获取最大概率的分词序列
  • import jieba
  • sentence = '中心小学放假'
  • DAG = jieba.get_DAG(sentence)
  • print(DAG)
  • route = {}
  • jieba.calc(sentence, DAG, route)
  • print(route)
  • DAG
  • {0: [0, 1, 3], 1: [1], 2: [2, 3], 3: [3], 4: [4, 5], 5: [5]}
  • 最大概率路径
  • {6: (0, 0), 5: ( -9.4, 5), 4: ( -12.6, 5), 3: ( -20.8, 3), 2: ( -22.5, 3), 1: ( -30.8, 1), 0: ( -29.5, 3)}

4、识别【带空格的词】

示例:使Blade Master这类中间有空格的词被识别

  • import jieba, re
  • sentence = 'Blade Master疾风刺杀Archmage'
  • jieba.add_word('Blade Master') # 添词
  • print('修改前:', jieba.lcut(sentence))
  • jieba.re_han_default = re.compile('(.+)', re.U) # 修改格式
  • print('修改后:', jieba.lcut(sentence))
  • 打印结果
  • 修改前: [‘ Blade’, ’ ', ‘ Master’, ‘疾风’, ‘刺杀’, ‘Archmage’]
    修改后: [‘ Blade Master’, ‘疾风’, ‘刺杀’, ‘Archmage’]

5、其它

5.1、并行分词

运行环境:linux系统
开启并行分词模式,参数n为并发数:jieba.enable_parallel(n)
关闭并行分词模式:jieba.disable_parallel()

5.2、关键词提取
  • 基于TF-IDFjieba.analyse
  • 基于TextRank:jieba.textrank
  • import jieba.analyse as ja, jieba
  • text = '柳梦璃施法破解了狐仙的法术'
  • jieba.add_word('柳梦璃', tag='nr')
  • keywords1 = ja.extract_tags(text, allowPOS=('n', 'nr', 'ns', 'nt', 'nz'))
  • print('基于TF-IDF:', keywords1)
  • keywords2 = ja.textrank(text, allowPOS=('n', 'nr', 'ns', 'nt', 'nz'))
  • print('基于TextRank:', keywords2)
  • 打印结果
  • 基于TF-IDF: [‘柳梦璃’, ‘狐仙’, ‘法术’]
    基于TextRank: [‘狐仙’, ‘柳梦璃’, ‘法术’]
5.3、修改HMM参数
  • import jieba
  • text = '柳梦璃解梦C法'
  • print(jieba.lcut(text, HMM=False)) # ['柳', '梦', '璃', '解梦', 'C', '法']
  • print(jieba.lcut(text)) # ['柳梦璃', '解梦', 'C', '法']
  • jieba.finalseg.emit_P['B']['C'] = -1e-9 # begin
  • print(jieba.lcut(text)) # ['柳梦璃', '解梦', 'C', '法']
  • jieba.finalseg.emit_P['M']['梦'] = -100 # middle
  • print(jieba.lcut(text)) # ['柳', '梦璃', '解梦', 'C', '法']
  • jieba.finalseg.emit_P['S']['梦'] = -.1 # single
  • print(jieba.lcut(text)) # ['柳', '梦', '璃', '解梦', 'C', '法']
  • jieba.finalseg.emit_P['E']['梦'] = -.01 # end
  • print(jieba.lcut(text)) # ['柳梦', '璃', '解梦', 'C', '法']
  • jieba.del_word('柳梦') # Force_Split_Words
  • print(jieba.lcut(text)) # ['柳', '梦', '璃', '解梦', 'C', '法']
  • print
  • [‘柳’, ‘梦’, ‘璃’, ‘解梦’, ‘C’, ‘法’]
    [‘柳梦璃’, ‘解梦’, ‘C’, ‘法’]
    [‘柳梦璃’, ‘解梦’, ‘C’, ‘法’]
    [‘柳’, ‘梦璃’, ‘解梦’, ‘C’, ‘法’]
    [‘柳’, ‘梦’, ‘璃’, ‘解梦’, ‘C’, ‘法’]
    [‘柳梦’, ‘璃’, ‘解梦’, ‘C’, ‘法’]
    [‘柳’, ‘梦’, ‘璃’, ‘解梦’, ‘C’, ‘法’]

6、词法分析(新版)

标签 含义 标签 含义 标签 含义 标签 含义
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 时间
  • from jieba import enable_paddle, posseg # pip install jieba --upgrade
  • enable_paddle() # pip install paddlepaddle-tiny==1.6.1
  • print(posseg.lcut('小基基在南海注册桂城人工智能公司'))
  • print(posseg.lcut('小基基在南海注册桂城人工智能公司', use_paddle=True))
  • print
  • [pair(‘小基基’, ‘nr’), pair(‘在’, ‘p’), pair(‘南海’, ‘ns’), pair(‘注册’, ‘v’), pair(‘桂城’, ‘ns’), pair(‘人工智能’, ‘n’), pair(‘公司’, ‘n’)]
    [pair(‘小基基’, ‘PER’), pair(‘在’, ‘p’), pair(‘南海’, ‘LOC’), pair(‘注册’, ‘v’), pair(‘桂城人工智能公司’, ‘ORG’)]
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门