自然语言处理 | 中文分词器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即可:

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_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 动词性语素

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • jieba分词,学习,为了全面了解该模块,,预设学习路线:官方文档——优秀博客文章——实践学习 官方文档部分 (文...
    竹林徒儿阅读 4,112评论 1 12
  • 转自 进击的Coder 公众号 原理 中文分词,即 Chinese Word Segmentation,即将一个汉...
    Epiphron阅读 11,559评论 2 56
  • 在接下来的分词练习中将使用到四川大学公共管理学院的一篇新闻进行练习,文本如下: 为贯彻落实党的十九大精神,不断提升...
    nicokani阅读 1,231评论 0 4
  • 注:参考文档 一、在线词云图工具# (1)、使用### 在正式使用jieba分词之前,首先尝试用在线分词工具来将自...
    DearIreneLi阅读 6,040评论 1 8
  • 深夜有人看完前一篇表示不服,说没有她,凭什么我这么精彩的高中生活中竟然第一个没写她, 既然要写高中,那就不能不提这...
    东森5231阅读 247评论 1 4