新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 708|回复: 0

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

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

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

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

x
jieba
结巴 ” 中文分词:做最好的 Python 中文分词组件/ o# z# }: z+ ~


1 i' U3 v( K/ m: X' K特点9 M, d* K) @( h$ N( Z  r) o
  • 支持四种分词模式! W% L: y+ Q3 v" ~2 z
  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词,支持词性标注。
    3 T9 i  g5 k) e5 A// paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。1 u: A& J& p% h
    // 目前paddle模式支持jieba v0.40及以上版本。
    4 e% B/ S' H) ^! e// jieba v0.40以下版本,请升级jieba,pip install jieba --upgrade 。

      W- Q5 x& j$ v3 T2 n
  • 支持繁体分词
  • 支持自定义词典
  • MIT 授权协议
    9 I+ j9 K/ ^/ u
" d3 ~$ H# U& Z4 n0 I; j& Q; v
安装说明1 k7 i% p- p$ e( n
  • 全自动安装: easy_install jieba    或者 pip install jieba
  • 半自动安装:解压后运行 python setup.py install
  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
  • 通过 import jieba 来引用
    % }/ _: s4 C; E8 |, I- A3 o

. T% z$ `3 w. U) l- P主要功能
! x( a4 R  N4 v8 M( T' e4 p. _% x! ?一、分词
; m$ R5 S$ f; p1 V* y% d4 R( ujieba.cut 方法接受四个输入参数:
% E; Y$ a" l6 b: Z! z; l
  • 需要分词的字符串;
  • cut_all 参数用来控制是否采用全模式;
  • HMM 参数用来控制是否使用 HMM 模型;
  • use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;" B0 @6 t" E& D, w$ H
jieba.cut_for_search 方法接受两个参数. U6 a' H0 \  S  O3 @# x) i, W6 `# h
  • 需要分词的字符串;
  • 是否使用 HMM 模型。
    / X: S# V  e5 g- Q* m/ l
该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
( r! I0 q% N: b, W8 ?4 S待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。0 r" K3 F: n) |: D1 p5 \
注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-82 h1 J2 X' j% D+ P3 L) g0 O4 q# D
jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,
1 Z5 w5 S: P( k; D可以使用 for 循环来获得分词后得到的每一个词语(unicode),
, S' k2 c6 z% u或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list1 `! c  k* i& C" b9 c: o( i% m
jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。9 l+ v0 ~' ?. u
jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。' a5 \% p" K1 ?' x

6 S4 u+ K  D+ k# R
jieba库是一款优秀的 Python 第三方中文分词库,
jieba 支持三种分词模式:精确模式全模式 搜索引擎 模式,
下面是三种模式的特点:
. D+ R1 g$ Z' @) r
  • 精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分析
  • 全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据
  • 搜索引擎模式:在精确模式的基础上,对长词再次进行切分8 [; q1 a  W4 O# Y/ x

# U$ Y$ N" n" K) ojieba 三种模式的使用
  1. # -*- coding: utf-8 -*-2 F$ p0 y1 b- n8 }' K' @, s' L
  2. import jieba7 b+ O+ S! W. E: L* |
  3. $ W; Q- B. b0 S9 W, I
  4. seg_str = "好好学习,天天向上。"& y) B) ^0 p) z3 _2 |
  5. ! x0 |# V0 r* `# r& V: q
  6. print("/".join(jieba.lcut(seg_str)))    # 精简模式,返回一个列表类型的结果- }5 C& q2 i. |& v6 }. C" f: v
  7. print("/".join(jieba.lcut(seg_str, cut_all=True)))      # 全模式,使用 'cut_all=True' 指定
    ' \1 _' O% V- i# P
  8. print("/".join(jieba.lcut_for_search(seg_str)))     # 搜索引擎模式
