新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 727|回复: 0

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

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

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

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

x
jieba
结巴 ” 中文分词:做最好的 Python 中文分词组件0 ?* \& z" |, X$ ~! z9 A# C  x


, ^. D% P9 l/ l/ H) s特点3 g( A, f$ i; \  s" Y
  • 支持四种分词模式
    ) }$ H% G  X3 t8 x1 P% ?$ K
  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词,支持词性标注。
    " a$ Y9 O) w6 S2 l" E// paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。% m' ?* N1 u4 u' X2 w- t! z  H. b! D
    // 目前paddle模式支持jieba v0.40及以上版本。/ B% i  X  |* ]4 F1 s" f* e  \
    // jieba v0.40以下版本,请升级jieba,pip install jieba --upgrade 。
    8 V. @8 b5 X  \9 i# p
  • 支持繁体分词
  • 支持自定义词典
  • MIT 授权协议$ H' l" ]& u6 B& X2 ?5 O4 p$ K6 p+ c
; o/ d" |6 `. J
安装说明% {4 x- Y8 U# x' J7 A
  • 全自动安装: easy_install jieba    或者 pip install jieba
  • 半自动安装:解压后运行 python setup.py install
  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
  • 通过 import jieba 来引用
    $ U/ p6 U7 ~8 m6 ~" K2 S* G
8 H/ i( F! r5 g" G  u6 g/ g
主要功能
7 {: Y) w$ J& [, z一、分词
* w9 A$ O2 c0 X- d' ajieba.cut 方法接受四个输入参数:
3 b  w9 X' b$ O- X* }" y5 M. D2 j
  • 需要分词的字符串;
  • cut_all 参数用来控制是否采用全模式;
  • HMM 参数用来控制是否使用 HMM 模型;
  • use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;
    . o- J5 \8 l) E$ ?
jieba.cut_for_search 方法接受两个参数: Q  r/ g& D; ~+ g5 p
  • 需要分词的字符串;
  • 是否使用 HMM 模型。
      G% S) w' T/ T$ V- n# l
该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细! \1 K* n0 q7 S4 |- f, k4 p2 a
待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。5 y' _8 I$ @2 O
注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
: J' E; K" }6 o8 ~$ g; wjieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,
: V, m4 H: t7 c' |: L可以使用 for 循环来获得分词后得到的每一个词语(unicode),
- o. l% f1 n$ o* c) e/ m8 U或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
& [. D* d* y1 p, ?5 `4 sjieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。
# O; ?6 }: v/ y# O* B# p, B2 Wjieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
  n8 N( A1 M- x2 [8 D8 B( J( g
/ {2 G/ [1 A  R2 T2 A* |6 k2 G
jieba库是一款优秀的 Python 第三方中文分词库,
jieba 支持三种分词模式:精确模式全模式 搜索引擎 模式,
下面是三种模式的特点:

+ A* p$ T/ o/ l
  • 精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分析
  • 全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据
  • 搜索引擎模式:在精确模式的基础上,对长词再次进行切分
    1 w7 C" h' o! Y! h) N# s
( t5 Y1 D  F% g4 F
jieba 三种模式的使用
  1. # -*- coding: utf-8 -*-
    " A3 g& G+ ^# t, l, ^3 Z
  2. import jieba& ~; f8 h' G: k

  3. 5 |+ M5 Y4 G4 {  T5 x
  4. seg_str = "好好学习,天天向上。"4 b" A+ A4 Y% b& P, [
  5. ; g: E; {& G" V# k7 p
  6. print("/".join(jieba.lcut(seg_str)))    # 精简模式,返回一个列表类型的结果1 {& g7 y. p! k% s6 Z- o) [
  7. print("/".join(jieba.lcut(seg_str, cut_all=True)))      # 全模式,使用 'cut_all=True' 指定 : A" \6 l( E' @# A) I. \
  8. print("/".join(jieba.lcut_for_search(seg_str)))     # 搜索引擎模式
复制代码
分词效果7 {/ C  T0 D' W2 L2 }, |
7420-01.png
' ~+ R  {. i* X3 Y( g% }  L3 J$ W" s! r5 V4 }' n, n  W& G
6 n" Y9 z, @5 J
2 j  s7 q  V8 V5 S/ v
jieba 分词简单应用5 D/ w) r5 U5 j0 n! R
需求:使用 jieba 分词对一个文本进行分词,统计次数出现最多的词语,这里以三国演义为例
) G3 A; b( Y  e& d2 Y" l: Z
  1. # -*- coding: utf-8 -*-
    % ^' j# W) V3 T! ?
  2. import jieba
    : n+ q4 T9 s# k2 m8 @  Y

  3. 6 C+ q% q6 A: \) o  h
  4. txt = open("三国演义.txt", "r", encoding='utf-8').read()
    3 }. d2 h9 e# q" Y
  5. words = jieba.lcut(txt)     # 使用精确模式对文本进行分词
    3 p* m( [/ S0 C, P0 q
  6. counts = {}     # 通过键值对的形式存储词语及其出现的次数
    0 ~! S* E9 y1 I& B- W* m

  7. ! m1 I/ y3 c3 @" A9 [3 t* c
  8. for word in words:1 K* N9 _3 b3 T+ `
  9.     if len(word) == 1:    # 单个词语不计算在内
      x+ w' @  y! ~8 g
  10.         continue
    0 T  b9 P! [3 Q0 R; Z+ m2 [
  11.     else:
    3 w1 Q6 T% k! h) c% K5 Q
  12.         counts[word] = counts.get(word, 0) + 1    # 遍历所有词语,每出现一次其对应的值加 1
    2 \8 I% N) j4 t
  13. 1 V* T$ Q& u7 ?% q& L$ t9 U" D8 F/ v
  14. items = list(counts.items())
    8 E/ y' d2 G. Q. m, S- b- }
  15. items.sort(key=lambda x: x[1], reverse=True)    # 根据词语出现的次数进行从大到小排序
    , p- m3 V- K+ b" S

  16. . L1 L1 e9 O9 M
  17. for i in range(3):
    # j" Z8 Q  b- ^/ Y" z
  18.     word, count = items[i]5 N, g7 H3 X2 S/ {2 M8 T" n
  19.     print("{0:<5}{1:>5}".format(word, count))
复制代码

1 P8 _  @0 U  c5 |/ o统计结果
/ T( n$ A6 K& N7 F1 l 7420-02.png
- h" v1 o7 M( B4 i; v* N+ ~6 R9 t9 q6 w

& ^$ t5 C$ R. K' m& M" X
! }2 E8 O+ y1 z* c/ e扩展:英文单词统计9 b; R) ]$ f. _- R
上面的例子统计实现了中文文档中出现最多的词语,接着我们就来统计一下一个英文文档中出现次数最多的单词。
6 Y0 d: p6 J, J/ Q, z
  1. # -*- coding: utf-8 -*-! d, V& g) n% Q* ]0 _
  2. ; u) D) A" E$ H, h' W. b  a0 V
  3. def get_text():
    ; V' T. T- R# z2 K5 p% e
  4.     txt = open("1.txt", "r", encoding='UTF-8').read()3 l/ W. t' T7 o. p4 l  ^2 b
  5.     txt = txt.lower()1 y- r7 F# d2 |0 ?3 q, j
  6.     for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
    0 y' J) U& x0 o/ h/ c# k8 D
  7.         txt = txt.replace(ch, " ")      # 将文本中特殊字符替换为空格
    + e9 h8 Y9 e' I, r5 i- Y- @2 W
  8.     return txt4 x2 B! R$ b0 @

  9. / z2 ~" s5 |+ P7 K/ j7 m+ G
  10. file_txt = get_text()
    3 d$ a3 D$ v3 v6 R8 U7 W" k( u5 K
  11. words = file_txt.split()    # 对字符串进行分割,获得单词列表1 e" m+ n- t! a7 q
  12. counts = {}4 ~: S8 G! b% R/ W: }" u
  13.   Z8 y, G3 U" K  S3 q
  14. for word in words:0 b: w$ w% V3 ^' {. ~8 R
  15.     if len(word) == 1:* P) R6 P2 ]: K* e* p* r
  16.         continue
    6 R9 I0 Y2 B2 M
  17.     else:* j' i' J& F% B" g; g- Y3 _8 S
  18.         counts[word] = counts.get(word, 0) + 1 ' g, }$ d4 D, P+ m1 Z% P
  19. ! k) D5 A: ]% x3 q+ ^9 C
  20. items = list(counts.items())   
    7 T! z) P5 C# r, _% }  T7 O
  21. items.sort(key=lambda x: x[1], reverse=True)      ( J$ T! w. D5 s

  22. / L  A6 C( ^- S" ?" [1 o& f
  23. for i in range(5):2 }" S0 I0 o7 ~* o
  24.     word, count = items[i]
    7 J0 P/ @, s- S, Q; v: ^
  25.     print("{0:<5}->{1:>5}".format(word, count))
复制代码
. K9 Y' @) L  ^  A, z
统计结果& N/ p  v  d1 |7 `
7420-03.png
5 u' }: M9 D) J( ]' e% k; c* }3 |! v. n3 {: A8 J9 W

/ K$ N& Y7 [- u7 q- ^载入词典, G9 `! `; @% a* M5 {- }
  • 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
  • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
  • 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
  • 词频省略时使用自动计算的能保证分出该词的词频。6 L- n& S8 \" _
  • 更改分词器(默认为 jieba.dt)的 tmp_dir 和 cache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统。
    / P( c6 s! [2 w  c* y+ b
% G: ^1 O! d7 J5 U8 j, X! F
自定义词典及范例: 7420-01-01.zip (1.28 KB, 下载次数: 3) 2 k5 ^5 |3 Q* x+ x2 W

9 }! I. O# A3 x# r用法示例1 N% `1 Z: V# y; f" Z/ A6 I
之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /# q) t" w% u. I5 k
加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
5 s% Q) w* D7 G6 X' t+ r
8 ~% f) c' E, [( `1 {8 q调整词典
  • 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
  • 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
  • "通过用户自定义词典来增强歧义纠错能力"8 D5 O# m: y. U
  1. >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False))). r) ?) D1 l' @8 d. {% w  s) j
  2. 如果/放到/post/中将/出错/。: f. E  ]) W3 A1 B& C' w9 o/ n( K
  3. >>> jieba.suggest_freq(('中', '将'), True)
    4 I: T; C7 h- a. t2 p/ U6 c# a2 m0 j1 _
  4. 494
    5 e& i: w3 k. z) M* p
  5. >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
    5 n9 O% T6 e& }) F8 p
  6. 如果/放到/post/中/将/出错/。
    : B- M3 [/ m1 a7 _" w
  7. >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
    , m7 W1 F; q1 B) J5 H8 [+ |' {
  8. 「/台/中/」/正确/应该/不会/被/切开  R: s# C3 c: S0 |
  9. >>> jieba.suggest_freq('台中', True)
    0 D% s& C. x! Z' a+ g9 q* j) O
  10. 69/ Z6 N7 [$ g8 o; F4 C
  11. >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))4 ~0 b9 @. l! `/ ]5 K) U( J. n5 ?
  12. 「/台中/」/正确/应该/不会/被/切开
复制代码

# ~' N4 K8 ~4 j6 ]$ D词性标注(高中阶段选修)
# K  I+ o2 i+ E; J
  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
  • 除了jieba默认分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载方式,通过enable_paddle()安装paddlepaddle-tiny,并且import相关代码;
  • 用法示例! Z1 p' _8 ?7 }8 l3 a+ m* c3 x
  1. >>> import jieba- l( o+ `* P  A1 N9 ^9 {$ q7 Z
  2. >>> import jieba.posseg as pseg$ c7 P* d2 I; u8 X7 s6 [
  3. >>> words = pseg.cut("我爱北京天安门") #jieba默认模式
    " p5 ^. r+ y5 Y/ [$ {- y
  4. >>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持
    5 Y9 @1 o& p; ~1 `# e0 U
  5. >>> words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式
      ~" S9 Y) m- j+ X9 F1 z6 B
  6. >>> for word, flag in words:
    ) [6 m/ g. K: H! ~* X9 |/ `  q" j
  7. ...    print('%s %s' % (word, flag))
    ) a6 D  M% @3 X0 z# K( O
  8. ...+ K  Z, T( ]6 C7 {  s/ U& c9 a
  9. 我 r: m- k8 U2 J1 w6 j* m) w0 E0 ]( i4 ~+ Y
  10. 爱 v; C% K% j; G6 `  |* @+ e' u1 J, A
  11. 北京 ns
    # T2 z3 A4 }9 q7 x9 O
  12. 天安门 ns
复制代码
" }, E4 H7 D; ]# f
paddle模式词性和专名类别标签集合如下表:
:其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母
) ^3 z) @9 g* u5 F: f
标签含义标签含义标签含义标签含义
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, 2026-2-4 09:41 , Processed in 0.092955 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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