专栏首页华章科技入门中文NLP必备干货:5分钟看懂“结巴”分词(Jieba)

入门中文NLP必备干货:5分钟看懂“结巴”分词(Jieba)

导读:近年来,随着NLP技术的日益成熟,开源实现的分词工具越来越多,如Ansj、盘古分词等。在本文中,我们选取了Jieba进行介绍和案例展示,主要基于以下考虑:

  • 社区活跃。截止本文发布前,Jieba在Github上已经有17,670的star数目。社区活跃度高,代表着该项目会持续更新,实际生产实践中遇到的问题能够在社区反馈并得到解决,适合长期使用。
  • 功能丰富。Jieba其实并不是只有分词这一个功能,其是一个开源框架,提供了很多在分词之上的算法,如关键词提取、词性标注等。
  • 提供多种编程语言实现。Jieba官方提供了Python、C++、Go、R、iOS等多平台多语言支持,不仅如此,还提供了很多热门社区项目的扩展插件,如ElasticSearch、solr、lucene等。在实际项目中,进行扩展十分容易。
  • 使用简单。Jieba的API总体来说并不多,且需要进行的配置并不复杂,方便上手。

作者:涂铭 刘祥 刘树春

如需转载请联系大数据(ID:hzdashuju)

Jieba分词官网地址是: https://github.com/fxsjy/jieba

可以采用如下方式进行安装:

pip install jieba

Jieba分词结合了基于规则基于统计这两类方法。

首先基于前缀词典进行词图扫描,前缀词典是指词典中的词按照前缀包含的顺序排列,例如词典中出现了“上”,之后以“上”开头的词都会出现在这一部分,例如“上海”,进而会出现“上海市”,从而形成一种层级包含结构。

如果将词看作节点,词和词之间的分词符看作边,那么一种分词方案则对应着从第一个字到最后一个字的一条分词路径。

因此,基于前缀词典可以快速构建包含全部可能分词结果的有向无环图,这个图中包含多条分词路径,有向是指全部的路径都始于第一个字、止于最后一个字,无环是指节点之间不构成闭环。

基于标注语料,使用动态规划的方法可以找出最大概率路径,并将其作为最终的分词结果。对于未登录词,Jieba使用了基于汉字成词的HMM模型,采用了Viterbi算法进行推导。(进一步了解中文分词算法,请点击:入门科普:一文看懂NLP和中文分词算法(附代码举例))

01 Jieba的三种分词模式

Jieba提供了三种分词模式:

  • 精确模式:试图将句子最精确地切开,适合文本分析。
  • 全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

下面是使用这三种模式的对比。

import jieba

sent = '中文分词是文本处理不可或缺的一步!'

seg_list = jieba.cut(sent, cut_all=True)

print('全模式:', '/ '.join(seg_list))

seg_list = jieba.cut(sent, cut_all=False)
print('精确模式:', '/ '.join(seg_list))

seg_list = jieba.cut(sent)
print('默认精确模式:', '/ '.join(seg_list))

seg_list = jieba.cut_for_search(sent)
print('搜索引擎模式', '/ '.join(seg_list))

运行结果如下:

  • 全模式:
中文/分词/是/文本/文本处理/本处/处理/不可/不可或缺/或缺/的/一步//
  • 精确模式:
中文/分词/是/文本处理/不可或缺/的/一步/!
  • 默认精确模式:
中文/分词/是/文本处理/不可或缺/的/一步/!
  • 搜索引擎模式:
中文/分词/是/文本/本处/处理/文本处理/不可/或缺/不可或缺/的/一步/!

可以看到,全模式和搜索引擎模式下,Jieba将会把分词的所有可能都打印出来。一般直接使用精确模式即可,但是在某些模糊匹配场景下,使用全模式或搜索引擎模式更适合。

接下来将结合具体案例,讲解Jieba分词的具体用法。

02 实战之高频词提取

高频词一般是指文档中出现频率较高且非无用的词语,其一定程度上代表了文档的焦点所在。针对单篇文档,可以作为一种关键词来看。对于如新闻这样的多篇文档,可以将其作为热词,发现舆论焦点。

高频词提取其实就是自然语言处理中的TF(Term Frequency)策略。其主要有以下干扰项:

  • 标点符号:一般标点符号无任何价值,需要去除。
  • 停用词:诸如“的”“是”“了”等常用词无任何意义,也需要剔除。