复制代码
分词效果
& u8 P2 `5 W" D! M 7420-01.png 4 e3 e" r7 t; H* V" V8 X
8 e$ A) |2 w6 c" q
" X- S: E8 a! l& |
& c9 T: K$ a8 A- b8 B4 K5 K  v
jieba 分词简单应用% c7 D  D$ }9 E. Y, W% t6 t
需求:使用 jieba 分词对一个文本进行分词,统计次数出现最多的词语,这里以三国演义为例
4 \# v( _$ `; T$ \+ u
  1. # -*- coding: utf-8 -*-
    1 [. `5 m- G$ h( p# ^- Y, k' _
  2. import jieba
    5 }( n+ ?, r& n5 d

  3. 7 k/ R: w/ U, u8 _& \" `
  4. txt = open("三国演义.txt", "r", encoding='utf-8').read()
    6 j+ z* M8 [* O; D7 I4 y( F
  5. words = jieba.lcut(txt)     # 使用精确模式对文本进行分词
    3 j% k* e9 V) {4 W7 E) P
  6. counts = {}     # 通过键值对的形式存储词语及其出现的次数7 ?& E2 _8 a0 h+ |  E6 f  g  Q; _
  7. ) Q, f9 |2 J8 G
  8. for word in words:- q. X, f3 m! @. v5 ^& c# X
  9.     if len(word) == 1:    # 单个词语不计算在内8 {0 w9 Q3 O6 z. J1 U$ Y
  10.         continue
    6 `5 P8 P* q- m9 M/ ^5 M
  11.     else:
    / L0 o6 u8 i( D6 e9 b" [
  12.         counts[word] = counts.get(word, 0) + 1    # 遍历所有词语,每出现一次其对应的值加 1
    - L1 ^. y- M) |

  13. ) R' Z7 w3 {* g" m6 b1 q5 @
  14. items = list(counts.items())) ?: }6 b- s+ K/ d
  15. items.sort(key=lambda x: x[1], reverse=True)    # 根据词语出现的次数进行从大到小排序
    $ u* _5 E5 d. V1 ~

  16. 5 r* n0 o% _7 s9 k0 {
  17. for i in range(3):
    8 y: [. n9 E0 Y4 o+ f: G8 ?* S
  18.     word, count = items[i]
    ; W: K) t/ l' b0 L4 Z
  19.     print("{0:<5}{1:>5}".format(word, count))
复制代码
  G3 j  ?4 N! n( I
统计结果- p$ @6 n5 C+ t5 T
7420-02.png 7 P8 i$ Y" _1 y

' N, V" H) ^$ K
5 g$ R& L1 A/ q% e3 J7 F5 h7 i- \" W9 D! j+ l; p& C0 L- E
扩展:英文单词统计
7 e7 ~' [; T0 ~上面的例子统计实现了中文文档中出现最多的词语,接着我们就来统计一下一个英文文档中出现次数最多的单词。! l2 w/ {3 H! ^4 u
  1. # -*- coding: utf-8 -*-0 C1 T9 A) Z; Y. H* q; w7 r; e

  2. ' r! c0 n8 A5 q7 L% Z: Z3 k9 _. T4 P
  3. def get_text():
    9 h- Z; A3 K8 w: X  Z
  4.     txt = open("1.txt", "r", encoding='UTF-8').read()% Y: z2 r* K( a& n3 y2 p2 o# ^  J9 c( L
  5.     txt = txt.lower()
    * f2 L+ _$ n' f" f) q1 T. {
  6.     for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
      {& e' o, n8 m3 B; t
  7.         txt = txt.replace(ch, " ")      # 将文本中特殊字符替换为空格) W1 f2 X+ c) q
  8.     return txt* v7 u/ Z# N+ X' E& O( @3 ]

  9. * ^* G- |2 J+ G. j% N: X3 F
  10. file_txt = get_text()
    0 b: n& b* M# ]
  11. words = file_txt.split()    # 对字符串进行分割,获得单词列表8 K5 G4 g7 V% t2 k
  12. counts = {}
    : F, I/ H+ `8 C7 y1 Y  R" ]

  13. ) j* x$ `9 b; c2 R/ b7 B! h
  14. for word in words:; x0 l6 z( e9 q. s( n1 |' P
  15.     if len(word) == 1:
    0 }8 t9 z- g# [0 ~8 H$ J6 b7 y- F, v9 A( T
  16.         continue
    7 t2 t2 |+ @4 R0 K
  17.     else:
    8 m. }+ `2 e% N1 A- S$ o" C0 }
  18.         counts[word] = counts.get(word, 0) + 1
    , i8 t% j* g) E* m* K/ ~

  19. 8 C7 q+ v8 F9 v1 D- _1 ]
  20. items = list(counts.items())   
    6 D% P% g1 f# K  P- n- ^6 i
  21. items.sort(key=lambda x: x[1], reverse=True)      
    ; ~5 v5 t# C8 }& m5 i

  22. ( L; {5 P$ d7 R" ]
  23. for i in range(5):! L3 J$ d  y2 N' o3 g
  24.     word, count = items[i]
    0 }; g- Y4 S, i
  25.     print("{0:<5}->{1:>5}".format(word, count))
复制代码
# R: f- V; p4 L2 |
统计结果. U% ^8 Q5 a8 z. r/ R1 P$ |5 x
7420-03.png
9 ?4 \  q1 `9 Y! L) d- H7 n. H$ B8 M# n1 C! T" }
; ^9 |& e- I$ ?$ C0 Y5 _) l* n
载入词典! ~* X3 ?9 K# T1 A- ~" R
  • 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
  • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
  • 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
  • 词频省略时使用自动计算的能保证分出该词的词频。
    # t3 I+ Z+ V/ e. e4 G2 _4 e% h
  • 更改分词器(默认为 jieba.dt)的 tmp_dir 和 cache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统。
    4 T/ @( t/ F: l  Q6 s0 i8 i8 f' y3 ^

- Y" C7 N6 G, [" c1 l" a自定义词典及范例: 7420-01-01.zip (1.28 KB, 下载次数: 3)
0 b& ~# l2 q' d' ~) B7 D, @- C2 @( u. H- J
用法示例! P$ J  w3 y$ n. o  _8 @
之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /* c. A4 B) E/ }* c, X
加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /" S1 N7 J1 E5 {! _! i

  \6 J/ Y1 l2 P调整词典
  • 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
  • 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
  • "通过用户自定义词典来增强歧义纠错能力"  v# Q1 E' c1 d$ H0 m, S
  1. >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
    4 F1 h; R1 @2 e6 \& Q
  2. 如果/放到/post/中将/出错/。' q2 E9 \0 C* U& S6 O6 m* \3 f" ?
  3. >>> jieba.suggest_freq(('中', '将'), True)6 K  P4 U1 B% J* T
  4. 494
    * d6 j9 Y. H/ e; u8 W
  5. >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
    0 }- [0 G. a- M" {% i* K
  6. 如果/放到/post/中/将/出错/。) f2 [/ c4 B1 t2 T  T) b/ v
  7. >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
    8 x3 f! a. J1 ]+ D
  8. 「/台/中/」/正确/应该/不会/被/切开, }. s( t! _: l$ o) [+ T
  9. >>> jieba.suggest_freq('台中', True)& I' S. @8 O0 |1 I
  10. 69* r- i8 P0 [) J* N. G) M6 ^
  11. >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
    ! `. ]( O6 O+ D8 i% S2 v7 }! e
  12. 「/台中/」/正确/应该/不会/被/切开
