中文分词器JIEBA分词练习

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即可:

中文分词器JIEBA分词练习_第1张图片
image.png

打开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有新词识别能力,但是自行添加新词可以保证更高的正确率。

中文分词器JIEBA分词练习_第2张图片
jieba_word.txt

词典格式和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 源码解析

你可能感兴趣的:(中文分词器JIEBA分词练习)