|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
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 三种模式的使用- # -*- coding: utf-8 -*-2 F$ p0 y1 b- n8 }' K' @, s' L
- import jieba7 b+ O+ S! W. E: L* |
- $ W; Q- B. b0 S9 W, I
- seg_str = "好好学习,天天向上。"& y) B) ^0 p) z3 _2 |
- ! x0 |# V0 r* `# r& V: q
- print("/".join(jieba.lcut(seg_str))) # 精简模式,返回一个列表类型的结果- }5 C& q2 i. |& v6 }. C" f: v
- print("/".join(jieba.lcut(seg_str, cut_all=True))) # 全模式,使用 'cut_all=True' 指定
' \1 _' O% V- i# P - print("/".join(jieba.lcut_for_search(seg_str))) # 搜索引擎模式
复制代码 分词效果:
& u8 P2 `5 W" D! M
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- # -*- coding: utf-8 -*-
1 [. `5 m- G$ h( p# ^- Y, k' _ - import jieba
5 }( n+ ?, r& n5 d
7 k/ R: w/ U, u8 _& \" `- txt = open("三国演义.txt", "r", encoding='utf-8').read()
6 j+ z* M8 [* O; D7 I4 y( F - words = jieba.lcut(txt) # 使用精确模式对文本进行分词
3 j% k* e9 V) {4 W7 E) P - counts = {} # 通过键值对的形式存储词语及其出现的次数7 ?& E2 _8 a0 h+ | E6 f g Q; _
- ) Q, f9 |2 J8 G
- for word in words:- q. X, f3 m! @. v5 ^& c# X
- if len(word) == 1: # 单个词语不计算在内8 {0 w9 Q3 O6 z. J1 U$ Y
- continue
6 `5 P8 P* q- m9 M/ ^5 M - else:
/ L0 o6 u8 i( D6 e9 b" [ - counts[word] = counts.get(word, 0) + 1 # 遍历所有词语,每出现一次其对应的值加 1
- L1 ^. y- M) |
) R' Z7 w3 {* g" m6 b1 q5 @- items = list(counts.items())) ?: }6 b- s+ K/ d
- items.sort(key=lambda x: x[1], reverse=True) # 根据词语出现的次数进行从大到小排序
$ u* _5 E5 d. V1 ~
5 r* n0 o% _7 s9 k0 {- for i in range(3):
8 y: [. n9 E0 Y4 o+ f: G8 ?* S - word, count = items[i]
; W: K) t/ l' b0 L4 Z - print("{0:<5}{1:>5}".format(word, count))
复制代码 G3 j ?4 N! n( I
统计结果:- p$ @6 n5 C+ t5 T
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
- # -*- coding: utf-8 -*-0 C1 T9 A) Z; Y. H* q; w7 r; e
' r! c0 n8 A5 q7 L% Z: Z3 k9 _. T4 P- def get_text():
9 h- Z; A3 K8 w: X Z - txt = open("1.txt", "r", encoding='UTF-8').read()% Y: z2 r* K( a& n3 y2 p2 o# ^ J9 c( L
- txt = txt.lower()
* f2 L+ _$ n' f" f) q1 T. { - for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
{& e' o, n8 m3 B; t - txt = txt.replace(ch, " ") # 将文本中特殊字符替换为空格) W1 f2 X+ c) q
- return txt* v7 u/ Z# N+ X' E& O( @3 ]
* ^* G- |2 J+ G. j% N: X3 F- file_txt = get_text()
0 b: n& b* M# ] - words = file_txt.split() # 对字符串进行分割,获得单词列表8 K5 G4 g7 V% t2 k
- counts = {}
: F, I/ H+ `8 C7 y1 Y R" ]
) j* x$ `9 b; c2 R/ b7 B! h- for word in words:; x0 l6 z( e9 q. s( n1 |' P
- if len(word) == 1:
0 }8 t9 z- g# [0 ~8 H$ J6 b7 y- F, v9 A( T - continue
7 t2 t2 |+ @4 R0 K - else:
8 m. }+ `2 e% N1 A- S$ o" C0 } - counts[word] = counts.get(word, 0) + 1
, i8 t% j* g) E* m* K/ ~
8 C7 q+ v8 F9 v1 D- _1 ]- items = list(counts.items())
6 D% P% g1 f# K P- n- ^6 i - items.sort(key=lambda x: x[1], reverse=True)
; ~5 v5 t# C8 }& m5 i
( L; {5 P$ d7 R" ]- for i in range(5):! L3 J$ d y2 N' o3 g
- word, count = items[i]
0 }; g- Y4 S, i - print("{0:<5}->{1:>5}".format(word, count))
复制代码 # R: f- V; p4 L2 |
统计结果:. U% ^8 Q5 a8 z. r/ R1 P$ |5 x
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
- >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
4 F1 h; R1 @2 e6 \& Q - 如果/放到/post/中将/出错/。' q2 E9 \0 C* U& S6 O6 m* \3 f" ?
- >>> jieba.suggest_freq(('中', '将'), True)6 K P4 U1 B% J* T
- 494
* d6 j9 Y. H/ e; u8 W - >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
0 }- [0 G. a- M" {% i* K - 如果/放到/post/中/将/出错/。) f2 [/ c4 B1 t2 T T) b/ v
- >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
8 x3 f! a. J1 ]+ D - 「/台/中/」/正确/应该/不会/被/切开, }. s( t! _: l$ o) [+ T
- >>> jieba.suggest_freq('台中', True)& I' S. @8 O0 |1 I
- 69* r- i8 P0 [) J* N. G) M6 ^
- >>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
! `. ]( O6 O+ D8 i% S2 v7 }! e - 「/台中/」/正确/应该/不会/被/切开
复制代码 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! [
- >>> import jieba1 u3 Y6 b5 A( b/ O' [$ q! R
- >>> import jieba.posseg as pseg% z$ o8 r) d8 P, w( R( u" N* M$ N
- >>> words = pseg.cut("我爱北京天安门") #jieba默认模式
! v: z/ m+ F4 _# a& P) v - >>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持
( U) J: y# w0 ]# x - >>> words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式
5 h' M% R2 \* Y3 k7 v - >>> for word, flag in words:( c: y" {, W1 T7 g% h/ r$ c- A
- ... print('%s %s' % (word, flag))5 b* o- C6 M9 K# P0 |# n
- ...
$ ^" G S; `6 E! I# i; d - 我 r
& Y0 Y6 C: w5 L7 c/ j* R5 ~ - 爱 v
- Y7 u T# c3 M2 P+ F2 f) @ - 北京 ns
3 n3 o1 N6 A* s: @ - 天安门 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 | 时间 |
|
|