Python中结巴分词使用

概念介绍

分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。英文是一个单词,而中文是一个字。

数据来源可以是,一篇文章、爬虫出来的一些数据、或者表格等内容

安装方式 pip install jieba

jieba分词算法使用了基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能生成词情况所构成的有向无环图(DAG), 再采用了动态规划查找最大概率路径,找出基于词频的最大切分组合,对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。

支持四种分词模式:
  • 精确模式,试图将句子最精确地切开,适合文本分析;

  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;

  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

  • paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,请升级jieba,pip install jieba --upgradePaddlePaddle官网

主要功能

jieba分词的主要功能有如下几种:

1、jieba.cut:该方法接受三个输入参数:需要分词的字符串; cut_all 参数用来控制是否采用全模式;HMM参数用来控制是否适用HMM模型

jieba.cut(text, cut_all=False)

2、jieba.cut_for_search:该方法接受两个参数:需要分词的字符串;是否使用HMM模型,该方法适用于搜索引擎构建倒排索引的分词,粒度比较细。

jieba.cut_for_search(text)

3、待分词的字符串可以是unicode或者UTF-8字符串,GBK字符串。注意不建议直接输入GBK字符串,可能无法预料的误解码成UTF-8

4、jieba.cut 以及jieba.cut_for_search返回的结构都是可以得到的generator(生成器), 可以使用for循环来获取分词后得到的每一个词语或者使用

5、jieb.lcut 以及 jieba.lcut_for_search 直接返回list

6、jieba.Tokenizer(dictionary=DEFUALT_DICT) 新建自定义分词器,可用于同时使用不同字典,jieba.dt为默认分词器,所有全局分词相关函数都是该分词器的映射。

算法
  • 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)

  • 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合

  • 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

代码演示:

基本使用

使用文本:

text = '将T5表中的相对方银行账号信息与供应商银行账号信息表中的数据进行校验'

代码:

def use_jie(text):
    # 全模式
    segs = jieba.cut(text, cut_all=False)
    print("Full Mode:", "/ ".join(segs))
    
    # 精确模式
    segs = jieba.cut(text, cut_all=True)
    print("Default Mode:", "/ ".join(segs))

    # 搜索引擎模式
    segs = jieba.cut_for_search(text)
    print("search Mode:", "/ ".join(segs))

输出结果:

Full Mode: 将/ T5/ 表中/ 的/ 相/ 对方/ 银行账号/ 信息/ 与/ 供应商/ 银行账号/ 信息/ 表中/ 的/ 数据/ 进行/ 校验
Default Mode: 将/ T5/ 表/ 中/ 的/ 相对/ 对方/ 银行/ 银行账/ 银行账号/ 账号/ 信息/ 与/ 供应/ 供应商/ 商银/ 银行/ 银行账/ 银行账号/ 账号/ 信息/ 表/ 中/ 的/ 数据/ 进行/ 校验
Search Mode: 将/ T5/ 表中/ 的/ 相/ 对方/ 银行/ 账号/ 银行账/ 银行账号/ 信息/ 与/ 供应/ 供应商/ 银行/ 账号/ 银行账/ 银行账号/ 信息/ 表中/ 的/ 数据/ 进行/ 校验

对比结果可以看出,全模式只匹配一次,精确模式会重复匹配

paddle模式
jieba.enable_paddle()  # 启动paddle模式。 0.40版之后开始支持,早期版本不支持
seg_list = jieba.cut(text, use_paddle=True)  # 使用paddle模式
print("Paddle Mode: " + '/'.join(list(seg_list)))
Paddle Mode: 将/T/5/表/中/的/相/对方/银行/账号/信息/与/供应商/银行/账号/信息/表/中/的/数据/进行/校验
调整词典
  • 使用 add_word(word, freq=None, tag=None)del_word(word) 可在程序中动态修改词典。
  • 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
