NLP工具之结巴--1、jieba切词主要使用介绍和代码实现

1、结巴介绍

        支持三种分词模式:

  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

        同时支持繁体分词、支持自定义词典、MIT 授权协议,这里介绍三个使用该系统的案例

2、安装和导入

        pip install jieba 安装

        import jieba导入

3、算法

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

4、库函数功能实现

        1、切词功能

  • jieba.cut (|--jieba.lcut直接返回 list--|)方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
  • jieba.cut_for_search (|--jieba.lcut_for_search直接返回 list--|)方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  •     ----待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  •     ----jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)
  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

        代码示例:

import jieba


seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("全模式: " + "/ ".join(seg_list))  # 全模式
# 全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("精确模式: " + "/ ".join(seg_list))  # 精确模式
# 精确模式: 我/ 来到/ 北京/ 清华大学

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print("  ".join(seg_list))
# 他  来到  了  网易  杭研  大厦

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print("  ".join(seg_list))
# 小明  硕士  毕业  于  中国  科学  学院  科学院  中国科学院  计算  计算所  ,  后  在  日本  京都  大学  日本京都大学  深造

seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 精确模式
print("  ".join(seg_list))
# 小明  硕士  毕业  于  中国科学院  计算所  ,  后  在  日本京都大学  深造

seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", cut_all=True)  # 全模式
print("  ".join(seg_list))
# 小  明  硕士  毕业  于  中国  中国科学院  科学  科学院  学院  计算  计算所      后  在  日本  日本京都大学  京都  京都大学  大学  深造

         2、添加自定义词典

        jieba允许开发者自己导入自己的字典,以下是jieba中的词性说明

Ag形语素形容词性语素。形容词代码为 a,语素代码g前面置以A。

a

形容词

取英语形容词 adjective的第1个字母。

ad

副形词

直接作状语的形容词。形容词代码 a和副词代码d并在一起。

an

名形词

具有名词功能的形容词。形容词代码 a和名词代码n并在一起。

b

区别词

取汉字“别”的声母。

c

连词

取英语连词 conjunction的第1个字母。

dg

副语素

副词性语素。副词代码为 d,语素代码g前面置以D。

d

副词

取 adverb的第2个字母,因其第1个字母已用于形容词。

e

叹词

取英语叹词 exclamation的第1个字母。

f

方位词

取汉字“方”

g

语素

绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母

h

前接成分

取英语 head的第1个字母。

i

成语

取英语成语 idiom的第1个字母。

j

简称略语

取汉字“简”的声母。

k

后接成分

 

l

习用语

习用语尚未成为成语,有点“临时性”,取“临”的声母。

m

数词

取英语 numeral的第3个字母,n,u已有他用

Ng

名语素

名词性语素。名词代码为 n,语素代码g前面置以N。

n

名词

取英语名词 noun的第1个字母。

nr

人名

名词代码 n和“人(ren)”的声母并在一起。

ns

地名

名词代码 n和处所词代码s并在一起。

nt

机构团体

“团”的声母为 t,名词代码n和t并在一起。

nz

其他专名

“专”的声母的第 1个字母为z,名词代码n和z并在一起。

o

拟声词

取英语拟声词 onomatopoeia的第1个字母。

p

介词

取英语介词 prepositional的第1个字母。

q

量词

取英语 quantity的第1个字母。

r

代词

取英语代词 pronoun的第2个字母,因p已用于介词。

s

处所词

取英语 space的第1个字母。

tg

时语素

时间词性语素。时间词代码为 t,在语素的代码g前面置以T。

t

时间词

取英语 time的第1个字母。

u

助词

取英语助词 auxiliary

vg

动语素

动词性语素。动词代码为 v。在语素的代码g前面置以V。

v

动词

取英语动词 verb的第一个字母。

vd

副动词

直接作状语的动词。动词和副词的代码并在一起。

vn

名动词

指具有名词功能的动词。动词和名词的代码并在一起。

w

标点符号

 

x

非语素字

非语素字只是一个符号,字母 x通常用于代表未知数、符号。

y

语气词

取汉字“语”的声母。

z

状态词

取汉字“状”的声母的前一个字母。

 

  • 词典格式:一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
  • 具体形式可参考jieba安装包下的dict.txt文件----我的路径是E:\python3.6\Lib\site-packages\jieba\dict.txt
  • 词频省略时使用自动计算的能保证分出该词的词频
  • 这里"***.txt"文件保存编码为utf8,否则读取会出错
  • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
  • 更改分词器(默认为 jieba.dt)的 tmp_dir 和 cache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统。
  • 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
  • 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

 

jieba.load_userdict("./userdict.txt")

jieba.add_word('石墨烯')
jieba.add_word('凱特琳')
jieba.del_word('自定义词')

test_sent = (
"李小福是创新办主任也是云计算方面的专家; 什么是八一双鹿\n"
"例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类\n"
"「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
)
words = jieba.cut(test_sent)
print('/'.join(words))

# 3、动态修改字典

print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))  # 如果/放到/post/中将/出错/。

jieba.suggest_freq(('中', '将'), True)
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))  # 如果/放到/post/中/将/出错/。

print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))  # 「/台中/」/正确/应该/不会/被/切开

jieba.suggest_freq('台中', True)
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))  # 「/台中/」/正确/应该/不会/被/切开

         3、基于tf_idf的关键词抽取

                这里不解释tf_idf原理,自己看找我的博客,以下是tf_idf的API,但是还是建议自己实现和完成

  •                 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 频率文件

                逆文档频率语料库加载加载

  • 用法: jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径
  • 我的是E:\python3.6\Lib\site-packages\jieba\词语的idf值.txt

                停用词语料库加载

  • 用法: jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径
  • 我的是E:\python3.6\Lib\site-packages\jieba\停用词表.txt

 

