juypter notebook使用jieba分词
1、什么是中文分词
中文分词:分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂得多、困难得多。
中文分词并不追求完美,而是通过关键字识别技术,抽取句子中最关键的部分,从而达到理解句子的目的。
2、什么是jieba
jieba 是一个python实现的中文分词组件,在中文分词界非常出名,支持简、繁体中文,用户还可以加入自定义词典以提高分词的准确率。
jieba分词的三种模式:
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词
jieba自带有关键词摘取算法:
- 基于 TF-IDF 算法的关键词抽取
- 基于 TextRank 算法的关键词抽取
3、jieba几个常用功能
(1)中文分词
三种模式中文分词举例:
全模式
import jieba
#全模式
#全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义问题;
text1="我来自广州中医药大学"
seg_list = jieba.cut(text1, cut_all=True)
print(u"[全模式]: ", " ".join(seg_list))
输出结果为:
[全模式]: 我 来自 广州 中医 中医药 中医药大学 医药 大学
精确模式
#精确模式:试图将句子最精确地切开,适合文本分析
seg_list = jieba.cut(text1, cut_all=False)
print(u"[精确模式]: ", " ".join(seg_list))
# 默认是精确模式
seg_list = jieba.cut(text1)
print(u"[默认模式]: ", " ".join(seg_list))
输出结果为:
[精确模式]: 我 来自 广州 中医药大学
[默认模式]: 我 来自 广州 中医药大学
搜索引擎模式
# 搜索引擎模式
#搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
seg_list = jieba.cut_for_search(text1)
print(u"[搜索引擎模式]: ", " ".join(seg_list))
输出结果:
[搜索引擎模式]: 我 来自 广州 中医 医药 大学 中医药 中医药大学
对一个TXT文件进行分词并保存
将test.txt文件导入jupyter notebook中并进行精确模式分词,将文件另存为result.txt
#读取一个TXT文档分词
import jieba
fR = open('test.txt', 'r', encoding='UTF-8')
sent = fR.read()
sent_list = jieba.cut(sent)
fW = open('result.txt', 'w', encoding='UTF-8')
fW.write(' '.join(sent_list))
fR.close()
fW.close()
(2)添加自定义词典
#自定义词典,实现新词识别
#词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
#file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
jieba.load_userdict(r"D:\anaconda\Lib\site-packages\jieba\mydict.txt")
text = "故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等"
# 全模式
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))
# 精确模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精确模式]: ", " ".join(seg_list))/
# 搜索引擎模式
seg_list = jieba.cut_for_search(text)
print(u"[搜索引擎模式]: ", "/ ".join(seg_list))
#没有认出"乾清宫"和"黄琉璃瓦"。也就是说专有名词"乾清宫"和"黄琉璃瓦"可能因分词而分开,这也是很多分词工具的一个缺陷。
#所以需要自定义词典
输出结果:
[全模式]: 故宫/ 的/ 著名/ 著名景点/ 景点/ 包括/ 乾清宫/ 清宫/ / / 太和/ 太和殿/ 和/ 黄琉璃瓦/ 琉璃/ 琉璃瓦/ 等 [精确模式]: 故宫 的 著名景点 包括 乾清宫 、 太和殿 和 黄琉璃瓦 等 [搜索引擎模式]: 故宫/ 的/ 著名/ 景点/ 著名景点/ 包括/ 清宫/ 乾清宫/ 、/ 太和/ 太和殿/ 和/ 琉璃/ 琉璃瓦/ 黄琉璃瓦/ 等
(3)关键词提取
基于TF-IDF算法的关键词提取
jieba.analyse.extract_tags(sentence, topK = 20,withWeight = False, allowPOS = ())
sentence为待提取文本
topK为返回几个TF-IDF权重最大的关键词,默认值为20
withWeight为是否一并返回关键词权重值,默认值为FALSE
allowPOS仅包括指定词性的词,默认值为空,即不筛选
#提取关键字
import jieba
import jieba.analyse
file_name = "result.txt" #使用上文中保留的分词文件,提取关键字
content = open(file_name, "r", encoding='UTF-8').read()
tags = jieba.analyse.extract_tags(content, topK=10)
print(" ".join(tags))
输出结果:
10g 恶性肿瘤 15g 良性肿瘤 NOS 先天性 20g 中毒 通络 30g
关键词提取所使用的停用词文本语料库可以切换成自定义语料库的路径path
#自定义语料库提取关键字
import jieba
import jieba.analyse
file_name = "result.txt"
content = open(file_name, "r", encoding='UTF-8').read()
jieba.analyse.set_idf_path("path")
tags = jieba.analyse.extract_tags(content, topK=10)
print(" ".join(tags))
获取关键词的权重
#提取关键字
import jieba
import jieba.analyse
file_name = "病历汇总result.txt"
content = open(file_name, "r", encoding='UTF-8').read()
tags = jieba.analyse.extract_tags(content, topK=10, withWeight=True)
for tag in tags:
print("tag:%s\t\t weight:%f" % (tag[0], tag[1]))
输出结果:
tag:10g weight:0.162985 tag:恶性肿瘤 weight:0.126455 tag:15g weight:0.095097 tag:良性肿瘤 weight:0.086129 tag:NOS weight:0.084103 tag:先天性 weight:0.064658 tag:20g weight:0.063490 tag:中毒 weight:0.053615 tag:通络 weight:0.051480 tag:30g weight:0.051396
基于TextRank算法的关键词抽取
jieba.analyse.textrank(sentence, topK = 20, withWeight = False, allowPOS = ('ns', 'n', 'vn', 'v'))
直接使用,接口相同,注意默认过滤词性
import jieba
import jieba.analyse
import jieba.posseg
s = "用剂后府行明显好转,次数减少,或成形,或不成形,特别是便秘较顽同,但口腔似有牙龈炎,起疙瘩,左腹部或有隐痛。甲亢手术(2年前),他弟有糖尿病上周肠梗阻又复发,刚出院。府行一二日一次,量少,不成形,肠粘连,受凉则腹胀,月经期十天,提前。"
for x, w in jieba.analyse.extract_tags(s, withWeight=True):
print("%s %s" % (x, w))
输出结果:
不成形 0.6567353394611111 牙龈炎 0.36687584642777776 肠粘连 0.36687584642777776 用剂 0.33207687508055556 后府行 0.33207687508055556 顽同 0.33207687508055556 他弟 0.33207687508055556 府行 0.33207687508055556 量少 0.33207687508055556 甲亢 0.30291514940000003 肠梗阻 0.3002676444055556 月经期 0.2978506617111111 隐痛 0.2925939395 受凉 0.2829751551472222 一二日 0.26933291757166666 腹胀 0.2573874628819445 明显好转 0.25581471582638887 复发 0.24946379794861112 成形 0.24639554807166666 似有 0.24463687364361114
(4)标注词性
#标注词性
import jieba.posseg as pseg
words = pseg.cut("特别是便秘较顽同,但口腔似有牙龈炎,起疙瘩,左腹部或有隐痛。")
for word, flag in words:
print("%s %s" % (word, flag))
输出结果
特别 d 是 v 便秘 a 较 d 顽同 a , x 但 c 口腔 n 似 d 有 v 牙龈炎 n , x 起 v 疙瘩 n , x 左 m 腹部 n 或 c 有 v 隐痛 a 。 x