jieba就是非常好用的中文工具,是以分词起家的,但是功能比分词要强大很多。
官方介绍:https://github.com/455125158/jieba
import jieba
import jieba.posseg #词性标注
import jieba.analyse #关键词提取
目录
1.基本分词函数与用法
1.1 添加用户自定义词典
2 关键词提取
2.1 基于 TF-IDF 算法的关键词抽取
2.2 关于TF-IDF 算法的关键词抽取补充
2.3 基于 TextRank 算法的关键词抽取
3 词性标注
4 并行分词
5 tokenize:返回词语在原文的起止位置
1.基本分词函数与用法
jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的生成器,可以使用 for 循环来获得分词后得到的每一个词语(unicode)
jieba.cut 方法接受三个输入参数:
jieba.cut_for_search 方法接受两个参数
该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
import jieba
seg_list = jieba.cut("我在学习自然语言处理", cut_all=True)
print (seg_list)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我在学习自然语言处理", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
seg_list = jieba.cut("他毕业于上海交通大学,在百度深度学习研究院进行研究") # 默认是精确模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在哈佛大学深造") # 搜索引擎模式
print(", ".join(seg_list))
Full Mode: 我/ 在/ 学习/ 自然/ 自然语言/ 语言/ 处理
Default Mode: 我/ 在/ 学习/ 自然语言/ 处理
他, 毕业, 于, 上海交通大学, ,, 在, 百度, 深度, 学习, 研究院, 进行, 研究
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 哈佛, 大学, 哈佛大学, 深造
很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。
file_name
为文件类对象或自定义词典的路径print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=True)))
jieba.suggest_freq(('中', '将'), True)
print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=True)))
如果/放到/旧/字典/中将/出错/。
如果/放到/旧/字典/中/将/出错/。
2 关键词提取
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选
TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率)是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的一份文件的重要程度,其原理可概括为:
一个词语在一篇文章中出现次数越多,同时在所有文档中出现次数越少,越能够代表该文章
例子:
s = "此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"
for x, w in anls.extract_tags(s, topK=20, withWeight=True):
print('%s %s' % (x, w))
欧亚 0.7300142700289363
吉林 0.659038184373617
置业 0.4887134522112766
万元 0.3392722481859574
增资 0.33582401985234045
4.3 0.25435675538085106
7000 0.25435675538085106
2013 0.25435675538085106
139.13 0.25435675538085106
实现 0.19900979900382978
综合体 0.19480309624702127
经营范围 0.19389757253595744
亿元 0.1914421623587234
在建 0.17541884768425534
全资 0.17180164988510638
注册资本 0.1712441526
百货 0.16734460041382979
零售 0.1475057117057447
子公司 0.14596045237787234
营业 0.13920178509021275
关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径
关键词一并返回关键词权重值示例
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 注意默认过滤词性。
jieba.analyse.TextRank() 新建自定义 TextRank 实例
算法论文: http://web.eecs.umich.edu/~mihalcea/papers/mihalcea.emnlp04.pdf
基本思想:
import jieba.analyse as analyse
lines = open('NBA.txt').read()
print(" ".join(analyse.textrank(lines, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))))
print("---------------------我是分割线----------------")
print(" ".join(analyse.textrank(lines, topK=20, withWeight=False, allowPOS=('ns', 'n'))))
全明星赛 勇士 正赛 指导 对方 投篮 球员 没有 出现 时间 威少 认为 看来 结果 相隔 助攻 现场 三连庄 介绍 嘉宾
---------------------我是分割线----------------
勇士 正赛 全明星赛 指导 投篮 玩命 时间 对方 现场 结果 球员 嘉宾 时候 全队 主持人 特点 大伙 肥皂剧 全程 快船队
3 词性标注
import jieba.posseg as pseg
words = pseg.cut("我爱自然语言处理")
for word, flag in words:
print('%s %s' % (word, flag))
我 r
爱 v
自然语言 l
处理 v
4 并行分词
原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升 基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows
用法:
jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数
jieba.disable_parallel() # 关闭并行分词模式
实验结果:在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。
注意:并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt。
import sys
import time
import jieba
jieba.enable_parallel()
content = open(u'西游记.txt',"r").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))
t2 = time.time()
tm_cost = t2-t1
print('并行分词速度为 %s bytes/second' % (len(content)/tm_cost))
jieba.disable_parallel()
content = open(u'西游记.txt',"r").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))
t2 = time.time()
tm_cost = t2-t1
print('非并行分词速度为 %s bytes/second' % (len(content)/tm_cost))
并行分词速度为 830619.50933 bytes/second 非并行分词速度为 259941.448353 bytes/second
5 tokenize:返回词语在原文的起止位置
print("这是默认模式的tokenize")
result = jieba.tokenize(u'自然语言处理非常有用')
for tk in result:
print("%s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
print("\n-----------我是神奇的分割线------------\n")
print("这是搜索模式的tokenize")
result = jieba.tokenize(u'自然语言处理非常有用', mode='search')
for tk in result:
print("%s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
这是默认模式的tokenize 自然语言 start: 0 end:4 处理 start: 4 end:6 非常 start: 6 end:8 有用 start: 8 end:10 -----------我是神奇的分割线------------ 这是搜索模式的tokenize 自然 start: 0 end:2 语言 start: 2 end:4 自然语言 start: 0 end:4 处理 start: 4 end:6 非常 start: 6 end:8 有用 start: 8 end:10