当前位置:   article > 正文

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

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 为默认分词器,所有全局分词相关函数都是该分词器的映射。

        代码示例:

  1. import jieba
  2. seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
  3. print("全模式: " + "/ ".join(seg_list)) # 全模式
  4. # 全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
  5. seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
  6. print("精确模式: " + "/ ".join(seg_list)) # 精确模式
  7. # 精确模式: 我/ 来到/ 北京/ 清华大学
  8. seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式
  9. print(" ".join(seg_list))
  10. # 他 来到 了 网易 杭研 大厦
  11. seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
  12. print(" ".join(seg_list))
  13. # 小明 硕士 毕业 于 中国 科学 学院 科学院 中国科学院 计算 计算所 , 后 在 日本 京都 大学 日本京都大学 深造
  14. seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 精确模式
  15. print(" ".join(seg_list))
  16. # 小明 硕士 毕业 于 中国科学院 计算所 , 后 在 日本京都大学 深造
  17. seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", cut_all=True) # 全模式
  18. print(" ".join(seg_list))
  19. # 小 明 硕士 毕业 于 中国 中国科学院 科学 科学院 学院 计算 计算所 后 在 日本 日本京都大学 京都 京都大学 大学 深造

         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 新词发现功能时可能无效。

 

  1. jieba.load_userdict("./userdict.txt")
  2. jieba.add_word('石墨烯')
  3. jieba.add_word('凱特琳')
  4. jieba.del_word('自定义词')
  5. test_sent = (
  6. "李小福是创新办主任也是云计算方面的专家; 什么是八一双鹿\n"
  7. "例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类\n"
  8. "「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
  9. )
  10. words = jieba.cut(test_sent)
  11. print('/'.join(words))
  12. # 3、动态修改字典
  13. print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False))) # 如果/放到/post/中将/出错/
  14. jieba.suggest_freq(('中', '将'), True)
  15. print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False))) # 如果/放到/post///出错/
  16. print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False))) # 「/台中//正确/应该/不会//切开
  17. jieba.suggest_freq('台中', True)
  18. 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

 

  1. with open('./news.txt', 'r', encoding='utf8') as f:
  2. # 停用词加载
  3. jieba.analyse.set_stop_words("E:/python3.6/Lib/site-packages/jieba/停用词表.txt")
  4. # 加载逆文档频率
  5. jieba.analyse.set_idf_path("E:/python3.6/Lib/site-packages/jieba/词语的idf值.txt");
  6. text_gen = f.readlines()
  7. for i in text_gen:
  8. # print(list(jieba.cut(i)))
  9. tags = jieba.analyse.extract_tags(i, topK=5, withWeight=True)
  10. print([i for i in tags])
  11. """ 1、没有加停用词和逆文档频率文件
  12. [('国奥队', 0.3637303418553846), ('训练', 0.33246663343), ('沈阳', 0.228898753096), ('冯萧霆', 0.18391950004461538), ('大雨', 0.16098554931653847)]
  13. [('瑞典队', 0.30074073179658445), ('瑞典', 0.2956988517856736), ('商瑞华', 0.2722148198003795), ('美国队', 0.18997166285996203), ('首战', 0.12821579114686907)]
  14. [('夏煊泽', 0.31305446816104743), ('黄旭', 0.22750699921440265), ('高尔夫', 0.11777941569283142), ('冠军', 0.11246872005427169), ('张军', 0.10991123519705401)]
  15. [('辽足', 0.5465036572754285), ('俱乐部', 0.23442552764586666), ('球员', 0.21276443697030475), ('冲超', 0.18216788575847617), ('合同', 0.148020934632)]
  16. [('谢亚龙', 0.6090852230286218), ('带走', 0.24736276884148412), ('总局', 0.2424782381014841), ('立案侦查', 0.22406656837738514), ('警方', 0.18045108875339222)]
  17. [('北京队', 0.5009253207927928), ('比赛', 0.34885009806738737), ('鹿队', 0.3231018244027027), ('一双', 0.2041001068765766), ('阿的江', 0.17950101355705705)]
  18. [('姚明', 0.42573157703137254), ('罗萨斯', 0.3090519244522876), ('我们', 0.14407559990480392), ('球队', 0.11284731363281046), ('防守', 0.10211284675202614)]
  19. [('姚明', 0.3431543314864942), ('胜利', 0.1764550853764368), ('球队', 0.17364866796083334), ('队友', 0.1715419643687931), ('麦蒂', 0.14708500008333336)]
  20. [('活塞', 0.23378773478520407), ('火箭', 0.23030406687882654), ('姚明', 0.18001277778813776), ('交易', 0.11903735440535715), ('普林斯', 0.0957733415119898)]
  21. [('湖人', 0.5715426694613546), ('布雷克', 0.5484391083661354), ('布朗', 0.36476601849179285), ('比赛', 0.24502079772860558), ('后卫', 0.16158529938326693)]
  22. [('希伯杜', 0.3516108089088235), ('防守', 0.2660308375908049), ('公牛', 0.1549358723513932), ('对手', 0.11124624027972137), ('命中率', 0.10681638496746129)]
  23. [('希伯特', 0.4612772026842443), ('步行者', 0.21414485532106112), ('奥布莱恩', 0.178786850829582), ('中锋', 0.15399233123151126), ('姚明', 0.12217538022524115)]
  24. 2、添加停用词和逆文档频率
  25. [('沈阳', 0.5226127870120219), ('国奥队', 0.5226127870120219), ('训练', 0.4723569655289617), ('球员', 0.2613063935060109), ('冯萧霆', 0.2613063935060109)]
  26. [('瑞典队', 0.4053462037258312), ('瑞典', 0.39855062631982097), ('商瑞华', 0.36689823538312016), ('美国队', 0.2560487629851662), ('战术', 0.21402397064015344)]
  27. [('夏煊泽', 0.36226568190606057), ('黄旭', 0.2632704100757576), ('冠军', 0.20377444607215905), ('高尔夫', 0.18113284095303028), ('活动', 0.1584912358339015)]
  28. [('辽足', 0.7882264287626373), ('俱乐部', 0.5254842858417582), ('球员', 0.42695598224642856), ('合同', 0.39411321438131863), ('工资', 0.295584910785989)]
  29. [('谢亚龙', 0.9452606862758139), ('总局', 0.44482855824744183), ('警方', 0.3892249884665116), ('带走', 0.3255984352657675), ('立案侦查', 0.29493413418976744)]
  30. [('比赛', 0.9154551691409909), ('北京队', 0.6462036488054054), ('一双', 0.5385030406711712), ('鹿队', 0.484652736604054), ('阿的江', 0.2692515203355856)]
  31. [('姚明', 0.74717296893125), ('罗萨斯', 0.4925515045958333), ('表现', 0.31132207038802084), ('火箭', 0.24905765631041665), ('球队', 0.24905765631041665)]
  32. [('姚明', 0.6202945402448113), ('胜利', 0.563904127495283), ('球队', 0.39473288924669814), ('队友', 0.3383424764971698), ('麦蒂', 0.2819520637476415)]
  33. [('火箭', 0.5197725001260869), ('活塞', 0.41581800010086956), ('交易', 0.3950271000958261), ('姚明', 0.2702817000655652), ('合同', 0.20790900005043478)]
  34. [('湖人', 0.74717296893125), ('布朗', 0.74717296893125), ('布雷克', 0.7169698760411458), ('比赛', 0.5603797266984375), ('球队', 0.24905765631041665)]
  35. [('防守', 0.6046089311811493), ('希伯杜', 0.5221622587473562), ('公牛', 0.274822241445977), ('对手', 0.274822241445977), ('说话', 0.24734001730137928)]
  36. [('希伯特', 0.5977383751450001), ('步行者', 0.27396342194145834), ('奥布莱恩', 0.23167796086666667), ('中锋', 0.224151890679375), ('球队', 0.19924612504833333)]
  37. """

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/344089
推荐阅读
相关标签
  

闽ICP备14008679号