新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

发布 .新大榭软件管家(Excel版) V5.9版 财务/仓库/生产/销售/采购/行政/人事/校园 .公告 - 客户 - 打赏 - 职场 - Excel - Python.

新大榭镜像-音乐-法律-图书-高中课堂-实验 广告是为了能更好的发展 [欢迎商家支持本站互利共赢] 广告位招租.首页黄金广告位等您来!联系 13566035181

查看: 692|回复: 0

[模块] 7420 - Python库 AP129【jieba】模块详细介绍

 关闭 [复制链接]
发表于 2021-7-21 10:38:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

您需要 登录 才可以下载或查看,没有账号?注册

x
jieba
结巴 ” 中文分词:做最好的 Python 中文分词组件
9 v( I( n, y7 e9 a/ G2 c

8 E) K6 V! o5 I特点1 o8 A* ?. y* t- \$ u( w+ H
  • 支持四种分词模式
    8 l' C1 S' u0 ~) a8 f% b. R
  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词,支持词性标注。) C9 z( P1 B2 H; X9 T
    // paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。
    2 A- t  ]9 J1 w6 H1 t5 H& v6 k) U9 G// 目前paddle模式支持jieba v0.40及以上版本。
    * r. d" a8 C; G// jieba v0.40以下版本,请升级jieba,pip install jieba --upgrade 。
    % i3 k  o0 T5 m6 I
  • 支持繁体分词
  • 支持自定义词典
  • MIT 授权协议
    ; j) w3 u; t# y
9 h7 b" J3 U$ Y. `4 S# K. s% s: z
安装说明( K3 g  A' E! _3 {* p
  • 全自动安装: easy_install jieba    或者 pip install jieba
  • 半自动安装:解压后运行 python setup.py install
  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
  • 通过 import jieba 来引用# _  Q; w6 `! r/ i4 c

1 x- g2 C& ~. y2 \  S* a主要功能
! k# M4 D, I: ^$ ^; T4 O一、分词! N; x! z8 L  f
jieba.cut 方法接受四个输入参数:
, |3 V; A/ G  S! b7 c3 j
  • 需要分词的字符串;
  • cut_all 参数用来控制是否采用全模式;
  • HMM 参数用来控制是否使用 HMM 模型;
  • use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;
    0 X) n$ \# q. B5 G4 w0 b6 P( F- e
jieba.cut_for_search 方法接受两个参数, R9 \3 r1 }% ]9 q
  • 需要分词的字符串;
  • 是否使用 HMM 模型。
    6 K  y1 O3 K9 ^/ G- Y' C
