赞
踩
相对于英语使用空格分隔开每个单词,中文是没有固定的分隔符来分开每个词语的,而大部分情况下词语却是进行NLP的基础,故在此使用jieba中文分词来对语句进行分词。
jieba分词github地址:https://github.com/fxsjy/jieba
jieba分词github上面的说明已经非常详细了,只要稍微有点python基础应该都可以按图索骥的照搬,建议大家照着api把jiaba分词的功能都试一遍,这样比看文字去猜要印象深刻,这里就不再copy过来水字数了<(* ̄▽ ̄*)/ 这边就将一些关键点通过脚本简单的描述一下
1.cut与cut_for_search区别:
cut_for_search适用于搜索引擎构建倒排索引,分词效果接近cut的全模式;两者返回的都是generator类型结果
2.cut的全模式与精确模式:
全模式会匹配所有可能成词的字符串并将其列出;精确模式是将原文进行划分,如果导入专业词典,可以提高分词的准确率;默认情况下,cut使用精确模式
-
- import jieba
-
- ori = '这种是四轴无人机植保机,带有四个喷嘴,主要是喷洒农药,因为螺旋桨产生的风是下压的,能让农药打到植被的根底部,让植被更容易吸收'
-
- strs = jieba.cut(ori, cut_all=True)
- print('全模式Cut:', ','.join(strs))
- strs = jieba.cut(ori, cut_all=False)
- print('精确模式Cut:', ','.join(strs))
- strs = jieba.cut_for_search(ori)
- print('Cut_for_search:', ','.join(strs))
-
- **********************************************
- 输出结果:
- 全模式Cut: 这种,是,四,轴,无人,无人机,人机,植保,机,,,带有,四个,喷嘴,,,主要,要是,喷洒,农药,,,因为,螺旋,螺旋桨,产生,的,风,是,下压,的,,,能,让,农药,打到,植被,的,根底,底部,,,让,植被,更,容易,吸收
-
- 精确模式Cut: 这种,是,四轴,无人机,植保,机,,,带有,四个,喷嘴,,,主要,是,喷洒,农药,,,因为,螺旋桨,产生,的,风,是,下压,的,,,能,让,农药,打,到,植被,的,根,底部,,,让,植被,更,容易,吸收
-
- Cut_for_search: 这种,是,四轴,无人,人机,无人机,植保,机,,,带有,四个,喷嘴,,,主要,是,喷洒,农药,,,因为,螺旋,螺旋桨,产生,的,风,是,下压,的,,,能,让,农药,打,到,植被,的,根,底部,,,让,植被,更,容易,吸收
3.lcut和lcut_for_search与cut和cut_for_search类似只是返回结果为list
- import jieba
-
- ori = '这种是四轴无人机植保机,带有四个喷嘴,主要是喷洒农药,因为螺旋桨产生的风是下压的,能让农药打到植被的根底部,让植被更容易吸收'
- strs = jieba.cut(ori, cut_all=False)
- print('精确模式Cut类型:', type(strs))
- str_list = jieba.lcut(ori, cut_all=False)
- print('精确模式Lcut类型:', type(str_list))
-
- ***********************************
- 输出结果:
- 精确模式Cut类型: <class 'generator'>
- 精确模式Lcut类型: <class 'list'>
4.添加用户词典(通常用于添加术语库):
大量的可以通过jieba.load_userdict(file_name)加载,少量的可以用jiaba.add_word(word,freq=None,tag=None)和jieba.del_word(word)来动态调整,使用jiaba.suggest_freq(segment,tune=True)可以调节词语的词频,进而影响到改词能否分出来;注意如果添加新词后分词时需要将HMM参数调为False,否则jieba将可能会忽略添加的新词而通过HMM算法进行分词
- import jieba
-
- ori = '这种是四轴无人机植保机,带有四个喷嘴,主要是喷洒农药,因为螺旋桨产生的风是下压的,能让农药打到植被的根底部,让植被更容易吸收'
- strs = jieba.cut(ori, HMM=True)
- print('精确模式Cut:', ','.join(strs))
- strs = jieba.cut(ori, HMM=False)
- print('精确模式Cut:', ','.join(strs))
- jieba.suggest_freq(('植保机'), True)
- strs = jieba.cut(ori, HMM=False)
- print('精确模式Cut:', ','.join(strs))
-
- ***************************************
- 输出结果:
- 开启HMM模式Cut:
- 这种,是,四轴,无人机,植保,机,,,带有,四个,喷嘴,,,主要,是,喷洒,农药,,,因为,螺旋桨,产生,的,风,是,下压,的,,,能,让,农药,打,到,植被,的,根,底部,,,让,植被,更,容易,吸收
-
- 关闭HMM模式Cut:
- 这种,是,四,轴,无人机,植保,机,,,带有,四个,喷嘴,,,主要,是,喷洒,农药,,,因为,螺旋桨,产生,的,风,是,下压,的,,,能,让,农药,打,到,植被,的,根,底部,,,让,植被,更,容易,吸收
-
- 关闭HMM且加入调整新词词频Cut:
- 这种,是,四,轴,无人机,植保机,,,带有,四个,喷嘴,,,主要,是,喷洒,农药,,,因为,螺旋桨,产生,的,风,是,下压,的,,,能,让,农药,打,到,植被,的,根,底部,,,让,植被,更,容易,吸收
5.提取关键词
1.1)基于TF-IDF算法的关键词抽取:
- impory jieba
-
-
- ori = '这种是四轴无人机植保机,带有四个喷嘴,主要是喷洒农药,因为螺旋桨产生的风是下压的,能让农药打到植被的根底部,让植被更容易吸收'
- strs = jieba.analyse.extract_tags(sentence=ori, # 待提取原文
- topK=20, # 返回几个TF/IDF权重最大的关键词,默认为20
- withWeight=True, # 是否一并返回关键词的权重值,默认为False
- allowPOS=()) # 仅包括指定词性的词,默认为空
- print('关键词及权重为:')
- for (k, v) in strs:
- print(k, v)
-
- ************************************
- 输出结果为:
- 关键词及权重为:
- 农药 0.8217097884639999
- 植被 0.719015454252
- 四轴 0.597738375145
- 植保 0.591061805515
- 喷嘴 0.5302420393
- 下压 0.506973876815
- 喷洒 0.503601812775
- 无人机 0.48260912049650007
- 螺旋桨 0.443186252478
- 底部 0.3419243009845
- 带有 0.33062166254799996
- 吸收 0.311675969833
- 四个 0.306925352242
- 容易 0.270697183402
- 产生 0.2270312503385
- 因为 0.2024189068105
- 这种 0.19852254011249998
- 主要 0.172928225041
1.2)切换IDF文本语料库为自定义语料库路径:jieba.analyse.set_idf_path(file_name)
1.3) 切换关键词提取所使用停止词文本语料库为自定义语料库路径:jieba.analyse.set_stop_words(file_name)
2.1) 基于TextRank算法的关键词抽取:此函数与基于TF-IDF算法的关键词抽取函数参数相同,需要注意的是此函数默认过滤词性,故allowPOS参数不能为空,否则会得到空值
- import jieba.analyse
-
- ori = '这种是四轴无人机植保机,带有四个喷嘴,主要是喷洒农药,因为螺旋桨产生的风是下压的,能让农药打到植被的根底部,让植被更容易吸收'
- strs = jieba.analyse.textrank(sentence=ori, # 待提取原文
- topK=20, # 返回几个TF/IDF权重最大的关键词,默认为20
- withWeight=True, # 是否一并返回关键词的权重值,默认为False
- allowPOS=('ns', 'n', 'vn', 'v')) # 仅包括指定词性的词,默认过滤词性
-
- print('关键词及权重为:')
- for (k, v) in strs:
- print(k, v)
-
- *********************************************
- 输出结果:
- 关键词及权重为:
- 螺旋桨 1.0
- 农药 0.8759898646172835
- 产生 0.7867742915818781
- 喷洒 0.6996158154963905
- 风是 0.5973042098678957
- 下压 0.590317791482311
- 喷嘴 0.5844892605660431
- 植被 0.5674678333270774
- 带有 0.3326323546342714
- 吸收 0.32263772112456274
6.词性标注:
- import jieba.posseg as pseg
-
- ori = '这种是四轴无人机植保机,带有四个喷嘴,主要是喷洒农药,因为螺旋桨产生的风是下压的,能让农药打到植被的根底部,让植被更容易吸收'
-
- words = pseg.cut(ori)
- for word, flag in words:
- print(word, flag)
-
- **********************************************
- 输出结果为:
- 这种 r
- 是 v
- 四 m
- 轴 n
- 无人机 l
- 植保 nr
- 机 n
- , x
- 带有 v
- 四个 m
- 喷嘴 v
- , x
- 主要 b
- 是 v
- 喷洒 v
- 农药 n
- , x
- 因为 c
- 螺旋桨 n
- 产生 n
- 的 uj
- 风是 n
- 下压 v
- 的 uj
- , x
- 能 v
- 让 v
- 农药 n
- 打 v
- 到 v
- 植被 n
- 的 uj
- 根 a
- 底部 f
- , x
- 让 v
- 植被 n
- 更 d
- 容易 a
- 吸收 v
7.并行分词(据说目前还未支持windows,最少github上是这么写的~~):将文本分行后可以将各行文本分配给多个进程进行分词,最后将结果合并,进而利用多线程提升分词效率,此功能基于python自带的multiprocessing模块
jieba.enable_parallel(n) # 开启并行分词模式,参数n为并行进程数
jieba.disable_parallel() # 关闭并行分词模式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。