下面采用Jieba分词,针对搜狗实验室的新闻数据,进行高频词的提取。

数据见:

https://github.com/nlpinaction/learning-nlp chapter3/data/news下,包括9个目录,目录下均为txt文件,分别代表不同领域的新闻。

该数据本质上是一个分类语料,这里我们只挑选其中一个类别,统计该类的高频词。

首先,进行数据的读取:

def get_content(path):

    with open(path, 'r', encoding='gbk', errors='ignore') as f:
        content = ''
        for l in f:
            l = l.strip()
            content += l
        return content

该函数用于加载指定路径下的数据。

定义高频词统计的函数,其输入是一个词的数组:

def get_TF(words, topK=10):
    tf_dic = {}
    for w in words:
        tf_dic[w] = tf_dic.get(w, 0) + 1
    return sorted(tf_dic.items(), key = lambda x: x[1], reverse=True)[:topK]

最后,主函数如下,这里仅列举了求出高频词的前10个:

def main():
    import glob
    import random
    import jieba

    files = glob.glob('./data/news/C000013/*.txt')
    corpus = [get_content(x) for x in files]

    sample_inx = random.randint(0, len(corpus))
    split_words = list(jieba.cut(corpus[sample_inx]))
    print('样本之一:'+corpus[sample_inx])
    print('样本分词效果:'+'/ '.join(split_words))
    print('样本的topK(10)词:'+str(get_TF(split_words)))

运行主函数,结果如下:

  • 样本之一:
中国卫生部官员24日说,截至2005年底,中国各地报告的尘肺病病人累计已超过60万例,职业病整体防治形势严峻。卫生部副部长陈啸宏在当日举行的“国家职业卫生示范企业授牌暨企业职业卫生交流大会”上说,中国各类急性职业中毒事故每年发生200多起,上千人中毒,直接经济损失达上百亿元。职业病病人总量大、发病率较高、经济损失大、影响恶劣。卫生部24日公布,2005年卫生部共收到全国30个省、自治区、直辖市(不包括西藏、港、澳、台)各类职业病报告12212例,其中尘肺病病例报告9173例,占75.11%。陈啸宏说,矽肺和煤工尘肺是中国最主要的尘肺病,且尘肺病发病工龄在缩短。去年报告的尘肺病病人中最短接尘时间不足三个月,平均发病年龄40.9岁,最小发病年龄20岁。陈啸宏表示,政府部门执法不严、监督不力,企业生产水平不高、技术设备落后等是职业卫生问题严重的原因。“但更重要的原因是有些企业法制观念淡薄,社会责任严重缺位,缺乏维护职工健康的强烈的意识,职工的合法权益不能得到有效的保障。”他说。为提高企业对职业卫生工作的重视,卫生部、国家安全生产监督管理总局和中华全国总工会24日在京评选出56家国家级职业卫生工作示范企业,希望这些企业为社会推广职业病防治经验,促使其他企业作好职业卫生工作,保护劳动者健康。
  • 样本分词效果:
中国卫生部/官员/24/日/说/,/截至/2005/年底/,/中国/各地/报告/的/尘肺病/病人/累计/已/超过/60/万例/,/职业病/整体/防治/形势严峻/。/卫生部/副/部长/陈啸宏/在/当日/举行/的/“/国家/职业/卫生/示范/企业/授牌/暨/企业/职业/卫生/交流/大会/”/上/说/,/中国/各类/急性/职业/中毒/事故/每年/发生/200/多起/,/上千人/中毒/,/直接/经济损失/达上/百亿元/。/职业病/病人/总量/大/、/发病率/较/高/、/经济损失/大/、/影响/恶劣/。/卫生部/24/日/公布/,/2005/年/卫生部/共/收到/全国/30/个省/、/自治区/、/直辖市/(/不/包括/西藏/、/港/、/澳/、/台/)/各类/职业病/报告/12212/例/,/其中/尘肺病/病例/报告/9173/例/,/占/75/./11/%/。/陈啸宏/说/,/矽肺/和/煤工/尘肺/是/中国/最/主要/的/尘肺病/,/且/尘肺病/发病/工龄/在/缩短/。/去年/报告/的/尘肺病/病人/中/最/短/接尘/时间/不足/三个/月/,/平均/发病/年龄/40/./9/岁/,/最小/发病/年龄/20/岁/。/陈啸宏/表示/,/政府部门/执法不严/、/监督/不力/,/企业/生产/水平/不高/、/技术设备/落后/等/是/职业/卫生/问题/严重/的/原因/。/“/但/更/重要/的/原因/是/有些/企业/法制观念/淡薄/,/社会/责任/严重/缺位/,/缺乏/维护/职工/健康/的/强烈/的/意识/,/职工/的/合法权益/不能/得到/有效/的/保障/。/”/他/说/。/为/提高/企业/对/职业/卫生/工作/的/重视/,/卫生部/、/国家/安全/生产/监督管理/总局/和/中华全国总工会/24/日/在/京/评选/出/56/家/国家级/职业/卫生/工作/示范/企业/,/希望/这些/企业/为/社会/推广/职业病/防治/经验/,/促使/其他/企业/作好/职业/卫生/工作/,/保护/劳动者/健康/。
  • 样本的topK(10)词:
