QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5732|回复: 0
打印 上一主题 下一主题

爬虫(六十九)简明 jieba 中文分词教程(六十)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-31 10:40 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    爬虫(六十九)简明 jieba 中文分词教程(六十)
    ; g# n. N: i+ D$ o: t! \
    & e0 q; y  C. H5 n9 C2 B0 引言

    jieba 是目前最好的 Python 中文分词组件,它主要有以下 3 种特性:

    • 支持 3 种分词模式:精确模式、全模式、搜索引擎模式

    • 支持繁体分词

    • 支持自定义词典


      $ Z) v# f5 l+ h+ }

    • / n  |9 a9 p. \

      - E8 [9 Y* h  X5 _: ~- Q0 f# 导入 jieba; T  X' r" D: O5 c
      : r. [0 C4 v; m# L; H
    • 4 K6 [9 }8 K* R4 O7 _

      * `. L) d; s& ^3 _- z- Y  q1 dimport jieba7 w1 C2 M8 d. M0 z

      # {/ k* \6 j9 ?/ i9 w2 i% q6 U) N+ C

    • % m' ^$ E" m. E
      6 l& K' [# \+ e4 O+ m
      import jieba.posseg as pseg #词性标注
      8 p1 c! ~/ T/ V( d+ y
      9 z5 Q- j" p' ~$ C' Z
    • 9 c9 O, M1 Q( z* l1 [  K
      # W/ \0 s# ]3 b1 N' x9 g  v6 }. H
      import jieba.analyse as anls #关键词提取
      * V( @; E; i. B, v& S
      / S: P# J. j# S! C" P

      7 A% Y$ D; N) Z; l/ \% X( I

    1 分词
    4 h# w* e! @) V9 w, {0 `' O可使用 jieba.cut 和 jieba.cut_for_search 方法进行分词,两者所返回的结构都是一个可迭代的 generator,可使用 for 循环来获得分词后得到的每一个词语(unicode),或者直接使用 jieba.lcut 以及 jieba.lcut_for_search 直接返回 list。其中:
    7 B5 ?. h" y: A0 s4 @$ w- ?

    • jieba.cut 和 jieba.lcut 接受 3 个参数:


      ) }. S9 P9 O( J: s* T% Z- x
      • 需要分词的字符串(unicode 或 UTF-8 字符串、GBK 字符串)

      • cut_all 参数:是否使用全模式,默认值为 False

      • HMM 参数:用来控制是否使用 HMM 模型,默认值为 True


        * M+ P8 @  M8 ~& S# O. f: ~
    • jieba.cut_for_search 和 jieba.lcut_for_search 接受 2 个参数:

        A# ?$ q3 c& j4 r7 K6 X/ D
      • 需要分词的字符串(unicode 或 UTF-8 字符串、GBK 字符串)

      • HMM 参数:用来控制是否使用 HMM 模型,默认值为 True

        $ D8 q3 z$ ]2 H

    # 尽量不要使用 GBK 字符串,可能无法预料地错误解码成 UTF-8* t5 Q$ }& s" w5 W$ |
    1.1 全模式和精确模式
    2 b$ l/ ?* M. N  z( F  ~3 t
    4 T& i( K6 M. f5 H5 k) E$ }- Y


    • $ m; }- j- ~: n' ~& f2 t

      ) i) y# l7 z! Q! H- I0 Q# 全模式
      ; t; D( I5 s; Q" o( r8 y. @

        ~1 L  R1 h  z( m) b7 J% U1 N6 |

    • 5 i2 D# Q! g& G
      2 a) B: W. c8 L
      seg_list = jieba.cut("他来到上海交通大学", cut_all=True)1 [- ]9 O' c2 b; `) i' a+ \

        m/ x; w+ \* u$ E

    • ! j& a% R8 u7 c$ Q& S& `
      & x3 V3 M* a- s
      print("【全模式】:" + "/ ".join(seg_list))  
      0 r* U% j1 q$ ~
      0 Z6 }# U# K$ E5 y" I6 Y) K
      4 j! _4 z8 H  |' f7 t9 Y. P6 X

    【全模式】:他/ 来到/ 上海/ 上海交通大学/ 交通/ 大学


    • & _7 F" C8 |5 Z; N& y9 ]2 Y
      # Z4 \  a1 M* q' G; h& }! N- \
      # 精确模式
      7 K8 o( D1 n. M  u! N/ P* w

      ; y# b; _6 n" N

    • - M, a) v/ W( g3 b% Z- [8 M  z
      ) k3 Q$ r2 ]9 P! @2 b
      seg_list = jieba.cut("他来到上海交通大学", cut_all=False)% J- B6 M$ Z# `% X. @" {

      / l- l/ y: s0 i  C3 t8 i

    • # `3 k7 I8 Y8 x$ R$ z2 O
      . _0 T  Y( b" ^$ v; f
      print("【精确模式】:" + "/ ".join(seg_list))0 v( C7 `2 i) R0 ]1 S
      ) e* F6 V4 r: C" H0 ~$ L: n
      3 w6 n; G4 L! z& d$ P

    【精确模式】:他/ 来到/ 上海交通大学

    type(seg_list)

    generator


    • 0 {2 W4 K! v3 M# W- H

      ( k- N' H# \+ Q* p# 返回列表; b3 P8 t% D8 k6 g2 [6 D. @! u

      / x2 R, T; c  B. {

    • 6 y. ~8 X8 y4 i6 T

      - S% @! @! I0 D9 I: bseg_list = jieba.lcut("他来到上海交通大学", cut_all=True)8 b7 C( Q8 d+ ?2 O( i
      5 H3 }0 L1 C) c0 r: T' x. N

    • & v. c/ Z* D1 y  e* T- p8 r
      : e3 v8 f3 J. c' X! i
      print("【返回列表】:{0}".format(seg_list)); s' a# K, o3 b" |5 G: c5 r
      8 {7 W* `- S- e) X: @

      ! n  N3 L! _6 ]% g7 [0 E9 @

    【返回列表】:['他', '来到', '上海', '上海交通大学', '交通', '大学']

    type(seg_list)

    list

    1.2 搜索引擎模式


    • 5 A5 J8 F! v  U# Z# E& D

      ( O3 M) _, l3 _# 搜索引擎模式
      1 r$ ~- @" k0 W# d- J
      5 X2 A8 M7 I3 H% Q
    • 3 D( {* R) k2 q: W
      6 e" ^0 q! h, k$ f
      seg_list = jieba.cut_for_search("他毕业于上海交通大学机电系,后来在一机部上海电器科学研究所工作")
      ) Q9 R0 h% A9 B8 z5 q; [  _8 S0 f: E
        S$ c: p$ M+ ~

    • 6 f3 J2 j' y: e  }5 R: Q% I8 v

      ' j- x! A5 t! a3 Cprint("【搜索引擎模式】:" + "/ ".join(seg_list))
      1 h% j4 \' P4 e; y! a2 b

      ! L; i$ _5 }7 s8 Q& p4 [% d& {% G: _; c9 n/ x- z

    【搜索引擎模式】:他/ 毕业/ 于/ 上海/ 交通/ 大学/ 上海交通大学/ 机电/ 系/ ,/ 后来/ 在/ 一机部/ 上海/ 电器/ 科学/ 研究/ 研究所/ 工作


    • . O* a+ o) S( g' ?; w

      - Q2 U1 J7 ]+ ?( n! R- y0 i, p6 [+ X7 c# 返回列表
      ! l- b9 i2 Q7 ~% ]6 d. f( C. A* L

      ' n$ h; R6 f0 b
    • 6 K& A' l# b3 N8 C  N+ A: [$ ^

      % _; e$ w! {1 e4 @% h( w4 h* W# ~6 _seg_list = jieba.lcut_for_search("他毕业于上海交通大学机电系,后来在一机部上海电器科学研究所工作"): X& R# s) j$ H! ~  m4 r% S; }

      & p  M& p$ Y9 Y  }2 l5 M
    • # n) ?2 I8 h3 L- e

      + `6 z7 _! a( H5 e' m/ Xprint("【返回列表】:{0}".format(seg_list))* ^7 a7 z1 B; j( y; j- @
      : j* p; w$ A0 _+ l

      $ b* |  _" _  K4 n

    【返回列表】:['他', '毕业', '于', '上海', '交通', '大学', '上海交通大学', '机电', '系', ',', '后来', '在', '一机部', '上海', '电器', '科学', '研究', '研究所', '工作']
    ' W6 `& D1 M$ r5 ^1 a
    1 ^" ^+ u$ G2 S- u9 T1.3 HMM 模型  F. _7 T/ v9 @9 f5 P, |! c+ _# x+ h( a
    HMM 模型,即隐马尔可夫模型(Hidden Markov Model, HMM),是一种基于概率的统计分析模型,用来描述一个系统隐性状态的转移和隐性状态的表现概率。在 jieba 中,对于未登录到词库的词,使用了基于汉字成词能力的 HMM 模型和 Viterbi 算法,其大致原理是:
    ! {, F$ [, S: x  X% L% r采用四个隐含状态,分别表示为单字成词,词组的开头,词组的中间,词组的结尾。通过标注好的分词训练集,可以得到 HMM 的各个参数,然后使用 Viterbi 算法来解释测试集,得到分词结果。
    3 j3 B3 [+ }( w7 K6 u( q% r: n' \5 M7 j( S; t
    # 代码实现可参考 HmmSeg.py$ a: u7 a% _! B$ F( c

      d' f0 j3 U" x# z

    • & l8 {, Y( L0 F& H& P/ g
      9 O0 h0 z9 H9 y4 Q4 [
      # 未启用 HMM/ S5 E- e/ H: I6 D# m/ |. ]
      5 f4 g7 Q6 o& Y0 l" s! B, s

    • 1 L8 R) t$ w" b& @
      $ v% u6 ^3 j- J7 {$ ?
      seg_list = jieba.cut("他来到了网易杭研大厦", HMM=False) #默认精确模式和启用 HMM
      ( C5 J# R. B4 X" V/ `
      ( ~8 w4 |) \9 V4 S( L1 q$ M

    • $ h& R! m  ?  T0 c6 S% e* u3 p

      : W+ U  s5 q! y! R/ nprint("【未启用 HMM】:" + "/ ".join(seg_list))
      5 X" T8 N0 Z. K9 ^3 H2 g
      2 s3 `  {+ v% Y. _
      1 U" Z4 @9 M9 U8 [1 n; L1 L

    【未启用 HMM】:他/ 来到/ 了/ 网易/ 杭/ 研/ 大厦

    • # z/ l4 J+ h$ d3 y0 e) d/ T1 ]2 _
      : ]# ?3 I) g$ v. N  h
      # 识别新词
      2 M9 l+ o! o3 d

      & P& T5 @6 z& T+ g4 D% @9 u, s0 \$ x
    • - E2 ?0 X  W1 V  ?

      3 }% i0 K; A$ b( I4 @5 k3 lseg_list = jieba.cut("他来到了网易杭研大厦") #默认精确模式和启用 HMM
      ! V: D: \7 S2 j( P- b3 h* P' n2 J& X

      6 y: i: i6 X2 c: Z" v( w6 ]

    • $ C* S+ L0 |( I4 g' U5 I, |

      0 e8 G8 p. q( n, r( l+ ^print("【识别新词】:" + "/ ".join(seg_list))) m" N$ k. ?" o5 W

      + |# w. [3 L! Z! x" A; N3 ]0 v
      9 y  H& u! n' Z! F: \

    【识别新词】:他/ 来到/ 了/ 网易/ 杭研/ 大厦

    2 繁体字分词

    jieba 还支持对繁体字进行分词。


    • $ t& d4 [4 L9 \, Z
      2 ~1 Z1 Q+ }" y$ w0 c( z
      # 繁体字文本
      & r( s+ k; U. j7 u

      6 Q, X9 @! [! W* [
    • 4 Q8 F/ @& l& ~

      ( K) f' T4 L  {, N9 d/ Gft_text = """人生易老天難老 歲歲重陽 今又重陽 戰地黃花分外香 壹年壹度秋風勁 不似春光 勝似春光 寥廓江天萬裏霜 """/ ~- ~% J0 l: T* _5 f! ^  i

      & L9 I/ s6 b6 f+ T& Y0 i2 F
    •   q' Q5 p7 K$ M% r8 q* }. y$ u1 h

      ; b( y$ S. r* r) t# 全模式
      3 v1 v+ k; B6 N7 M7 M1 q6 |- g
      ' m/ [. ]0 ?/ x- a, G3 ]" s4 _' x

    • # p* k% \3 K- B3 I8 m. t

      1 ]$ O. ^$ |" x' V# wprint("【全模式】:" + "/ ".join(jieba.cut(ft_text, cut_all=True)))
      7 D! {+ d3 u1 ~7 A3 z$ d# M
      % R2 x" o# H. ]

      ) d5 {) O9 Z+ o% ?( k2 {+ l6 U

    【全模式】:人生/ 易/ 老天/ 難/ 老/ / / 歲/ 歲/ 重/ 陽/ / / 今/ 又/ 重/ 陽/ / / 戰/ 地/ 黃/ 花/ 分外/ 香/ / / 壹年/ 壹/ 度/ 秋/ 風/ 勁/ / / 不似/ 春光/ / / 勝/ 似/ 春光/ / / 寥廓/ 江天/ 萬/ 裏/ 霜/ /$ y* Q( x1 q, L3 v5 [1 }


    • ; _5 `: Z! i* l) l# S$ Z# G

      ( N& h7 a. t: v% \' {! d/ H# 精确模式/ \7 T& k' Y9 h$ G7 y1 S7 x7 w

      " M( c5 a5 S. p$ l* t* y7 D- F2 I8 B# Y/ C
    • 2 T$ ?4 @+ ^3 I5 M: p7 {0 Z1 ]

      7 w" U/ a* {. a9 @' o" ^print("【精确模式】:" + "/ ".join(jieba.cut(ft_text, cut_all=False)))3 _# s$ Q. y; R+ e* \. H  S
      / a! B9 n5 c% B
      ; s7 f! g3 p! F1 D0 y/ B

    【精确模式】:人生/ 易/ 老天/ 難老/ / 歲/ 歲/ 重陽/ / 今/ 又/ 重陽/ / 戰地/ 黃/ 花/ 分外/ 香/ / 壹年/ 壹度/ 秋風勁/ / 不/ 似/ 春光/ / 勝似/ 春光/ / 寥廓/ 江天/ 萬/ 裏/ 霜/
    $ W& j$ Z* [% P* Y+ c; g" ]2 E" e8 j; v7 H2 Y

    1 O! V5 L$ @- ], ^6 W$ z3 Z+ b  Q

    • 3 S- O* n" f! C4 _& w& D/ e
      " u6 e$ r5 p% q; M9 Q
      # 搜索引擎模式* R& T2 h9 _: V% u% q/ Y
      6 N# L" s9 U  b. z

    • . o  `) h5 Q* W! b" O5 o
      & J2 e' v' i' t
      print("【搜索引擎模式】:" + "/ ".join(jieba.cut_for_search(ft_text)))
      $ W7 [: E" A$ R2 I4 P' L# b

      - G' O4 S( I3 E0 L6 j( u. U6 |+ h, D

    搜索引擎模式】:人生/ 易/ 老天/ 難老/ / 歲/ 歲/ 重陽/ / 今/ 又/ 重陽/ / 戰地/ 黃/ 花/ 分外/ 香/ / 壹年/ 壹度/ 秋風勁/ / 不/ 似/ 春光/ / 勝似/ 春光/ / 寥廓/ 江天/ 萬/ 裏/ 霜/0 r- x# g& _  @8 f. u' S
    ( d& ?& }% j& [- s% z% Z
    3 添加自定义词典/ o/ ?# \* }3 M6 [
    开发者可以指定自定义词典,以便包含 jieba 词库里没有的词,词典格式如下:  ^& G# C! h2 g5 Q. B
    词语 词频(可省略) 词性(可省略)& S& ?" P0 |' z4 S
    * b9 E1 }2 O3 z. s
    例如:2 s: d0 a- W  n4 m: y$ m& b: B) J2 V4 G

    % X" E3 R& @& e1 a) H+ F/ i9 T6 J( u6 E& Y8 ]+ ^


    • . Q1 G2 L& [: H. T. {
      * ?+ O. V7 Z. M% S6 T& u. z
      创新办 3 i  Y0 w( r8 {' |; X) k/ T) c
      & R8 ^+ T0 O) V4 I

    • . C, ^# N  X1 z8 S% T) r8 n& q
      1 H8 J# _1 D% {4 ~5 y
      云计算 5
      : [/ k7 h$ D/ m7 I0 f$ _+ s; ?, w7 Y! Q
      + x% _/ v3 ^, W
    • * u" V# Q+ u' N, J  m* u
      * g5 o1 W$ A3 ~( v6 `' G4 `) L2 b
      凱特琳 nz
      ! ?4 G, [2 b8 A' l. \% d( ?

      4 I( _" O/ Z6 o# m- q: k2 k, G: n# S/ M2 F

    # 虽然 jieba 有新词识别能力,但自行添加新词可以保证更高的正确率。
    . `' S3 ?) L6 K: l1 L" q2 {3.1 载入词典
    / e, N+ k/ Y, @7 M# ~& u使用 jieba.load_userdict(file_name) 即可载入词典。
    & [+ g( Z+ o2 w& y% l& D$ ^1 ]# file_name 为文件类对象或自定义词典的路径
    + d8 S2 X; Y+ b" e
    1 b3 k9 H2 u/ f2 D* n5 V! `6 ]! v( s8 |- X1 P) x* P: j' q. T


    • 1 g, r0 V0 v9 a' b: U
        P+ M3 X+ W3 Z  G
      # 示例文本
      - s/ G! s7 ^0 ?* b( w

      2 k6 P1 _, k  d

    • 6 {2 c: h) M/ X% B# A

      , s; ?2 w% `1 jsample_text = "周大福是创新办主任也是云计算方面的专家". {+ _1 ^& ^$ h* r  v7 i
      $ ^, r' i8 \: W) D5 O$ b7 z0 D$ B

    • & c- ~( h8 B" i* I0 a  H2 T

      # p3 K& y4 h; O$ _+ k$ j& L& Y( L* O8 K- _% @. O  p0 {& L
      , [: A& _2 q  M

    • 0 l% p7 M3 T% j: j, |

      5 [/ p  A4 _. m- C4 ~! v$ d" J# 未加载词典5 f9 W8 I) V- y6 E' H! l! f

      7 h5 x1 X7 A' G

    • 6 l* h+ K- l8 o- ?; z
      # {4 ~& V0 k+ i/ Z
      print("【未加载词典】:" + '/ '.join(jieba.cut(sample_text)))- j- c3 E  [1 c8 A. [0 N8 H
      ' p4 J" X& i; F$ b

      3 n0 @& r7 i: d7 |* p. B7 I

    【未加载词典】:周大福/ 是/ 创新/ 办/ 主任/ 也/ 是/ 云/ 计算/ 方面/ 的/ 专家

    【加载词典后】:周大福/ 是/ 创新办/ 主任/ 也/ 是/ 云计算/ 方面/ 的/ 专家& R2 F7 }$ X# i5 G9 D, d! A" n$ c; L
    0 A( D+ C. i8 f4 e; a; @! P
    3.2 调整词典
    3 K. l7 F& U4 S0 t6 }使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。: Q: C) h) e: F9 ~7 |/ _

    % [( W" Y( b1 E
    1 v: p/ Z0 n% ^; h" a2 f9 ~


    • 1 a4 C' D' o: D" ^; ~* |

      2 {/ Y, s' h% a/ D4 ?- ijieba.add_word('石墨烯') #增加自定义词语
      % |" z- O/ c" i

      . z5 E7 b3 K+ ~, x# `9 x, o

    • . i3 j" H; l+ d; ?& m
      % f4 \, w. w/ j
      jieba.add_word('凱特琳', freq=42, tag='nz') #设置词频和词性( a1 Z$ e  m6 ^1 F) n* e9 |. N
      ' a* n) a0 Y- |( c
    •   @5 S# m$ X' T: N' j. G
      6 M+ I4 |4 i% g: s3 w9 x
      jieba.del_word('自定义词') #删除自定义词语7 x* ]- V" f6 x4 ?* L( Q. F

      2 ~9 _6 c: ~+ [6 h
      2 w8 }3 U5 A& e7 `. D6 W. N3 H

    使用suggest_freq(segment, tune=True)可调节单个词语的词频,使其能(或不能)被分出来

    • 5 J. j; z9 R/ q- w
      " Q$ S' Q1 y* l2 M( C" ]
      # 调节词频前
      . D" X3 G' ?# M
      8 H/ Y9 Q4 f/ |

    • 1 c& r* p4 s8 u) d; m

      6 A- A' `) X$ ]: m3 Vprint("【调节词频前】:" + '/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
      , {2 ]+ U- b  U/ V1 Q' O
      4 X# L6 |" x+ u1 r+ d! i
      / z" t9 p# C( }, j7 d

    【调节词频前】:如果/放到/post/中将/出错/。

    • / `% _$ t. k+ H  f
      6 ^: A/ m/ a/ m  h  D% ?
      # 调节词频& _6 J5 H* D$ F- a

      % y- i1 V# ]+ z' s* e+ Q

    •   s0 ]& x# i% [* g

      3 u: h+ \" q" c& {% `8 Gjieba.suggest_freq(('中', '将'), True)1 M6 t" v2 Y& D! g: s. N4 f. a
        T% g. x/ y% F1 ~0 Y2 V4 q
      5 \$ h9 M# |' ?# D4 `2 B- R

    494


    • " C( D' z( F) g; k

      5 c; @: R$ ?$ }) T0 X# X* U# 调节词频后! T, r# S1 {9 n0 m' g# w

      ! L# i- N/ H6 s" u7 n- D
    • ) Q/ f) m; J, ]# }7 Q/ e% W

      0 Z8 w6 v* z' l% c4 A2 jprint("【调节词频后】:" + '/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
      4 g  @% ?" P+ Q% u' }" Z8 d/ }
      8 x# P8 p0 G: q

      9 y' k" M) z5 a2 ~9 q' A# e+ [

    【调节词频后】:如果/放到/post/中/将/出错/。# G! i9 y# @- T6 A/ o+ G" Y7 Z
    7 J% c- v: n- d+ S3 l9 C) K  [
    4 关键词提取
    7 j! Z+ Q" V9 ]0 v9 ejieba 提供了两种关键词提取方法,分别基于 TF-IDF 算法和 TextRank 算法。5 Q" ^8 l& Y' c& `
    4.1 基于 TF-IDF 算法的关键词提取% r. ~. J# N$ P7 Z
    TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率)是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的一份文件的重要程度,其原理可概括为:
    6 E3 _! u- G! Q- D8 p% _, V2 u一个词语在一篇文章中出现次数越多,同时在所有文档中出现次数越少,越能够代表该文章
    7 G2 J! w$ a& @# M3 e$ C! F% `# |0 ]* p) O
    计算公式:TF-IDF = TF * IDF,其中:
    % }9 y3 A5 L+ k" p+ Q7 M. U

    • TF(term frequency, TF):词频,某一个给定的词语在该文件中出现的次数,计算公式:% y' f! ]+ m! H+ T# }  `! B

      8 w% U9 W6 o1 X0 w
      $ o3 O# }5 v. {5 ?" s/ J: y8 v1 _3 l

      1 f8 `! v7 T9 k; \' c4 G9 j
    • IDF(inverse document frequency, IDF):逆文件频率,如果包含词条的文件越少,则说明词条具有很好的类别区分能力,计算公式:
      + k7 N; Z; h0 }8 @" \$ B9 I0 i# e  Y0 ]: Q0 Q6 T) _

        [5 H. H1 d& E5 @) D( s2 O

      * I* w3 }% j7 X8 b; K) c

    通过 jieba.analyse.extract_tags 方法可以基于 TF-IDF 算法进行关键词提取,该方法共有 4 个参数:
    + k% a0 W7 _" a/ k: C/ ^. Y0 y

    • sentence:为待提取的文本

    • topK:为返回几个 TF/IDF 权重最大的关键词,默认值为 20

    • withWeight:是否一并返回关键词权重值,默认值为 False

    • allowPOS:仅包括指定词性的词,默认值为空


      6 v$ s8 F3 u; z5 U

    • ! p# g4 j" h5 l
      7 R  y; o2 s9 s0 @, h) c
      s = "此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"7 Y( e3 U6 j( \& H* u

      0 p; y  S8 H8 v/ Y  G

    • " B& }6 \7 `$ p% b0 @
      : V7 @6 Q6 I* p" y1 [
      for x, w in anls.extract_tags(s, topK=20, withWeight=True):
      ( C: a9 C, X9 d3 B& K+ D, ?$ n

      + a% {2 b$ \' h# a

    • ' a/ r1 O* P1 \4 k
      ' r4 P# z7 m5 o  q/ g
          print('%s %s' % (x, w))4 x) E6 o" F" s
      4 [% Q+ w0 U) ]; g8 M
      $ W0 {, r7 v  P! H- \! G+ _

    欧亚 0.7300142700289363
    9 Z& M& V# P0 H8 T& W, D; W3 ]吉林 0.659038184373617
    % @; I: z7 q4 q6 R2 m置业 0.4887134522112766
    5 y) |7 P0 H. n! Q" ]2 E& I万元 0.3392722481859574% p. {. s7 F3 ~1 L
    增资 0.33582401985234045
    ' Y  u" `4 [) Z- s/ {" V# W6 c4 z4.3 0.25435675538085106' N2 H1 H- g  `9 n4 P7 s: @
    7000 0.25435675538085106
    ( J& D# s2 J+ @0 _( G2013 0.25435675538085106
    3 i/ B7 i$ }' ~- b- X* n) e8 p139.13 0.25435675538085106
    * k0 F- D4 V, R: z# L5 T' `实现 0.19900979900382978
    7 i' h9 t  R0 ^# }综合体 0.194803096247021274 P/ n+ s! R- ]# ]4 A% L
    经营范围 0.19389757253595744
    5 c' u5 E5 u$ q9 g' Q! }亿元 0.1914421623587234; Y0 I- r# H" l% `7 F
    在建 0.17541884768425534( |. G5 \6 Q. @3 R. S( W
    全资 0.17180164988510638
    . ^* o9 q6 V6 l- t. g: t注册资本 0.17124415268 r9 Q* M. w: l  U$ R% D( B, T) H
    百货 0.16734460041382979
    ; I4 E) F5 O5 a" q/ C零售 0.14750571170574473 Z2 |, k' ^  O+ S  l
    子公司 0.14596045237787234
    ( T4 d4 `$ G4 y3 a1 D  b. ?% h营业 0.139201785090212757 c+ B$ A- h' u2 {' K+ N& |% ]/ |2 ]

    3 M3 m2 G# l2 t( Q! g使用 jieba.analyse.TFIDF(idf_path=None) 可以新建 TFIDF 实例,其中 idf_path 为 IDF 频率文件。
    + Q1 C5 C2 @2 I5 l! g4.2 基于 TextRank 算法的关键词提取( P2 p% u/ I4 @% @0 m' H
    TextRank 是另一种关键词提取算法,基于大名鼎鼎的 PageRank,其原理可参见论文—— TextRank: Bringing Order into Texts 。
    3 M; L" _: U3 c$ d9 i  m: K通过 jieba.analyse.textrank 方法可以使用基于 TextRank 算法的关键词提取,其与 'jieba.analyse.extract_tags' 有一样的参数,但前者默认过滤词性(allowPOS=('ns', 'n', 'vn', 'v'))。
    + j8 i6 Q7 m/ }0 J7 Y) {- |( @1 ~' }7 u; m7 w4 `" R

    5 G4 C' R  f& P7 d8 j

    • 9 q* m" y& u3 }0 D

      6 `: ~8 t, @0 I1 n. N% ?3 D! v0 Ifor x, w in anls.textrank(s, withWeight=True):
      ! X6 J, Y/ _" W' W$ ^- T

      ' b, G3 p/ o5 f- M# j

    • " t( S6 Q3 U; v$ x

      2 P5 B0 p' t- J2 U# \    print('%s %s' % (x, w))1 H' C0 x% I" c5 p; a# t
      : n3 d' y6 a9 A0 \2 F

      - g& y+ D' s% t4 S- V  r5 l

    吉林 1.0) l+ t+ R4 c2 g: h
    欧亚 0.9966893354178172- w3 y; b; k1 a, E1 I) ^! F
    置业 0.6434360313092776
    ; O2 [1 y9 l' Y: j实现 0.5898606692859626
    2 F4 c  v) ~, _' H2 W; g  s收入 0.43677859947991454
    # _: ?2 ?6 B$ a2 z, b( y# l增资 0.4099900531283276
    2 h& P3 X2 \# {4 w子公司 0.35678295947672795
    ; b/ K( b1 B' e! W$ ^城市 0.34971383667403655$ G7 g- l5 d7 z, v/ l6 Y* q4 }, f
    商业 0.348172207160269362 P$ k; ~! K$ v2 @2 I- Z# o1 o6 e* Y$ S
    业务 0.3092230992619838; t/ S. L, y, ~6 R
    在建 0.3077929164033088
    5 Q7 }7 Z+ p9 T9 Y( M$ c营业 0.3035777049319588
    9 q4 Q: |2 S: _6 r7 _1 y全资 0.303540981053475& R5 _; {# ~5 j0 ]: i  C. ~% ], S
    综合体 0.29580869172394825
    % H% D, K2 B; x& y; d1 h9 J注册资本 0.29000519464085045
    / i9 w- W7 \# j0 o0 |+ z8 p& w有限公司 0.2807830798576574
    ( {% k) i( w& h/ @/ r3 t零售 0.27883620861218145$ e2 v; `( D( a8 s, m* R
    百货 0.2781657628445476- j" b8 Q, k8 `* L. c! m
    开发 0.26934887792958510 o+ B$ E* ]& b8 c+ h
    经营范围 0.26427621735583164 N  z  @% ]6 y6 y9 t

    ( F# w. G. t5 h使用 jieba.analyse.TextRank() 可以新建自定义 TextRank 实例。% I& m" Y+ X  O2 \2 l2 C" K1 K5 \
    4.3 自定义语料库2 Q1 e; r" n$ |% @' j; x
    关键词提取所使用逆向文件频率(IDF)文本语料库和停止词(Stop Words)文本语料库可以切换成自定义语料库的路径。
    " K+ a8 z* Q  F8 A& t1 r$ o4 P6 m$ Q. T; k% n/ r( b2 q1 u7 V
    * g( a; m* g, F  O% c9 z) w: j; ~

    • ' C" _/ b! U1 v* J

      1 Q$ Y9 c4 O/ Cjieba.analyse.set_stop_words("stop_words.txt")
      % G) T* }3 k3 T4 e, T# N* e4 P: k

      5 V' B. y1 B6 W

    • 0 y4 |3 @$ @. J3 K: |2 [

      , }* S! k$ q6 Q% P* s3 D& s) ~+ R( Wjieba.analyse.set_idf_path("idf.txt.big");- t" ~, d$ a- H( l6 @0 q# j
      6 r' g, B2 f: w7 Q0 J

    • : J) _5 `; R) }0 g

      " F1 @0 P. V4 h( ~for x, w in anls.extract_tags(s, topK=20, withWeight=True):
      - u, Y, c' e  Q7 g: q
      5 m. ]- h- ?+ J) j/ V2 R7 h. z

    • 5 V2 s9 `* m( y  E  L8 v5 A
      ) U: i, q: f1 z, \; j; r* r! a
          print('%s %s' % (x, w))/ p8 p" W4 y; W
      1 y& e' o) v; {" s
      8 N8 W% g: _: `  V3 a

    吉林 1.01742702152340436 F2 e2 v* @" r
    欧亚 0.7300142700289363
    $ ?$ V! Y' \5 F( q1 L' a: w! v增资 0.5087135107617021+ ^6 G$ S+ ?+ W+ z& p9 C2 _  j/ A
    实现 0.5087135107617021
    4 I1 [. o  W1 @置业 0.4887134522112766% s9 l( J% z2 T
    万元 0.3392722481859574- Z4 |9 Y& U3 J5 q; K+ T
    此外 0.25435675538085106
      P8 u8 f- j" w. g/ |) f全资 0.25435675538085106
    6 V4 l7 [! H" M9 _, l+ [0 B有限公司 0.25435675538085106
    4 _5 y9 m4 k2 n) b! y: F( r4.3 0.25435675538085106
    6 T6 K" ?8 g8 R6 X+ C注册资本 0.25435675538085106
    2 f! l/ U, @- H$ ]: d7000 0.25435675538085106
    3 j# i+ @1 o$ G5 ?, ]/ I增加 0.25435675538085106% _  I: W. S( c
    主要 0.25435675538085106/ n6 b4 `3 m! A% G  B* z% @  ]
    房地产 0.254356755380851069 M, G2 u1 I. D: p
    业务 0.25435675538085106
    2 i2 ?; f& _7 J0 a目前 0.25435675538085106
    $ X. d* S/ l5 ]9 ?0 s: G城市 0.254356755380851062 @- S) G8 ]3 C
    综合体 0.25435675538085106: Y/ @4 b; U1 v3 q0 j( Q7 k" F
    2013 0.25435675538085106( z  l) h( Q" \- q3 L4 o

    / l' T9 n4 P2 n0 @& g
    - B- }) G$ s, c( E. y/ y( u" T5 词性标注
    0 _" H# s# j7 Fjieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
    0 B; a' H! B2 n, B4 F0 \# 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
    % `2 X& f, N4 z' j  q3 i% _0 K* m4 l: f6 U$ d3 F$ R
    8 G! {. F& B- ]0 }


    • + U6 B+ }6 B8 f% B8 q( _
      : |+ f1 j( D0 ]. M# ~3 W& H
      words = pseg.cut("他改变了中国")+ _$ r! E; x6 |) m/ k: p& y

      ! D& O4 y' p" J2 \2 F3 O3 H
    • 8 G' U4 J1 H9 \
      & }3 h+ B/ H% K
      for word, flag in words:: b; u( R- m/ v* e6 {
      # t% S6 X# K' k1 ^* T0 p" A
    • 9 R; ^- E1 H6 ?) v  o! z
        r& H4 p& M$ y& ^' l, T7 M
          print("{0} {1}".format(word, flag))
      ; b3 g5 P+ Y$ C8 ?; X8 R! U
      + |3 F7 n& z* r& ?6 e# [6 ^
      * u, f; |7 k9 z, q9 N' W8 }

    他 r

    改变 v

    了 ul

    中国 ns

    6 并行分词/ |" E* K0 w# l$ w  ]
    将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升。用法:
    3 g6 o1 l5 d, g9 ?+ W0 _

    • jieba.enable_parallel(4):开启并行分词模式,参数为并行进程数

    • jieba.disable_parallel() :关闭并行分词模式


      1 z4 c# K* ?) Y9 C0 K0 f

    # 可参考 test_file.py
    " ~3 O9 Z: |! f3 w/ T3 @注意:基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows
    6 ~3 p" f, D7 t. X( K4 _9 m0 ]& d- d: {- I/ j! [, X+ U$ B
      a$ M$ j) N8 g6 O3 F6 L: `6 a: E
    7 返回词语在原文的起止位置

    使用 jieba.tokenize 方法可以返回词语在原文的起止位置。

    注意:输入参数只接受 unicode

    • 0 e9 t; e% N, @2 f
      8 t) n1 k( x, }+ n
      result = jieba.tokenize(u'上海益民食品一厂有限公司')- h3 y+ l* U7 d

      4 W1 q" s# p# P- q
    • ) K' @, f+ ~) p% `
      . T. x: W" j( k, Q
      print("【普通模式】")
      7 N- Q8 r  @* D6 [5 R: d  S! L
      ' t5 @. L- a, K* _0 V7 N- \6 P

    • $ b" }4 V. E: P  {2 |

      * W6 Y: P; q& v: Y5 Wfor tk in result:
      & a, V3 l. i% Y, e+ k
      - a7 c0 ?4 y" k3 P( K
    • , Z, a( i2 T; @7 G3 L# @
      , c# n& a9 k9 X/ i' N
          print("word: {0} \t\t start: {1} \t\t end: {2}".format(tk[0],tk[1],tk[2]))
      ! m% f( `& t- p" Z5 Y, n0 H6 P8 ?1 D! c
      3 k; N/ z% \. [5 E
      ! S. g2 F  Z% X8 h/ h2 x

    【普通模式】
    , @* h! [  U0 q5 l/ I- bword: 上海 start: 0 end: 2
    8 G' _9 R# b1 E+ _5 v2 P1 ~7 Yword: 益民 start: 2 end: 4( q0 |2 D4 |2 d8 g/ L; |! F
    word: 食品 start: 4 end: 6
    ) f' r9 i3 I* t/ N! vword: 一厂 start: 6 end: 8
    $ c7 ?( P4 I) X( O' }% r+ e3 C; Qword: 有限公司 start: 8 end: 12
    # a- f+ J- l% S  Y  `/ a4 S/ d# A+ k% ?% T

    6 B3 J0 T. b/ c) P% C

    • 7 v0 A* E) j: n" [  \; b* w+ D
        [+ r4 ?( O1 k1 k) v" Y9 `7 _
      result = jieba.tokenize(u'上海益民食品一厂有限公司', mode='search')
        Q' m8 f0 H' {' A3 {+ u; Z& O: {

      1 [) y# W& D' o" H) {

    • # G  t$ V" f. Q- E+ P

      2 e/ V) p7 q* ]9 H  h4 Y( P, A* kprint("【搜索模式】")# [7 A; u+ w- m' C5 U- A% m
      ( @7 _' [6 t9 K( Z! X

    • ) S6 ~/ L4 I: A% D& ^

      5 a2 V% e- m" B5 Hfor tk in result:
      . L. B8 q6 }( h# w) c9 v+ A8 i

      % W4 x) T$ W' D- a- X% H

    • ' J% x: }: b! n6 ^/ M
      0 P. c/ G3 V0 Y# j! o% `- j
          print("word: {0} \t\t start: {1} \t\t end: {2}".format(tk[0],tk[1],tk[2]))0 w3 z7 m$ U7 Q' o
      % ]7 y" P1 N2 d6 b8 R. \! u) D
      3 w. I- w' Y1 ~- G  c$ V

    【搜索模式】* w* n  ~& N  C0 t
    word: 上海 start: 0 end: 21 [3 w. l6 {" x+ M
    word: 益民 start: 2 end: 4
    - o4 l  K! K4 p$ [  W4 S. l8 T! pword: 食品 start: 4 end: 6
    0 V$ ?. }" ?. {  w2 u# R/ D8 Sword: 一厂 start: 6 end: 8, a. ]# ]0 T: b- J, }
    word: 有限 start: 8 end: 10! x; F7 p: Q7 u0 M( r
    word: 公司 start: 10 end: 12
    ) a) _6 w: J  x/ k2 {" \word: 有限公司 start: 8 end: 12


    + r9 u8 j7 n; a- U- l# _. B9 z6 K2 L0 B+ ^
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-18 22:06 , Processed in 0.403954 second(s), 50 queries .

    回顶部