复制代码
9 a( E+ _. J! \6 C; g; x2 d
词性标注(高中阶段选修)0 D( u7 i6 F' M3 q: V! B% W& ^
  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
  • 除了jieba默认分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载方式,通过enable_paddle()安装paddlepaddle-tiny,并且import相关代码;
  • 用法示例
    3 I& ~9 ?- r3 M' n# m7 J; |: v! [
  1. >>> import jieba1 u3 Y6 b5 A( b/ O' [$ q! R
  2. >>> import jieba.posseg as pseg% z$ o8 r) d8 P, w( R( u" N* M$ N
  3. >>> words = pseg.cut("我爱北京天安门") #jieba默认模式
    ! v: z/ m+ F4 _# a& P) v
  4. >>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持
    ( U) J: y# w0 ]# x
  5. >>> words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式
    5 h' M% R2 \* Y3 k7 v
  6. >>> for word, flag in words:( c: y" {, W1 T7 g% h/ r$ c- A
  7. ...    print('%s %s' % (word, flag))5 b* o- C6 M9 K# P0 |# n
  8. ...
    $ ^" G  S; `6 E! I# i; d
  9. 我 r
    & Y0 Y6 C: w5 L7 c/ j* R5 ~
  10. 爱 v
    - Y7 u  T# c3 M2 P+ F2 f) @
  11. 北京 ns
    3 n3 o1 N6 A* s: @
  12. 天安门 ns
复制代码

+ c- x4 C0 f  z+ p2 xpaddle模式词性和专名类别标签集合如下表:
:其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母0 t0 k% l0 c" K% K
标签含义标签含义标签含义标签含义
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-8-21 18:40 , Processed in 0.068629 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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