[(',',22),('、',11),('的',11),('。',10),('企业',8),('职业',7),('卫生',6),('尘肺病',5),('说',4),('报告',4)]

通过上面的结果,我们可以发现,诸如“的”“,”“。”“说”等词占据着很高的位置,而这类词对把控文章焦点并无太大意义。我们需要的是类似“尘肺病”这种能够简要概括重点的词汇。常用的办法,是自定义一个停用词典,当遇到这些词时,过滤掉即可。

因此,我们可以自定义词典,然后按照如下方式来进行优化。

首先,整理常用的停用词(包括标点符号),按照每行一个写入到一个文件中(data目录下的stop_words.utf8)。然后定义如下函数,用于过滤停用词:

def stop_words(path):
    with open(path) as f:
        return [l.strip() for l in f]

接下来修改main函数中第11行分词的部分,改为:

split_words = [x for x in jieba.cut(corpus[sample_inx]) if x not in stop_words('./data/stop_words.utf8')]

高频词前10位结果如下:

  • 样本的topK(10)词:
[('企业', 8), ('职业', 7), ('卫生', 6), ('尘肺病', 5), ('卫生部', 4), ('报告', 4), ('职业病', 4), ('中国', 3), ('陈啸宏', 3), ('工作', 3)]

对比之前的结果,会发现效果要想有所提升,必须去除了无用标点符号以及“的”等干扰词。注意,本节实战中所用的停用词典为笔者整理的通用词典,一般实践过程中,需要根据自己的任务,定期更新维护。

上面演示了通过Jieba按照常规切词来提取高频词汇的过程。事实上,常用的中文分词器在分词效果上差距并不是特别大,但是在特定场景下常常表现的并不是那么尽如人意。

通常这种情况下,我们需要定制自己的领域词典,用以提升分词的效果。Jieba分词就提供了这样的功能,用户可以加载自定义词典:

jieba.load_userdict('./data/user_dict.utf8')

Jieba要求的用户词典格式一般如下:

朝三暮四 3 i
大数据 5
汤姆 nz
公主坟

每一行为三个部分:词语词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。该词典文件需为utf8编码。

在提取高频词时,通过更合理的自定义词典加载,能够获得更佳的效果。当然这里仅仅演示了一篇文档的高频词计算,多篇文档的高频词提取也可按照该思路进行整体统计计算。

关于作者:涂铭,阿里巴巴数据架构师,对大数据、自然语言处理、Python、Java相关技术有深入的研究,积累了丰富的实践经验。

刘祥,百炼智能自然语言处理专家,主要研究知识图谱、NLG等前沿技术,参与机器自动写作产品的研发与设计。

刘树春,七牛云高级算法专家,七牛AI实验室NLP&OCR方向负责人,主要负责七牛NLP以及OCR相关项目的研究与落地。

本文摘编自《Python自然语言处理实战:核心技术与算法》,经出版方授权发布。

延伸阅读《Python自然语言处理实战》

