新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 704|回复: 0

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

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

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

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

x
jieba
结巴 ” 中文分词:做最好的 Python 中文分词组件: s+ N: Z4 v& J

3 x9 V0 D( Z' `0 P: x
特点
; I! T6 |$ x; i7 ]* C3 [+ B
  • 支持四种分词模式$ [; l, H0 X6 S/ S+ R* g: h1 q
  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词,支持词性标注。4 S3 H$ [8 A" Q9 v
    // paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。4 }+ b- }+ j' {& F* x; m
    // 目前paddle模式支持jieba v0.40及以上版本。! E7 Y3 A) U( |4 i- o0 S2 q
    // jieba v0.40以下版本,请升级jieba,pip install jieba --upgrade 。
    4 I; H, u/ H4 |, V$ X( }7 Q
  • 支持繁体分词
  • 支持自定义词典
  • MIT 授权协议
    8 X; i2 t: ~+ N& X5 x) |
& R1 ?5 {. T, |: N# D4 _+ u3 c
安装说明, R+ W5 n6 `0 c& B
  • 全自动安装: easy_install jieba    或者 pip install jieba
  • 半自动安装:解压后运行 python setup.py install
  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
  • 通过 import jieba 来引用
    / M7 v5 P' t8 z5 o
) D* N- s3 I2 A4 S- P
主要功能; l4 G4 x6 r& }, S9 I& k
一、分词
+ X+ o( ]# ?0 K  J. kjieba.cut 方法接受四个输入参数:
0 G* S- K' r( q; z/ {) K
  • 需要分词的字符串;
  • cut_all 参数用来控制是否采用全模式;
  • HMM 参数用来控制是否使用 HMM 模型;
  • use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;
    + {* z  ]. A: u9 K/ m! K( \* q4 ^
jieba.cut_for_search 方法接受两个参数
: ^2 Q) M# I+ {
  • 需要分词的字符串;
  • 是否使用 HMM 模型。
    " y. @1 P  ^; m- `6 V1 e9 k
该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细) n' ~: O) X+ W6 z; N! V
待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。7 s0 \1 u% ?5 u1 I
注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
* @' r0 W- b5 t! i8 ]/ Ijieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,+ j" R5 c% V) j9 g* y% O
可以使用 for 循环来获得分词后得到的每一个词语(unicode),, f$ n0 t9 H3 o/ N  M
或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list) D+ m7 V: T- u* H8 t* k
jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。) Y: [' b% w; |7 C" j; a6 ~
jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
: R' m- Y) \1 s2 t1 y& ^! t% Y: U* O/ b

jieba库是一款优秀的 Python 第三方中文分词库,
jieba 支持三种分词模式:精确模式全模式 搜索引擎 模式,
下面是三种模式的特点:
- O2 B0 h; _. }" V
  • 精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分析
  • 全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据
  • 搜索引擎模式:在精确模式的基础上,对长词再次进行切分
    " P( h" I" ~6 B+ A
