1.JIEBA简介
jieba是基于Python的中文分词工具,支持繁体分词、自定义词典和三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
算法原理:
- 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
- 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
- 对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法
2.Win+Python3.X下的安装使用
JIEBA支持Python2和Python3使用,在Python3.X下JIEBA的Github地址:https://github.com/fxsjy/jieba/tree/jieba3k。
在python环境下安装JIEBA直接pip install jieba
即可:
打开Jupyter进行分词:
import jieba
text = "欧阳建国是创新办主任也是欢聚时代公司云计算方面的专家"
# jieba.cut() 方法接受两个输入参数:
# 需要分词的字符串
# cut_all 参数用来控制是否采用全模式
# 精确模式,默认模式就是精确模式
seg_list = jieba.cut(text, cut_all = False)
print('Default Mode:\n' + '/' .join(seg_list))
# 全模式
seg_list = jieba.cut(text, cut_all = True)
print( "Full Mode:\n" + '/' .join(seg_list))
# jieba.cut_for_search() 方法接受一个参数:
# 需要分词的字符串
# 该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
# 搜索引擎模式
seg_list = jieba.cut_for_search(text)
print('Research Mode:\n' + '/'.join(seg_list))
运行结果:
Default Mode:
欧阳/建国/是/创新/办/主任/也/是/欢聚/时代/公司/云/计算/方面/的/专家
Full Mode:
欧阳/欧阳建/建国/国是/创新/办/主任/也/是/欢聚/时代/代公/公司/云/计算/方面/的/专家
Research Mode:
欧阳/建国/是/创新/办/主任/也/是/欢聚/时代/公司/云/计算/方面/的/专家
可以看到,“云计算”作为一个近年来很热门的词汇,在这里却并没有被识别为一个词语。查看词频:
print(jieba.get_FREQ("云"))
print(jieba.get_FREQ("计算"))
print(jieba.get_FREQ("云计算"))
结果:
6353
5235
None
可以看到词库中并没有收录“云计算”这个词汇,因此采用增大词频的方法进行识别词语的调整:
import jieba
text = "欧阳建国是创新办主任也是欢聚时代公司云计算方面的专家"
jieba.add_word('云计算',8000) #更改云计算词频为8000
# 精确模式,默认模式就是精确模式
seg_list = jieba.cut(text, cut_all = False)
print('Default Mode:\n' + '/' .join(seg_list))
结果:
Default Mode:欧阳/建国/是/创新/办/主任/也/是/欢聚/时代/公司/云计算/方面/的/专家
运行结果成功划分“云计算”为一个词汇,但是这种写法是在线修改当前词频,所以仅仅对当前文件有效。
3.其他功能尝试
3.1 添加自定义词典
开发者可以指定自己自定义的词典,以便包含jieba词库里没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率。
词典格式和dict.txt一样,一个词占一行;每一行分三部分,一部分为词语,另一部分为词频,最后为词性(可省略),用空格隔开。文件格式必须为utf-8。
# 精确模式,默认模式就是精确模式
seg_list = jieba.cut(text, cut_all = False)
print('Default Mode:\n' + '/' .join(seg_list))
jieba.load_userdict("D:\App\jieba_word.txt") # file_name为自定义词典的路径
seg_list = jieba.cut(text)
print("Revise: " + "/".join(seg_list))
输出:
Default Mode:欧阳/建国/是/创新/办/主任/也/是/欢聚/时代/公司/云/计算/方面/的/专家
Revise: 欧阳/建国/是/创新办/主任/也/是/欢聚时代/公司/云计算/方面/的/专家
可以看到,词典中定义的创新班、欢聚时代、云计算都被识别出来了,并进行了正确的切分。
3.2 获取词性
每个词都有其词性,比如名词、动词、代词等,JIEBA分词的结果也可以带上每个词的词性,要用到jieba.posseg:
import jieba.posseg as pseg
words = pseg.cut(text)
for w in words:
print("%s %s" %(w.word, w.flag))
输出:
欧阳 ns
建国 ns
是 v
创新办 ns
主任 b
也 d
是 v
欢聚时代 ns
公司 n
云计算 ns
方面 n
的 uj
专家 n
按词性提取
import jieba.posseg as pseg
word = pseg.cut(text)
for w in word:
if w.flag in ["ns", "v"]:
print (w.word, w.flag)
输出:
欧阳 ns
建国 ns
是 v
创新办 ns
是 v
欢聚时代 ns
云计算 ns
3.3 提取关键词
- 基于 TF-IDF 算法的关键词提取
import jieba.analyse as anl
# jieba.analyse.extract_tags(sentence, topK = 20, withWeight = False, allowPOS = ())
# sentence:待提取的文本。
# topK:返回几个 TF-IDF 权重最大的关键词,默认值为20。
# withWeight:是否一并返回关键词权重值,默认值为False。
# allowPOS:仅包括指定词性的词,默认值为空,即不进行筛选。
seg = anl.extract_tags(text, topK = 20, withWeight = True)
for tag, weight in seg:
print ("%s %s" %(tag, weight))
输出:
创新办 1.3283075003222222
欢聚时代 1.3283075003222222
云计算 1.3283075003222222
欧阳 1.0125762121322222
建国 0.8471149069588889
专家 0.6224321397255556
主任 0.6213043777088889
方面 0.47367896445666663
公司 0.3892744381755555
- 基于 TextRank 算法的关键词提取
# 基本思想:将待抽取关键词的文本进行分词;以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图;计算图中节点的PageRank,注意是无向带权图
import jieba.analyse
for x, w in jieba.analyse.textrank(text, topK = 9, withWeight = True):
print("%s %s" % (x, w))
输出:
欢聚时代 1.0
方面 0.9504983854592687
公司 0.9476610050891431
云计算 0.9446389301268333
创新办 0.910894831408399
专家 0.7102002565942115
欧阳 0.6599053786424419
建国 0.6577163172521479
3.4 Tokenize: 返回词语在原文的起止位置
有默认模式和搜索模式两种模式,输入参数需为unicode类型。
# 默认模式
result = jieba.tokenize(text)
for tk in result:
print("%s \t start at: %d \t end at: %d" %(tk[0], tk[1], tk[2]))
输出:
欧阳 start at: 0 end at: 2
建国 start at: 2 end at: 4
是 start at: 4 end at: 5
创新办 start at: 5 end at: 8
主任 start at: 8 end at: 10
也 start at: 10 end at: 11
是 start at: 11 end at: 12
欢聚时代 start at: 12 end at: 16
公司 start at: 16 end at: 18
云计算 start at: 18 end at: 21
方面 start at: 21 end at: 23
的 start at: 23 end at: 24
专家 start at: 24 end at: 26
# 搜索模式:把句子中所有的可以成词的词语都扫描出来并确定位置
result = jieba.tokenize(text,mode = "search")
for tk in result:
print("%s \t start at: %d \t end at: %d" %(tk[0], tk[1], tk[2]))
3.5 词频统计、降序排序
import jieba
text = "欧阳建国是创新办主任也是欢聚时代公司云计算方面的专家"
words = jieba.cut(text, cut_all = False)
word_freq = {} # 词频序列
for word in words:
if word in word_freq: # 统计字/词出现的次数
word_freq[word] += 1
else:
word_freq[word] = 1
freq_word = [] # 排序后的字/词列表
for word, freq in word_freq.items():
freq_word.append((word, freq))
freq_word.sort(key = lambda x: x[1], reverse = True)
max_number = 3 # 输入想要的前3位高频词
for word, freq in freq_word[: max_number]:
print (word, freq)
输出:
是 2
欧阳 1
建国 1
3.6 人工去停用词
停用词是在处理自然语言数据(或文本)之前或之后会自动过滤掉的某些字或词。标点符号、虚词、连词不在统计范围内。
import jieba.analyse
import re
stopwords=[]
for word in open(r"D:\App\stop_word.txt",'r'): # 这里加载停用词的路径
stopwords.append(word.strip())
# print (stopwords)
article=open(r"D:\App\1.txt",'r').read()
words=jieba.cut(article)
stayed_line=""
for word in words:
print (word)
if word.encode("utf-8") not in stopwords:
stayed_line+=word+" "
print (stayed_line)
附:JIEBA分词词性常见类型对照表
词类 | 一级符号 | 二级符号 |
---|---|---|
形容词 | a 形容词 | ad 副形词、an 名形词、ag 形容词性语素、al 形容词性惯用语 |
区别词 | b 区别词 | bl 区别词性惯用语 |
连词 | c 连词 | cc 并列连词 |
副词 | d 副词 | · |
叹词 | e 叹词 | · |
方位词 | f 方位词 | · |
前缀 | h 前缀 | · |
后缀 | k 后缀 | · |
数词 | m 数词 | mq 数量词 |
名词 | n 名词 | nr 人名、nr1 汉语姓氏、nr2 汉语名字、nrj 日语人名、nrf 音译人名、ns 地名、nsf 音译地名、nt 机构团体名、nz 其它专名、nl 名词性惯用语、ng 名词性语素 |
拟声词 | o 拟声词 | · |
介词 | p 介词 | pba 介词“把”、pbei 介词“被” |
量词 | q 量词 | qv 动量词、qt 时量词 |
代词 | r 代词 | rr 人称代词、rz 指示代词、rzt 时间指示代词、rzs 处所指示代词、rzv 谓词性指示代词、ry 疑问代词、ryt 时间疑问代词、rys 处所疑问代词、ryv 谓词性疑问代词、rg 代词性语素 |
处所词 | s 处所词 | · |
时间词 | t 时间词 | tg 时间词性语素 |
助词 | u 助词 | uzhe 着、ule 了 喽、uguo 过、ude1 的 底、ude2 地、ude3 得、usuo 所、udeng 等 等等 云云、uyy 一样 一般 似的 般、udh 的话、uls 来讲 来说 而言 说来、uzhi 之、ulian 连 (“连小学生都会”) |
动词 | v 动词 | vd 副动词、vn 名动词、vshi 动词“是”、vyou 动词“有”、vf 趋向动词、vx 形式动词、vi 不及物动词(内动词)、vl 动词性惯用语、vg 动词性语素 |
参考:
- jieba - 盛小胖 - 博客园
- jieba首页、文档和下载 - Python中文分词组件 - 开源中国社区
- jieba 源码解析