本文分享自微信公众号 - 大数据(hzdashuju)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 6个最高效的语言处理Python库,你用过几个?

    最近一段时间Python已经成为数据科学行业中大火的编程语言,今天技术学派收集了一些较为高效的语言处理Python库。下面分享给大家。

    燕大侠V
  • python 舆情分析 nlp主题分析 (3) --gensim库的简单使用

    python 舆情分析 nlp主题分析 (1) 待续: https://www.cnblogs.com/cycxtz/p/13663895.html

    forxtz
  • 自然语言处理简介(1)---- 服务梳理与传统汉语分词

    同步发表于:本人所属公司博客<知盛数据集团西安研发中心技术博客> https://blog.csdn.net/Insightzen_xian/article/...

    流川疯
  • 资源 | 这套1600赞的NLP课程已开放,面向实战,视频代码都有

    一套面向实战、号称“代码优先”的NLP课程来了,名字为A Code-First Introduction to Natural Language Process...

    zenRRan
  • 部分常用分词工具使用整理

    HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、...

    IT小白龙
  • 【NLP】竞赛必备的NLP库

    本周我们给大家整理了机器学习和竞赛相关的NLP库,方便大家进行使用,建议收藏本文。

    黄博的机器学习圈子
  • 第四天:文本处理流程——分词

      我们在前一篇文章中介绍过文本处理流程,主要包括分词、文本预处理(无用标签、特殊符号、停用词、大写转小写)、标准化、特征提取、建模、系统评估。今天我们介绍在自...

    一计之长
  • 自然语言处理实战入门第一课----自然语言处理简介

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyaninglm/article/detail...

    流川疯
  • 《自然语言处理实战课程》---- 第一课:自然语言处理简介

    大家好,今天开始和大家分享,我在自然语言处理(Natural Language Processing,NLP)的一些学习经验和心得体会。

    流川疯
  • hanlp和jieba等六大中文分工具的测试对比

    本篇文章测试的哈工大LTP、中科院计算所NLPIR、清华大学THULAC和jieba、FoolNLTK、HanLP这六大中文分词工具是由 水...琥珀 完成的。...

    IT小白龙
  • 数据挖掘干货总结(一)-NLP基础

    本文共计1463字,预计阅读时长八分钟 NLP-基础和中文分词 一、本质 NLP (Natural Language Processing)自然语言处理是一门研...

    企鹅号小编
  • 这里有 300 篇 Python 与机器学习类原创笔记

    主要包括计算机科学中基本的算法与数据结构,结合算法思想和Leetcode实战,总结介绍。

    好好学java
  • jieba分词器详解及python实战

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    菲宇
  • 结巴中文分词介绍

    Python中分分词工具很多,包括盘古分词、Yaha分词、Jieba分词、清华THULAC等。它们的基本用法都大同小异,这里先了解一下结巴分词。

    海天一树
  • 手把手教你如何选择、斩下NLP算法岗offer!

    这篇文章不是面经集合,也不是装X和贩卖焦虑的晒offer贴,也不是堆砌可能问到的知识点,而是希望给还在迷茫的小伙伴提供一些系统的指导和建议。当然,这些建议可能不...

    AI研习社
  • 数据分析与数据挖掘 - 03智能对话

    我们在处理很多数据分析任务时,不可避免地涉及到与文本内容相关的知识,这是属于文本挖掘(text mining)的内容,显然是NLP技术的范畴,基于这样的考虑我们...

    马一特
  • 《自然语言处理实战入门》 ---- 第4课 :中文分词原理及相关组件简介 之 汉语分词领域主要分词算法、组件、服务(上)...

    《自然语言处理实战入门》 第4课 :中文分词原理及相关组件简介的 主要内容 有如下三个部分:

    流川疯
  • python jieba分词(结巴分词)、提取词,加载词,修改词频,定义词库

    “结巴”中文分词:做最好的 Python 中文分词组件,分词模块jieba,它是python比较好用的分词模块, 支持中文简体,繁体分词,还支持自定义词库。 ...

    学到老
  • 学习使用Jieba1.Jieba2. 特点3.功能4.安装5.使用6.其他中文分词工具

    1.Jieba 相信大多数知道NLP的人都知道什么是Jieba,但对于像我这样的新手而言,也仅限于知道而已,并没有学习过它,使用过它,打算用几天的时间来记录自己...

    JasonhavenDai

扫码关注云+社区

领取腾讯云代金券