该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细# V8 ]; ~& Y9 V8 I9 H+ ^0 J
待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。7 k& K, {, ?" q, N% a7 A6 }) h
注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-89 Q0 {. y" f9 o% j) |; x
jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,7 ~2 R$ h; N4 x7 i6 B
可以使用 for 循环来获得分词后得到的每一个词语(unicode),
2 W8 u7 H0 u1 z  ^或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list" @: s1 V0 }8 i# l1 ^0 N( p2 _
jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。& a! W( b3 G, U9 P" a3 P+ {
jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。2 u8 j6 }( {) @! m2 l& n, G

  Z$ y1 E, D) B/ c+ A  f" J
jieba库是一款优秀的 Python 第三方中文分词库,
jieba 支持三种分词模式:精确模式全模式 搜索引擎 模式,
下面是三种模式的特点:

% ^4 d) s7 N* v
  • 精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分析
  • 全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据
  • 搜索引擎模式:在精确模式的基础上,对长词再次进行切分" ~5 L: \2 G$ A' F0 ]/ N# q
0 H; u9 z+ n: L* @
jieba 三种模式的使用
  1. # -*- coding: utf-8 -*-
    ' n( ]' ^, Y: v2 ^! d
  2. import jieba
    8 y0 D, M2 A- ?/ [, _9 o5 P$ t

  3. 2 h7 G8 \% @5 C
  4. seg_str = "好好学习,天天向上。"7 P( y: }  E* N" q: c# _1 A- @
  5. 3 |  C: g& X3 S( ^, E% ?! \4 j
  6. print("/".join(jieba.lcut(seg_str)))    # 精简模式,返回一个列表类型的结果
    - D% G2 a7 Q1 C! s$ U* e* I# n
  7. print("/".join(jieba.lcut(seg_str, cut_all=True)))      # 全模式,使用 'cut_all=True' 指定 9 w7 x' I8 z% R0 Z  e. c
  8. print("/".join(jieba.lcut_for_search(seg_str)))     # 搜索引擎模式
复制代码
分词效果
$ Y( g8 }2 |3 L  P/ O5 |# \2 R 7420-01.png
& C/ _# W# t8 l- p1 T" u2 F+ J9 D  [% k

& T: E) o4 i$ l- h
/ ?8 n& U- |8 V; J% Tjieba 分词简单应用
$ x0 p' u5 v3 X需求:使用 jieba 分词对一个文本进行分词,统计次数出现最多的词语,这里以三国演义为例
  a9 x) N. P+ f$ a0 Z& e" w3 n9 ?
  1. # -*- coding: utf-8 -*-- W& d8 w/ P+ d" P1 J5 o$ P6 I* s
  2. import jieba
    / r# b2 K0 ^) N* I7 T$ L" b2 |

  3. 3 h9 A% n2 O3 N! P6 n
  4. txt = open("三国演义.txt", "r", encoding='utf-8').read()
    5 o. {+ m3 {0 C& }8 J
  5. words = jieba.lcut(txt)     # 使用精确模式对文本进行分词
    / k) |9 [# a2 n2 Y; d0 G" |, \1 C* v
  6. counts = {}     # 通过键值对的形式存储词语及其出现的次数0 k, n8 N8 V3 ?3 M3 ~# c
  7. 0 |% w. I# M! E: ~9 q
  8. for word in words:
    - ?- d3 l& g; ?1 p( k# R9 s! |
  9.     if len(word) == 1:    # 单个词语不计算在内
    * O1 p8 ?; e4 N7 x4 t
  10.         continue0 b/ l( {2 V) l" S) ]% Z( D
  11.     else:6 M4 Y" S+ X) q$ U
  12.         counts[word] = counts.get(word, 0) + 1    # 遍历所有词语,每出现一次其对应的值加 1
    ' u5 J( k5 h' H- S' v* ]" M9 S- }

  13.   y. q+ C( C3 N
  14. items = list(counts.items())2 A1 F$ b( s7 S) y, o# _2 H
  15. items.sort(key=lambda x: x[1], reverse=True)    # 根据词语出现的次数进行从大到小排序
    8 P" {6 i( i. x# P& o3 X2 X

  16. $ D6 {2 p3 p) ], s
  17. for i in range(3):  C' c" A: R" H# Z) z" q
  18.     word, count = items[i]
    / c: }# ^4 I. G# ^+ f
  19.     print("{0:<5}{1:>5}".format(word, count))
复制代码
# Y% U- Z1 t& M  a
统计结果
+ G* w! j1 u7 k 7420-02.png
1 d6 G6 z3 Z: {8 L, O
3 O7 ~: R9 O; n8 G0 D- f- x0 `. O: G9 @3 ^# y+ T

4 [1 E+ Z6 E; k( {* W3 H3 B扩展:英文单词统计* O: a  c7 m2 d" n" Q
上面的例子统计实现了中文文档中出现最多的词语,接着我们就来统计一下一个英文文档中出现次数最多的单词。% k" E! d" T1 r$ W
  1. # -*- coding: utf-8 -*-
    % K) C8 q9 L" {# N$ U* `! ~& p$ {4 V

  2. 9 U9 w' L; p/ |# h0 a
  3. def get_text():
    1 ?! H. q) i4 n
  4.     txt = open("1.txt", "r", encoding='UTF-8').read()4 Y5 H7 f" X8 H" M2 l
  5.     txt = txt.lower()
    ( g% w6 U5 L7 Z
  6.     for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':, Q" E6 }( T" ]+ U* {" ]- {. z2 L# z
  7.         txt = txt.replace(ch, " ")      # 将文本中特殊字符替换为空格& r$ s8 }3 ^& u  `  T! d5 P, K8 c
  8.     return txt& @! d; b4 ]( M6 J
  9. 0 x6 _1 f9 w1 T7 t! p; s
  10. file_txt = get_text()8 S& x6 l/ a4 E( B" w; V! ?
  11. words = file_txt.split()    # 对字符串进行分割,获得单词列表
    ) u8 }1 Q  I. D
  12. counts = {}# `( ]; x: d* M: n! O5 V
  13. . d9 R- Z. c' f' v( E/ M
  14. for word in words:
    * H( q3 M! ]" w' U1 p
  15.     if len(word) == 1:2 u0 q; F1 O. z  d
  16.         continue
    1 v; ~# x" {* x( f, Q' y
  17.     else:2 p! y+ c7 @: e, d: d" J  }
  18.         counts[word] = counts.get(word, 0) + 1 1 n" O3 K: P8 `# Z% }, [, h

  19. # |5 D$ h$ P* j
  20. items = list(counts.items())    + ~  _" y$ i' _
  21. items.sort(key=lambda x: x[1], reverse=True)      ' r( W: [: [6 ~2 r& I. [
  22. ' {( W. W) r/ p2 G
  23. for i in range(5):
    * d5 p# R0 r2 e6 C" k1 G7 Y- j
  24.     word, count = items[i]
    2 g! w- r8 N9 W1 J: V
  25.     print("{0:<5}->{1:>5}".format(word, count))
复制代码

# E! w; G4 P+ z" e. @# }( F/ G统计结果
$ {0 i# E# A1 \ 7420-03.png
5 \% t8 [0 X: F, D; a
" w$ s5 w8 X; r2 `& B" d% ^6 `( b% A6 x6 j
载入词典
3 o+ m9 g- H+ M. X7 h
  • 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
  • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
  • 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
  • 词频省略时使用自动计算的能保证分出该词的词频。3 u1 l, D+ @& Z' c/ v8 Q
  • 更改分词器(默认为 jieba.dt)的 tmp_dir 和 cache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统。1 H# p8 A% q6 k/ W  c

& C% t0 e4 ]3 ^9 J  P8 t自定义词典及范例: 7420-01-01.zip (1.28 KB, 下载次数: 3) * C7 d2 G0 c3 E% A: `/ d

5 D7 f3 K. C, S  {6 Q3 Z8 n  [用法示例
, y4 F) _3 {. e( z之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /
  t& B2 ?' a; n% _! {# B加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /, M5 l$ ?" R( m2 @
* p. I! z9 R/ E1 g9 @! O4 U+ P- T
调整词典
  • 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
  • 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
  • "通过用户自定义词典来增强歧义纠错能力"* `1 M9 J  `! ^1 R
  1. >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))( L6 y: Y3 u1 O4 P
  2. 如果/放到/post/中将/出错/。! a! Z7 |! `5 p  q
  3. >>> jieba.suggest_freq(('中', '将'), True)6 X. {7 P+ U; P/ e0 J/ m) w
  4. 494
    / r, w3 \* P. w! i  ^7 N$ n; \' q$ \
  5. >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
    6 b  S/ f5 d3 U
  6. 如果/放到/post/中/将/出错/。
    & V* K& A' @4 N& s
  7. >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
    % M0 I1 V! O' Z  ~+ ^) {* F
  8. 「/台/中/」/正确/应该/不会/被/切开- N4 a: X1 X& C0 Y" F
  9. >>> jieba.suggest_freq('台中', True)' h  n& i0 A3 J8 y: K1 m0 z
  10. 69
    % L9 H/ c9 T8 n" p! `1 o5 {; Z
  11. >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))* A5 V4 n+ ]5 r$ T3 v, o
  12. 「/台中/」/正确/应该/不会/被/切开
复制代码

7 H( a3 g1 G: a4 [词性标注(高中阶段选修)
  ]" g- v3 z3 |: A4 i& Z+ u+ N
  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
  • 除了jieba默认分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载方式,通过enable_paddle()安装paddlepaddle-tiny,并且import相关代码;
  • 用法示例
    & I4 E" C) h8 w4 D4 y' [! a8 e
  1. >>> import jieba* P, P9 Z8 m! X+ j) d
  2. >>> import jieba.posseg as pseg) X. @/ D! {( j+ x4 _( T
  3. >>> words = pseg.cut("我爱北京天安门") #jieba默认模式0 X% X; R3 ]" t
  4. >>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持1 h5 k: I: z. ?2 O) m2 J8 H
  5. >>> words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式8 T+ }$ ?" V6 Y/ [7 `, f1 d
  6. >>> for word, flag in words:, p' g2 T& I& P; h; S) v4 `
  7. ...    print('%s %s' % (word, flag))
    ' d! C" K* T7 J
  8. ...6 n& i! o2 d+ B' D7 J% p" X1 e
  9. 我 r8 H0 t/ D9 H0 X; L
  10. 爱 v5 m1 Z- o" }/ M0 l5 l$ U' p
  11. 北京 ns
    6 t& s8 e1 K  E  Z% `& Y6 M- U
  12. 天安门 ns
复制代码
! H; Z1 [1 y+ m
paddle模式词性和专名类别标签集合如下表:
:其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母4 ^5 [2 r0 F. \: b4 p/ |/ ?
标签含义标签含义标签含义标签含义
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时间
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
您需要登录后才可以回帖 登录 | 注册

本版积分规则

新大榭七周年,感谢由您!

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2025-5-12 10:16 , Processed in 0.101492 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表