: g, M. F$ _' t" W
jieba 三种模式的使用
  1. # -*- coding: utf-8 -*-
    4 h0 {- ~/ L' L/ \  M
  2. import jieba
      w7 _! |6 F1 Z  @4 k3 }8 A. q
  3. ! Z  W5 ~" s/ @1 l. d
  4. seg_str = "好好学习,天天向上。"
    0 o- Q5 T: Q6 n  R( V+ P8 @
  5. * |& |6 f( \% ~. V6 I* X" n
  6. print("/".join(jieba.lcut(seg_str)))    # 精简模式,返回一个列表类型的结果
    4 i& q: V0 N0 x5 r' Z& h
  7. print("/".join(jieba.lcut(seg_str, cut_all=True)))      # 全模式,使用 'cut_all=True' 指定 4 U# b5 E0 x$ E/ Y$ N
  8. print("/".join(jieba.lcut_for_search(seg_str)))     # 搜索引擎模式
复制代码
分词效果
- P% z0 t; S' I# q9 i; j 7420-01.png
. B9 G2 P, R8 |5 J1 f
# q+ x1 P/ s5 K- Q; V  x; Y& y9 W
$ F& e# ~1 i: R0 Z% C0 i  ?" s/ J" \) D- M) ]& l* ?
jieba 分词简单应用6 p3 o$ Q; f6 s9 y
需求:使用 jieba 分词对一个文本进行分词,统计次数出现最多的词语,这里以三国演义为例$ @9 o& }) \/ S$ }0 f+ D6 U
  1. # -*- coding: utf-8 -*-6 {+ p$ v3 a+ K& H: P9 e1 W
  2. import jieba
    . E0 e% [: A) I% z2 [

  3. 7 R! t6 h8 _* x! ~2 F' j
  4. txt = open("三国演义.txt", "r", encoding='utf-8').read()
    % R/ t5 u2 u! [7 @
  5. words = jieba.lcut(txt)     # 使用精确模式对文本进行分词
    3 c; U$ a" H$ d
  6. counts = {}     # 通过键值对的形式存储词语及其出现的次数# w! o7 Q- B1 S/ ^9 d  Z! _$ k

  7. / @4 o$ ?9 ~/ V1 j3 ^- n- v
  8. for word in words:
    7 d% o$ L) b) }( ]" x4 X6 u3 N
  9.     if len(word) == 1:    # 单个词语不计算在内
    - D8 j+ R: K) m* y
  10.         continue
    0 N; V/ ~( Z/ `+ T
  11.     else:, n. B! e; L3 c9 V! c6 q( z
  12.         counts[word] = counts.get(word, 0) + 1    # 遍历所有词语,每出现一次其对应的值加 1) Z# d8 J' B% Q+ {, h
  13. 9 @' m2 X. N- |
  14. items = list(counts.items())
    $ U. q4 [2 c" d( e9 _* L
  15. items.sort(key=lambda x: x[1], reverse=True)    # 根据词语出现的次数进行从大到小排序
    7 C0 D. T% \2 x. I6 t" S3 `
  16. * V: E7 J" Q: A5 B. t: a
  17. for i in range(3):
    ! `# A& ^& W' ^8 \: q+ @5 ^
  18.     word, count = items[i]
    % X8 i1 \# h7 y, `
  19.     print("{0:<5}{1:>5}".format(word, count))
复制代码
2 g+ U. [. `0 U2 G/ u( P! }
统计结果
' |, u9 c2 N/ K( Q 7420-02.png 1 A. x7 B' o1 g" {

, @: ?  o) y% K, S. F1 e
+ A" j. \, t0 B
  j( b! U/ P  U$ F% T扩展:英文单词统计# ?6 {" H& T3 h6 O1 u# Z' r
上面的例子统计实现了中文文档中出现最多的词语,接着我们就来统计一下一个英文文档中出现次数最多的单词。
' p7 a8 O6 t) s1 |) i3 v3 t
  1. # -*- coding: utf-8 -*-9 s4 c& T- F  x5 |) ], Q

  2.   b' c; \8 ]( I. ]6 J, z+ M+ \) ~
  3. def get_text():
    ; f! E4 z# O0 t9 i
  4.     txt = open("1.txt", "r", encoding='UTF-8').read(), `: U% i# {. y5 x* v
  5.     txt = txt.lower()
    5 Z3 b/ u* h& T0 z
  6.     for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':4 M/ ~. N" f/ X( q; U' r! o! M( I
  7.         txt = txt.replace(ch, " ")      # 将文本中特殊字符替换为空格: ~' \. Y! s+ b/ b+ _4 v: o! m
  8.     return txt
    : [( n1 N% u% t* u7 T$ ?/ u
  9. & l- R: ]: r5 C( ]' s+ K# a* Y
  10. file_txt = get_text()
    : X4 R+ ~3 e! L, }
  11. words = file_txt.split()    # 对字符串进行分割,获得单词列表5 {9 g! C: f3 c& E+ S
  12. counts = {}# n. m3 g. j1 W8 c0 I( b7 k+ l

  13. . |! `2 d8 k; j0 c0 b! H
  14. for word in words:
    $ R* {5 M0 h5 g/ E, C% W
  15.     if len(word) == 1:  Q' R. G1 Y2 E8 \  j7 ]
  16.         continue
    ' j5 y+ w, @/ W/ Z; `/ ?
  17.     else:
    1 ~; J  e" T, Y* U% e2 v
  18.         counts[word] = counts.get(word, 0) + 1 1 L/ r, @  x1 U2 \

  19.   I7 ?, q& ^( A! P
  20. items = list(counts.items())   
    * G! y5 G# z* E: H( {; E+ g
  21. items.sort(key=lambda x: x[1], reverse=True)      
      y" k4 j; k2 W
  22. ) u) l$ S  e8 Q3 L! u, N
  23. for i in range(5):
    " [+ U9 }* {; y6 H7 n0 d; d
  24.     word, count = items[i]2 |) `; L- U- L& U: T* d
  25.     print("{0:<5}->{1:>5}".format(word, count))
复制代码
, k' \+ X9 k$ l6 H+ B' z) o
统计结果1 p( V" T% }- P# U) Q4 A- @
7420-03.png
; e1 z0 a4 h  L+ g4 m5 Z" T# B, w" B& g% M5 B# s* q
; B3 U1 F) N* @; S4 s
载入词典/ p! T) Z) F1 d* y4 d" l' s
  • 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
  • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
  • 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
  • 词频省略时使用自动计算的能保证分出该词的词频。
    * x3 R! P' e' V( c% K! ^& @" x% A- J" `
  • 更改分词器(默认为 jieba.dt)的 tmp_dir 和 cache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统。
    ; `. f% U3 J- h$ Q1 r! e/ ?

4 m2 s* p0 b, A( H5 R自定义词典及范例: 7420-01-01.zip (1.28 KB, 下载次数: 3)
9 w8 y% h2 i7 T
  J* R! o$ ]) `! J  H. Q用法示例6 H  ?: }( ~! ~# E3 T
之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /! R8 G/ Q: n* S' h; o
加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
7 U  a  l% l: L) @( p( P5 k- Z* y$ N, O; a3 m  i5 U% J2 @
调整词典
  • 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
  • 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
  • "通过用户自定义词典来增强歧义纠错能力"1 O2 ~8 J7 l$ D7 ?% K
  1. >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
    - Z+ @" t5 T! o0 K1 G
  2. 如果/放到/post/中将/出错/。8 p. R! @' n( M; M1 R: i/ s+ ]
  3. >>> jieba.suggest_freq(('中', '将'), True)
    ; ?' a, ?3 p3 w+ P6 I. y
  4. 494( c. l8 X  J4 d& G, S  q
  5. >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))% v9 i# _# L0 S8 y- b+ C4 K
  6. 如果/放到/post/中/将/出错/。, L4 G# o' I4 J. {) y' f& R
  7. >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
    $ {0 X) d' Q5 x, B
  8. 「/台/中/」/正确/应该/不会/被/切开
    3 A$ ]2 R- p2 }; q4 Q
  9. >>> jieba.suggest_freq('台中', True)
    8 ^4 u) {- `. _2 T" m  I8 w2 v
  10. 697 J! H' y7 x. b5 f/ I2 k
  11. >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
    3 K/ D% z& X, T5 y& l
  12. 「/台中/」/正确/应该/不会/被/切开
复制代码

' m# ^; D" V" W* y词性标注(高中阶段选修)1 _5 J: C9 f' B* B% d* w) [
  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
  • 除了jieba默认分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载方式,通过enable_paddle()安装paddlepaddle-tiny,并且import相关代码;
  • 用法示例
    2 }1 |1 s$ D, `5 Q* I
  1. >>> import jieba& e8 S/ ~6 N/ Y/ Y) t
  2. >>> import jieba.posseg as pseg# n6 X0 f2 H7 E* y! {
  3. >>> words = pseg.cut("我爱北京天安门") #jieba默认模式& \& q8 j  R- y+ R$ e* z
  4. >>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持
    4 L. a7 e4 G" n% h# B- y
  5. >>> words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式
    / v9 P4 ~" E" `3 s7 F) ~. A4 `
  6. >>> for word, flag in words:. G9 g4 i0 K8 N$ Y: X) [, w% l
  7. ...    print('%s %s' % (word, flag))
    " j! P9 |& p  n) M4 g
  8. ...
    9 d9 Y+ Q" e8 i( v
  9. 我 r( f- M! {/ s: _: `
  10. 爱 v9 C' H' M# L! }* w) N- _+ d$ x
  11. 北京 ns+ P) b) D0 ]# i6 {! d* k7 ~: l
  12. 天安门 ns
复制代码

! Z  s  y/ m- Wpaddle模式词性和专名类别标签集合如下表:
:其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母8 P3 X: l, ~$ s+ q
标签含义标签含义标签含义标签含义
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-7-4 15:32 , Processed in 0.119339 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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