|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
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 三种模式的使用- # -*- coding: utf-8 -*-
' n( ]' ^, Y: v2 ^! d - import jieba
8 y0 D, M2 A- ?/ [, _9 o5 P$ t
2 h7 G8 \% @5 C- seg_str = "好好学习,天天向上。"7 P( y: } E* N" q: c# _1 A- @
- 3 | C: g& X3 S( ^, E% ?! \4 j
- print("/".join(jieba.lcut(seg_str))) # 精简模式,返回一个列表类型的结果
- D% G2 a7 Q1 C! s$ U* e* I# n - print("/".join(jieba.lcut(seg_str, cut_all=True))) # 全模式,使用 'cut_all=True' 指定 9 w7 x' I8 z% R0 Z e. c
- print("/".join(jieba.lcut_for_search(seg_str))) # 搜索引擎模式
复制代码 分词效果:
$ Y( g8 }2 |3 L P/ O5 |# \2 R
& 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 ?- # -*- coding: utf-8 -*-- W& d8 w/ P+ d" P1 J5 o$ P6 I* s
- import jieba
/ r# b2 K0 ^) N* I7 T$ L" b2 |
3 h9 A% n2 O3 N! P6 n- txt = open("三国演义.txt", "r", encoding='utf-8').read()
5 o. {+ m3 {0 C& }8 J - words = jieba.lcut(txt) # 使用精确模式对文本进行分词
/ k) |9 [# a2 n2 Y; d0 G" |, \1 C* v - counts = {} # 通过键值对的形式存储词语及其出现的次数0 k, n8 N8 V3 ?3 M3 ~# c
- 0 |% w. I# M! E: ~9 q
- for word in words:
- ?- d3 l& g; ?1 p( k# R9 s! | - if len(word) == 1: # 单个词语不计算在内
* O1 p8 ?; e4 N7 x4 t - continue0 b/ l( {2 V) l" S) ]% Z( D
- else:6 M4 Y" S+ X) q$ U
- counts[word] = counts.get(word, 0) + 1 # 遍历所有词语,每出现一次其对应的值加 1
' u5 J( k5 h' H- S' v* ]" M9 S- }
y. q+ C( C3 N- items = list(counts.items())2 A1 F$ b( s7 S) y, o# _2 H
- items.sort(key=lambda x: x[1], reverse=True) # 根据词语出现的次数进行从大到小排序
8 P" {6 i( i. x# P& o3 X2 X
$ D6 {2 p3 p) ], s- for i in range(3): C' c" A: R" H# Z) z" q
- word, count = items[i]
/ c: }# ^4 I. G# ^+ f - print("{0:<5}{1:>5}".format(word, count))
复制代码 # Y% U- Z1 t& M a
统计结果:
+ G* w! j1 u7 k
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
- # -*- coding: utf-8 -*-
% K) C8 q9 L" {# N$ U* `! ~& p$ {4 V
9 U9 w' L; p/ |# h0 a- def get_text():
1 ?! H. q) i4 n - txt = open("1.txt", "r", encoding='UTF-8').read()4 Y5 H7 f" X8 H" M2 l
- txt = txt.lower()
( g% w6 U5 L7 Z - for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':, Q" E6 }( T" ]+ U* {" ]- {. z2 L# z
- txt = txt.replace(ch, " ") # 将文本中特殊字符替换为空格& r$ s8 }3 ^& u ` T! d5 P, K8 c
- return txt& @! d; b4 ]( M6 J
- 0 x6 _1 f9 w1 T7 t! p; s
- file_txt = get_text()8 S& x6 l/ a4 E( B" w; V! ?
- words = file_txt.split() # 对字符串进行分割,获得单词列表
) u8 }1 Q I. D - counts = {}# `( ]; x: d* M: n! O5 V
- . d9 R- Z. c' f' v( E/ M
- for word in words:
* H( q3 M! ]" w' U1 p - if len(word) == 1:2 u0 q; F1 O. z d
- continue
1 v; ~# x" {* x( f, Q' y - else:2 p! y+ c7 @: e, d: d" J }
- counts[word] = counts.get(word, 0) + 1 1 n" O3 K: P8 `# Z% }, [, h
# |5 D$ h$ P* j- items = list(counts.items()) + ~ _" y$ i' _
- items.sort(key=lambda x: x[1], reverse=True) ' r( W: [: [6 ~2 r& I. [
- ' {( W. W) r/ p2 G
- for i in range(5):
* d5 p# R0 r2 e6 C" k1 G7 Y- j - word, count = items[i]
2 g! w- r8 N9 W1 J: V - print("{0:<5}->{1:>5}".format(word, count))
复制代码
# E! w; G4 P+ z" e. @# }( F/ G统计结果:
$ {0 i# E# A1 \
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
- >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))( L6 y: Y3 u1 O4 P
- 如果/放到/post/中将/出错/。! a! Z7 |! `5 p q
- >>> jieba.suggest_freq(('中', '将'), True)6 X. {7 P+ U; P/ e0 J/ m) w
- 494
/ r, w3 \* P. w! i ^7 N$ n; \' q$ \ - >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
6 b S/ f5 d3 U - 如果/放到/post/中/将/出错/。
& V* K& A' @4 N& s - >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
% M0 I1 V! O' Z ~+ ^) {* F - 「/台/中/」/正确/应该/不会/被/切开- N4 a: X1 X& C0 Y" F
- >>> jieba.suggest_freq('台中', True)' h n& i0 A3 J8 y: K1 m0 z
- 69
% L9 H/ c9 T8 n" p! `1 o5 {; Z - >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))* A5 V4 n+ ]5 r$ T3 v, o
- 「/台中/」/正确/应该/不会/被/切开
复制代码
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
- >>> import jieba* P, P9 Z8 m! X+ j) d
- >>> import jieba.posseg as pseg) X. @/ D! {( j+ x4 _( T
- >>> words = pseg.cut("我爱北京天安门") #jieba默认模式0 X% X; R3 ]" t
- >>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持1 h5 k: I: z. ?2 O) m2 J8 H
- >>> words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式8 T+ }$ ?" V6 Y/ [7 `, f1 d
- >>> for word, flag in words:, p' g2 T& I& P; h; S) v4 `
- ... print('%s %s' % (word, flag))
' d! C" K* T7 J - ...6 n& i! o2 d+ B' D7 J% p" X1 e
- 我 r8 H0 t/ D9 H0 X; L
- 爱 v5 m1 Z- o" }/ M0 l5 l$ U' p
- 北京 ns
6 t& s8 e1 K E Z% `& Y6 M- U - 天安门 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 | 时间 |
|
|