with open('./news.txt', 'r', encoding='utf8') as f:
	# 停用词加载
	jieba.analyse.set_stop_words("E:/python3.6/Lib/site-packages/jieba/停用词表.txt")
	# 加载逆文档频率
	jieba.analyse.set_idf_path("E:/python3.6/Lib/site-packages/jieba/词语的idf值.txt");
	text_gen = f.readlines()
	for i in text_gen:
		# print(list(jieba.cut(i)))
		tags = jieba.analyse.extract_tags(i, topK=5, withWeight=True)
		print([i for i in tags])
""" 1、没有加停用词和逆文档频率文件
[('国奥队', 0.3637303418553846), ('训练', 0.33246663343), ('沈阳', 0.228898753096), ('冯萧霆', 0.18391950004461538), ('大雨', 0.16098554931653847)]
[('瑞典队', 0.30074073179658445), ('瑞典', 0.2956988517856736), ('商瑞华', 0.2722148198003795), ('美国队', 0.18997166285996203), ('首战', 0.12821579114686907)]
[('夏煊泽', 0.31305446816104743), ('黄旭', 0.22750699921440265), ('高尔夫', 0.11777941569283142), ('冠军', 0.11246872005427169), ('张军', 0.10991123519705401)]
[('辽足', 0.5465036572754285), ('俱乐部', 0.23442552764586666), ('球员', 0.21276443697030475), ('冲超', 0.18216788575847617), ('合同', 0.148020934632)]
[('谢亚龙', 0.6090852230286218), ('带走', 0.24736276884148412), ('总局', 0.2424782381014841), ('立案侦查', 0.22406656837738514), ('警方', 0.18045108875339222)]
[('北京队', 0.5009253207927928), ('比赛', 0.34885009806738737), ('鹿队', 0.3231018244027027), ('一双', 0.2041001068765766), ('阿的江', 0.17950101355705705)]
[('姚明', 0.42573157703137254), ('罗萨斯', 0.3090519244522876), ('我们', 0.14407559990480392), ('球队', 0.11284731363281046), ('防守', 0.10211284675202614)]
[('姚明', 0.3431543314864942), ('胜利', 0.1764550853764368), ('球队', 0.17364866796083334), ('队友', 0.1715419643687931), ('麦蒂', 0.14708500008333336)]
[('活塞', 0.23378773478520407), ('火箭', 0.23030406687882654), ('姚明', 0.18001277778813776), ('交易', 0.11903735440535715), ('普林斯', 0.0957733415119898)]
[('湖人', 0.5715426694613546), ('布雷克', 0.5484391083661354), ('布朗', 0.36476601849179285), ('比赛', 0.24502079772860558), ('后卫', 0.16158529938326693)]
[('希伯杜', 0.3516108089088235), ('防守', 0.2660308375908049), ('公牛', 0.1549358723513932), ('对手', 0.11124624027972137), ('命中率', 0.10681638496746129)]
[('希伯特', 0.4612772026842443), ('步行者', 0.21414485532106112), ('奥布莱恩', 0.178786850829582), ('中锋', 0.15399233123151126), ('姚明', 0.12217538022524115)]


    2、添加停用词和逆文档频率
[('沈阳', 0.5226127870120219), ('国奥队', 0.5226127870120219), ('训练', 0.4723569655289617), ('球员', 0.2613063935060109), ('冯萧霆', 0.2613063935060109)]
[('瑞典队', 0.4053462037258312), ('瑞典', 0.39855062631982097), ('商瑞华', 0.36689823538312016), ('美国队', 0.2560487629851662), ('战术', 0.21402397064015344)]
[('夏煊泽', 0.36226568190606057), ('黄旭', 0.2632704100757576), ('冠军', 0.20377444607215905), ('高尔夫', 0.18113284095303028), ('活动', 0.1584912358339015)]
[('辽足', 0.7882264287626373), ('俱乐部', 0.5254842858417582), ('球员', 0.42695598224642856), ('合同', 0.39411321438131863), ('工资', 0.295584910785989)]
[('谢亚龙', 0.9452606862758139), ('总局', 0.44482855824744183), ('警方', 0.3892249884665116), ('带走', 0.3255984352657675), ('立案侦查', 0.29493413418976744)]
[('比赛', 0.9154551691409909), ('北京队', 0.6462036488054054), ('一双', 0.5385030406711712), ('鹿队', 0.484652736604054), ('阿的江', 0.2692515203355856)]
[('姚明', 0.74717296893125), ('罗萨斯', 0.4925515045958333), ('表现', 0.31132207038802084), ('火箭', 0.24905765631041665), ('球队', 0.24905765631041665)]
[('姚明', 0.6202945402448113), ('胜利', 0.563904127495283), ('球队', 0.39473288924669814), ('队友', 0.3383424764971698), ('麦蒂', 0.2819520637476415)]
[('火箭', 0.5197725001260869), ('活塞', 0.41581800010086956), ('交易', 0.3950271000958261), ('姚明', 0.2702817000655652), ('合同', 0.20790900005043478)]
[('湖人', 0.74717296893125), ('布朗', 0.74717296893125), ('布雷克', 0.7169698760411458), ('比赛', 0.5603797266984375), ('球队', 0.24905765631041665)]
[('防守', 0.6046089311811493), ('希伯杜', 0.5221622587473562), ('公牛', 0.274822241445977), ('对手', 0.274822241445977), ('说话', 0.24734001730137928)]
[('希伯特', 0.5977383751450001), ('步行者', 0.27396342194145834), ('奥布莱恩', 0.23167796086666667), ('中锋', 0.224151890679375), ('球队', 0.19924612504833333)]
"""

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值