# 自定义添加词典
def use_dict_jie(text):
    print('/'.join(jieba.cut(text, HMM=False)))
    jieba.suggest_freq('相对方', True)
    print('/'.join(jieba.cut(text, HMM=False)))
    jieba.add_word("相对方", freq=None, tag=None)
    print('/'.join(jieba.cut(text, HMM=False)))
    jieba.del_word("银行账号")
    print('/'.join(jieba.cut(text, HMM=False)))
将/T5/表/中/的/相/对方/银行账号/信息/与/供应商/银行账号/信息/表/中/的/数据/进行/校验
将/T5/表/中/的/相对方/银行账号/信息/与/供应商/银行账号/信息/表/中/的/数据/进行/校验
将/T5/表/中/的/相对方/银行账号/信息/与/供应商/银行账号/信息/表/中/的/数据/进行/校验
将/T5/表/中/的/相对方/银行/账号/信息/与/供应商/银行/账号/信息/表/中/的/数据/进行/校验

同样也可以引入文本的形式来调整分词

基于 TF-IDF 算法的关键词抽取

tf-idf(英语:term frequency–inverse document frequency)是一种用于信息检索文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。tf-idf加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了tf-idf以外,互联网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜索结果中出现的顺序。

即按照一定的标准来判断一个词在一个文本中出现的频率。可以作为本文关键内容的判断

参考维基百科https://zh.wikipedia.org/wiki/Tf-idf

import jieba.analyse
  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 为待提取的文本
    • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight 为是否一并返回关键词权重值,默认值为 False
    • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件
基本思想:
  1. 将待抽取关键词的文本进行分词
  2. 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
  3. 计算图中节点的PageRank,注意是无向带权图
用法示例
 print('-' * 40)
    print('TF-IDF')
    print('-' * 40)

    # 关键词抽取
    for x, w in jieba.analyse.extract_tags(text, withWeight=True):
        print('%s %s' % (x, w))

----------------------------------------
TF-IDF
----------------------------------------
表中 1.9924612504833332
银行账号 1.9330154265
T5 0.9962306252416666
校验 0.9585651982666666
信息 0.875643448795
供应商 0.6491008593725
对方 0.5086497757658334
数据 0.3984463898658333
进行 0.3105937329183333
print('-' * 40)
print(' 关键字2统计')
print('-' * 40)
tags = jieba.analyse.extract_tags(sentence=text, topK=20)
# 全切词,分别统计出这20个关键词出现次数,即词频,存为字典words_freq中
words = [word for word in jieba.cut(text, cut_all=True)]
words_freq = {}
for tag in tags:
    freq = words.count(tag)
    words_freq[tag] = freq

# 将该字典按词频排序
usedata = sorted(words_freq.items(), key=lambda d: d[1])
print(usedata)
for word in usedata:
    print('%s %s' % (word[0], word[1]))
----------------------------------------
 关键字2统计
----------------------------------------
[('Now', 1), ('suffer', 2), ('he', 2), ('heart', 2), ('insight', 2), ('was', 2), ('true', 2), ('upon', 2), ('any', 2), ('They', 2), ('yourself', 2), ('personal', 2), ('had', 3), ('who', 3), ('alone', 3), ('trying', 3), ('man', 4), ('way', 4), ('God', 6), ('his', 7)]
Now 1
suffer 2
he 2
heart 2
insight 2
was 2
true 2
upon 2
any 2
They 2
yourself 2
personal 2
had 3
who 3
alone 3
trying 3
man 4
way 4
God 6
his 7

可以通过此方法提取关键词

基于 TextRank 算法的关键词抽取
  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
  • jieba.analyse.TextRank() 新建自定义 TextRank 实例

没有输出

基本思想:
  1. 将待抽取关键词的文本进行分词

  2. 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图

  3. 计算图中节点的PageRank,注意是无向带权图

