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 --upgrade 。PaddlePaddle官网
主要功能 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/表/中/的/相对方/银行/账号/信息/与/供应商/银行/账号/信息/表/中/的/数据/进行/校验

【Python中结巴分词使用】同样也可以引入文本的形式来调整分词
基于 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: 0end:4 word ,start: 4end:5 word 甚至start: 5end:7 word 将start: 7end:8 word 祂start: 8end:9 word 独一start: 9end:11 word 的start: 11end:12 word 儿子start: 12end:14 word 赐给start: 14end:16 word 他们start: 16end:18 word ,start: 18end:19 word 叫start: 19end:20 word 一切start: 20end:22 word 信start: 22end:23 word 祂start: 23end:24 word 的start: 24end:25 word 人start: 25end:26 word 不致start: 26end:28 word 灭亡start: 28end:30 word ,start: 30end:31 word 反start: 31end:32 word 得start: 32end:33 word 永生start: 33end:35 ---------------------------------------- 搜索模式 ---------------------------------------- word 世人start: 2end:4 word 神爱世人start: 0end:4 word ,start: 4end:5 word 甚至start: 5end:7 word 将start: 7end:8 word 祂start: 8end:9 word 独一start: 9end:11 word 的start: 11end:12 word 儿子start: 12end:14 word 赐给start: 14end:16 word 他们start: 16end:18 word ,start: 18end:19 word 叫start: 19end:20 word 一切start: 20end:22 word 信start: 22end:23 word 祂start: 23end:24 word 的start: 24end:25 word 人start: 25end:26 word 不致start: 26end:28 word 灭亡start: 28end:30 word ,start: 30end:31 word 反start: 31end:32 word 得start: 32end:33 word 永生start: 33end: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于成都

    推荐阅读