|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
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 三种模式的使用- # -*- coding: utf-8 -*-
4 h0 {- ~/ L' L/ \ M - import jieba
w7 _! |6 F1 Z @4 k3 }8 A. q - ! Z W5 ~" s/ @1 l. d
- seg_str = "好好学习,天天向上。"
0 o- Q5 T: Q6 n R( V+ P8 @ - * |& |6 f( \% ~. V6 I* X" n
- print("/".join(jieba.lcut(seg_str))) # 精简模式,返回一个列表类型的结果
4 i& q: V0 N0 x5 r' Z& h - print("/".join(jieba.lcut(seg_str, cut_all=True))) # 全模式,使用 'cut_all=True' 指定 4 U# b5 E0 x$ E/ Y$ N
- print("/".join(jieba.lcut_for_search(seg_str))) # 搜索引擎模式
复制代码 分词效果:
- P% z0 t; S' I# q9 i; j
. 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
- # -*- coding: utf-8 -*-6 {+ p$ v3 a+ K& H: P9 e1 W
- import jieba
. E0 e% [: A) I% z2 [
7 R! t6 h8 _* x! ~2 F' j- txt = open("三国演义.txt", "r", encoding='utf-8').read()
% R/ t5 u2 u! [7 @ - words = jieba.lcut(txt) # 使用精确模式对文本进行分词
3 c; U$ a" H$ d - counts = {} # 通过键值对的形式存储词语及其出现的次数# w! o7 Q- B1 S/ ^9 d Z! _$ k
/ @4 o$ ?9 ~/ V1 j3 ^- n- v- for word in words:
7 d% o$ L) b) }( ]" x4 X6 u3 N - if len(word) == 1: # 单个词语不计算在内
- D8 j+ R: K) m* y - continue
0 N; V/ ~( Z/ `+ T - else:, n. B! e; L3 c9 V! c6 q( z
- counts[word] = counts.get(word, 0) + 1 # 遍历所有词语,每出现一次其对应的值加 1) Z# d8 J' B% Q+ {, h
- 9 @' m2 X. N- |
- items = list(counts.items())
$ U. q4 [2 c" d( e9 _* L - items.sort(key=lambda x: x[1], reverse=True) # 根据词语出现的次数进行从大到小排序
7 C0 D. T% \2 x. I6 t" S3 ` - * V: E7 J" Q: A5 B. t: a
- for i in range(3):
! `# A& ^& W' ^8 \: q+ @5 ^ - word, count = items[i]
% X8 i1 \# h7 y, ` - print("{0:<5}{1:>5}".format(word, count))
复制代码 2 g+ U. [. `0 U2 G/ u( P! }
统计结果:
' |, u9 c2 N/ K( Q
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- # -*- coding: utf-8 -*-9 s4 c& T- F x5 |) ], Q
b' c; \8 ]( I. ]6 J, z+ M+ \) ~- def get_text():
; f! E4 z# O0 t9 i - txt = open("1.txt", "r", encoding='UTF-8').read(), `: U% i# {. y5 x* v
- txt = txt.lower()
5 Z3 b/ u* h& T0 z - for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':4 M/ ~. N" f/ X( q; U' r! o! M( I
- txt = txt.replace(ch, " ") # 将文本中特殊字符替换为空格: ~' \. Y! s+ b/ b+ _4 v: o! m
- return txt
: [( n1 N% u% t* u7 T$ ?/ u - & l- R: ]: r5 C( ]' s+ K# a* Y
- file_txt = get_text()
: X4 R+ ~3 e! L, } - words = file_txt.split() # 对字符串进行分割,获得单词列表5 {9 g! C: f3 c& E+ S
- counts = {}# n. m3 g. j1 W8 c0 I( b7 k+ l
. |! `2 d8 k; j0 c0 b! H- for word in words:
$ R* {5 M0 h5 g/ E, C% W - if len(word) == 1: Q' R. G1 Y2 E8 \ j7 ]
- continue
' j5 y+ w, @/ W/ Z; `/ ? - else:
1 ~; J e" T, Y* U% e2 v - counts[word] = counts.get(word, 0) + 1 1 L/ r, @ x1 U2 \
I7 ?, q& ^( A! P- items = list(counts.items())
* G! y5 G# z* E: H( {; E+ g - items.sort(key=lambda x: x[1], reverse=True)
y" k4 j; k2 W - ) u) l$ S e8 Q3 L! u, N
- for i in range(5):
" [+ U9 }* {; y6 H7 n0 d; d - word, count = items[i]2 |) `; L- U- L& U: T* d
- print("{0:<5}->{1:>5}".format(word, count))
复制代码 , k' \+ X9 k$ l6 H+ B' z) o
统计结果:1 p( V" T% }- P# U) Q4 A- @
; 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
- >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
- Z+ @" t5 T! o0 K1 G - 如果/放到/post/中将/出错/。8 p. R! @' n( M; M1 R: i/ s+ ]
- >>> jieba.suggest_freq(('中', '将'), True)
; ?' a, ?3 p3 w+ P6 I. y - 494( c. l8 X J4 d& G, S q
- >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))% v9 i# _# L0 S8 y- b+ C4 K
- 如果/放到/post/中/将/出错/。, L4 G# o' I4 J. {) y' f& R
- >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
$ {0 X) d' Q5 x, B - 「/台/中/」/正确/应该/不会/被/切开
3 A$ ]2 R- p2 }; q4 Q - >>> jieba.suggest_freq('台中', True)
8 ^4 u) {- `. _2 T" m I8 w2 v - 697 J! H' y7 x. b5 f/ I2 k
- >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
3 K/ D% z& X, T5 y& l - 「/台中/」/正确/应该/不会/被/切开
复制代码
' 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
- >>> import jieba& e8 S/ ~6 N/ Y/ Y) t
- >>> import jieba.posseg as pseg# n6 X0 f2 H7 E* y! {
- >>> words = pseg.cut("我爱北京天安门") #jieba默认模式& \& q8 j R- y+ R$ e* z
- >>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持
4 L. a7 e4 G" n% h# B- y - >>> words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式
/ v9 P4 ~" E" `3 s7 F) ~. A4 ` - >>> for word, flag in words:. G9 g4 i0 K8 N$ Y: X) [, w% l
- ... print('%s %s' % (word, flag))
" j! P9 |& p n) M4 g - ...
9 d9 Y+ Q" e8 i( v - 我 r( f- M! {/ s: _: `
- 爱 v9 C' H' M# L! }* w) N- _+ d$ x
- 北京 ns+ P) b) D0 ]# i6 {! d* k7 ~: l
- 天安门 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 | 时间 |
|
|