用法示例
 print('-' * 40)
    print(' TextRank')
    print('-' * 40)

    for x, w in jieba.analyse.textrank(text, withWeight=True):
        print('%s %s' % (x, w))
词性标注
  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
  • 除了jieba默认分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载方式,通过enable_paddle()安装paddlepaddle-tiny,并且import相关代码;
用法示例
 print('=' * 40)
    print('4. 词性标注')
    print('-' * 40)

    words = jieba.posseg.cut(text)
    for word, flag in words:
        print('%s %s' % (word, flag))
4. 词性标注
----------------------------------------
神爱世人 nr
, x
甚至 d
将 d
祂 yg
独一 b
的 uj
儿子 n
赐给 v
他们 r
, x
叫 v
一切 r
信 n
祂 y
的 uj
人 n
不致 c
灭亡 v
, x
反 zg
得 ud
永生 b

paddle模式词性标注对应表如下:

paddle模式词性和专名类别标签集合如下表,其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母)。

标签 含义 标签 含义 标签 含义 标签 含义
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 时间
Tokenize:返回词语在原文的起止位置
 print('=' * 40)
    print('6. Tokenize: 返回词语在原文的起止位置')
    print('-' * 40)
    print(' 默认模式')
    print('-' * 40)

    result = jieba.tokenize(text)
    for tk in result:
        print("word %s\t\t start: %d \t\t end:%d" % (tk[0], tk[1], tk[2]))

    print('-' * 40)
    print(' 搜索模式')
    print('-' * 40)

    result = jieba.tokenize(text, mode='search')
    for tk in result:
        print("word %s\t\t start: %d \t\t end:%d" % (tk[0], tk[1], tk[2]))


========================================
6. Tokenize: 返回词语在原文的起止位置
----------------------------------------
 默认模式
----------------------------------------
word 神爱世人        start: 0        end:4
word ,       start: 4        end:5
word 甚至      start: 5        end:7
word 将       start: 7        end:8
word 祂       start: 8        end:9
word 独一      start: 9        end:11
word 的       start: 11       end:12
word 儿子      start: 12       end:14
word 赐给      start: 14       end:16
word 他们      start: 16       end:18
word ,       start: 18       end:19
word 叫       start: 19       end:20
word 一切      start: 20       end:22
word 信       start: 22       end:23
word 祂       start: 23       end:24
word 的       start: 24       end:25
word 人       start: 25       end:26
word 不致      start: 26       end:28
word 灭亡      start: 28       end:30
word ,       start: 30       end:31
word 反       start: 31       end:32
word 得       start: 32       end:33
word 永生      start: 33       end:35
----------------------------------------
 搜索模式
----------------------------------------
word 世人      start: 2        end:4
word 神爱世人        start: 0        end:4
word ,       start: 4        end:5
word 甚至      start: 5        end:7
word 将       start: 7        end:8
word 祂       start: 8        end:9
word 独一      start: 9        end:11
word 的       start: 11       end:12
word 儿子      start: 12       end:14
word 赐给      start: 14       end:16
word 他们      start: 16       end:18
word ,       start: 18       end:19
word 叫       start: 19       end:20
word 一切      start: 20       end:22
word 信       start: 22       end:23
word 祂       start: 23       end:24
word 的       start: 24       end:25
word 人       start: 25       end:26
word 不致      start: 26       end:28
word 灭亡      start: 28       end:30
word ,       start: 30       end:31
word 反       start: 31       end:32
word 得       start: 32       end:33
word 永生      start: 33       end:35

其他:

使用的文本

s_text = '将T5表中的相对方银行账号信息与供应商银行账号信息表中的数据进行校验'
b_text = '神爱世人,甚至将祂独一的儿子赐给他们,叫一切信祂的人不致灭亡,反得永生'
b_e_text = 'God so loved the world that he gave his one and only Son. Anyone who believes in him will not die but will have eternal life.'

参考内容:https://github.com/fxsjy/jieba/

2021/03/16于成都

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容