jieba分词(R vs. python)

Python019

jieba分词(R vs. python),第1张

自然语言处理(NLP)是机器学习重要分支之一,主要应用于篇章理解、文本摘要、情感分析、知识图谱、文本翻译等领域。而NLP应用首先是对文本进行分词,当前中文分词器有Ansj、paoding、盘古分词等多种,而最基础的分词器应该属于jieba分词器(比较见下图)。

下面将分别应用R和python对jieba分词器在中文分词、词性标注和关键词提取领域的应用进行比较。

R实现

通过函数worker()来初始化分词引擎,使用segment()进行分词。有四种分词模式:最大概率法(MP)、隐马尔科夫模型(HMM)、混合模型(Mix)及索引模型(query),默认为混合模型。具体可查看help(worker).

#install.packages('jiebaR')library(jiebaR)mixseg <- worker()segment( "这是一段测试文本" , mixseg ) #或者用以下操作mixseg['这是一段测试文本']mixseg <= "这是一段测试文本"

python实现

python中需安装jieba库,运用jieba.cut实现分词。cut_all参数为分词类型,默认为精确模式。

import jiebaseg_list = jieba.cut(u"这是一段测试文本",cut_all = False)print("Full mode: "+ ",".join(seg_list))  #默认精确模式

无论是R还是python都为utf—8编码。

R实现

可以使用<=.tagger 或者tag 来进行分词和词性标注,词性标注使用混合模型模型分词,标注采用和 ictclas 兼容的标记法。

words = "我爱北京天安门"tagger = worker("tag") #开启词性标注启发器tagger <= words    #    r        v      ns      ns    # "我"    "爱"  "北京" "天安门"

python实现

#词性标注import jieba.posseg as psegwords = pseg.cut("我爱北京天安门")for word,flag in words:    print('%s, %s' %(word,flag))

R实现

R关键词提取使用逆向文件频率(IDF)文本语料库,通过worker参数“keywords”开启关键词提取启发器,topn参数为关键词的个数。

keys = worker("keywords",topn = 5, idf = IDFPATH)keys <= "会议邀请到美国密歇根大学(University of Michigan, Ann Arbor)环境健康科学系副教授奚传武博士作题为“Multibarrier approach for safe drinking waterin the US : Why it failed in Flint”的学术讲座,介绍美国密歇根Flint市饮用水污染事故的发生发展和处置等方面内容。讲座后各相关单位同志与奚传武教授就生活饮用水在线监测系统、美国水污染事件的处置方式、生活饮用水老旧管网改造、如何有效减少消毒副产物以及美国涉水产品和二次供水单位的监管模式等问题进行了探讨和交流。本次交流会是我市生活饮用水卫生管理工作洽商机制运行以来的又一次新尝试,也为我市卫生计生综合监督部门探索生活饮用水卫生安全管理模式及突发水污染事件的应对措施开拓了眼界和思路。"#结果:#        48.8677        23.4784        22.1402        20.326        18.5354 #      "饮用水"        "Flint"        "卫生"      "水污染"        "生活"

python实现

python实现关键词提取可运用TF-IDF方法和TextRank方法。allowPOS参数为限定范围词性类型。

#关键词提取import jieba.analysecontent = u'会议邀请到美国密歇根大学(University of Michigan, Ann Arbor)环境健康科学系副教授奚传武博士作题为“Multibarrier approach for safe drinking waterin the US : Why it failed in Flint”的学术讲座,介绍美国密歇根Flint市饮用水污染事故的发生发展和处置等方面内容。讲座后各相关单位同志与奚传武教授就生活饮用水在线监测系统、美国水污染事件的处置方式、生活饮用水老旧管网改造、如何有效减少消毒副产物以及美国涉水产品和二次供水单位的监管模式等问题进行了探讨和交流。本次交流会是我市生活饮用水卫生管理工作洽商机制运行以来的又一次新尝试,也为我市卫生计生综合监督部门探索生活饮用水卫生安全管理模式及突发水污染事件的应对措施开拓了眼界和思路。'#基于TF-IDFkeywords = jieba.analyse.extract_tags(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords:        print item[0],item[1]  #基于TF-IDF结果# 饮用水 0.448327672795# Flint 0.219353532163# 卫生 0.203120821773# 水污染 0.186477211628# 生活 0.170049997544

#基于TextRankkeywords = jieba.analyse.textrank(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords:        print item[0],item[1]    #基于TextRank结果:# 饮用水 1.0# 美国 0.570564785973# 奚传武 0.510738424509# 单位 0.472841889334# 讲座 0.443770732053

写在文后

自然语言处理(NLP)在数据分析领域有其特殊的应用,在R中除了jiebaR包,中文分词Rwordseg包也非常常用。一般的文本挖掘步骤包括:文本获取(主要用网络爬取)——文本处理(分词、词性标注、删除停用词等)——文本分析(主题模型、情感分析)——分析可视化(词云、知识图谱等)。本文是自然语言处理的第一篇,后续将分别总结下应用深度学习Word2vec进行词嵌入以及主题模型、情感分析的常用NLP方法。

参考资料

Introduction · jiebaR 中文分词 https://qinwenfeng.com/jiebaR/segment.html

知乎:【文本分析】利用jiebaR进行中文分词 https://zhuanlan.zhihu.com/p/24882048

雪晴数据网:全栈数据工程师养成攻略 http://www.xueqing.tv/course/73

搜狗实验室,词性标注应用 http://www.sogou.com/labs/webservice/

【R文本挖掘】中文分词Rwordseg http://blog.163.com/zzz216@yeah/blog/static/162554684201412895732586/

“结巴”分词是一个Python 中文分词组件,参见 https://github.com/fxsjy/jieba

可以对中文文本进行 分词、词性标注、关键词抽取 等功能,并且支持自定义词典。

本文包括以下内容:

1、jieba分词包的 安装

2、jieba分词的 使用教程

3、jieba分词的 工作原理与工作流程

4、jieba分词所涉及到的 HMM、TextRank、TF-IDF等算法介绍

可以直接使用pip来进行安装:

sudo pip install jieba

或者

sudo pip3 install jieba

关键词抽取有两种算法,基于TF-IDF和基于TextRank:

jieba分词有三种不同的分词模式: 精确模式、全模式和搜索引擎模式

对应的,函数前加l即是对应得到list结果的函数:

精确模式是最常用的分词方法,全模式会将句子中所有可能的词都列举出来,搜索引擎模式则适用于搜索引擎使用。具体的差别可在下一节工作流程的分析中详述。

在上述每个函数中,都有名为HMM的参数。这一项表示是否在分词过程中利用HMM进行新词发现。关于HMM,本文附录中将简述相关知识。

另外分词支持自定义字典,词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。

具体使用方法为:

关键词抽取的两个函数的完整参数为:

可以通过

来打开或关闭并行分词功能。

个人感觉一般用不到,大文件分词需要手动实现多进程并行,句子分词也不至于用这个。

jieba分词主要通过词典来进行分词及词性标注,两者使用了一个相同的词典。正因如此,分词的结果优劣将很大程度上取决于词典,虽然使用了HMM来进行新词发现。

jieba分词包整体的工作流程如下图所示:

下面将根据源码详细地分析各个模块的工作流程。

在之后几节中,我们在 蓝色的方框 中示范了关键步骤的输出样例或词典文件的格式样例。在本节中都采用类似的表示方式。

jieba分词中,首先通过对照典生成句子的 有向无环图 ,再根据选择的模式不同,根据词典 寻找最短路径 后对句子进行截取或直接对句子进行截取。对于未登陆词(不在词典中的词)使用 HMM 进行新词发现。

词典的格式应为

word1 freq1 word_type1

word2 freq2 word_type2

其中自定义用户词典中词性word_type可以省略。

词典在其他模块的流程中可能也会用到,为方便叙述,后续的流程图中将会省略词典的初始化部分。

图b演示了搜索引擎模式的工作流程,它会在精确模式分词的基础上,将长词再次进行切分。

在这里我们假定读者已经了解HMM相关知识,如果没有可先行阅读下一章内容中的HMM相关部分或者跳过本节。

在jieba分词中,将字在词中的位置B、M、E、S作为隐藏状态,字是观测状态,使用了词典文件分别存储字之间的表现概率矩阵(finalseg/prob_emit.py)、初始概率向量(finalseg/prob_start.py)和转移概率矩阵(finalseg/prob_trans.py)。这就是一个标准的 解码问题 ,根据概率再利用 viterbi算法 对最大可能的隐藏状态进行求解。

词性分析部分与分词模块用了同一个基础的分词器,对于词典词的词性,将直接从词典中提取,但是对于新词,词性分析部分有一个 专属的新词及其词性的发现模块

用于词性标注的HMM模型与用于分词的HMM模型相似,同样将文字序列视为可见状态,但是隐藏状态不再是单单的词的位置(B/E/M/S),而变成了词的位置与词性的组合,如(B,v)(B,n)(S,n)等等。因此其初始概率向量、转移概率矩阵和表现概率矩阵和上一节中所用的相比都要庞大的多,但是其本质以及运算步骤都没有变化。

具体的工作流程如下图所示。

jieba分词中有两种不同的用于关键词抽取的算法,分别为TextRank和TF-IDF。实现流程比较简单,其核心在于算法本身。下面简单地画出实现流程,具体的算法可以参阅下一章内容。

TextRank方法默认筛选词性,而TF-IDF方法模型不进行词性筛选。

在本章中,将会简单介绍相关的算法知识,主要包括用于新词发现的 隐马尔科夫模型 维特比算法 、用于关键词提取的 TextRank TF-IDF 算法。

HMM即隐马尔科夫模型,是一种基于马尔科夫假设的统计模型。之所以为“隐”,是因为相较于马尔科夫过程HMM有着未知的参数。在世界上,能看到的往往都是表象,而事物的真正状态往往都隐含在表象之下,并且与表象有一定的关联关系。

其中,S、O分别表示状态序列与观测序列。

如果读者还对这部分内容心存疑问,不妨先往下阅读,下面我们将以一个比较简单的例子对HMM及解码算法进行实际说明与演示,在读完下一小节之后再回来看这些式子,或许能够恍然大悟。

下面以一个简单的例子来进行阐述:

假设小明有一个网友小红,小红每天都会在朋友圈说明自己今天做了什么,并且假设其仅受当天天气的影响,而当天的天气也只受前一天天气的影响。

于小明而言,小红每天做了什么是可见状态,而小红那里的天气如何就是隐藏状态,这就构成了一个HMM模型。一个HMM模型需要有五个要素:隐藏状态集、观测集、转移概率、观测概率和初始状态概率。

即在第j个隐藏状态时,表现为i表现状态的概率。式中的n和m表示隐藏状态集和观测集中的数量。

本例中在不同的天气下,小红要做不同事情的概率也不同, 观测概率 以表格的形式呈现如下:

其中

除此之外,还需要一个初始状态概率向量π,它表示了观测开始时,即t=0时,隐藏状态的概率值。本例中我们指定 π={0,0,1}

至此,一个完整的 隐马尔科夫模型 已经定义完毕了。

HMM一般由三类问题:

概率计算问题 ,即给定 A,B,π 和隐藏状态序列,计算观测序列的概率;

预测问题 ,也成解码问题,已知 A,B,π 和观测序列,求最优可能对应的状态序列;

学习问题 ,已知观测序列,估计模型的 A,B,π 参数,使得在该模型下观测序列的概率最大,即用极大似然估计的方法估计参数。

在jieba分词中所用的是解码问题,所以此处对预测问题和学习问题不做深入探讨,在下一小节中我们将继续以本节中的例子为例,对解码问题进行求解。

在jieba分词中,采用了HMM进行新词发现,它将每一个字表示为B/M/E/S分别代表出现在词头、词中、词尾以及单字成词。将B/M/E/S作为HMM的隐藏状态,而连续的各个单字作为观测状态,其任务即为利用观测状态预测隐藏状态,并且其模型的 A,B,π 概率已经给出在文件中,所以这是一个标准的解码问题。在jieba分词中采用了 Viterbi算法 来进行求解。

Viterbi算法的基本思想是: 如果最佳路径经过一个点,那么起始点到这个点的路径一定是最短路径,否则用起始点到这点更短的一条路径代替这段,就会得到更短的路径,这显然是矛盾的;从起始点到结束点的路径,必然要经过第n个时刻,假如第n个时刻有k个状态,那么最终路径一定经过起始点到时刻n中k个状态里最短路径的点

将时刻t隐藏状态为i所有可能的状态转移路径i1到i2的状态最大值记为

下面我们继续以上一节中的例子来对viterbi算法进行阐述:

小明不知道小红是哪里人,他只能通过小红每天的活动来推断那里的天气。

假设连续三天,小红的活动依次为:“睡觉-打游戏-逛街”,我们将据此计算最有可能的天气情况。

表示第一天为雨天能够使得第二天为晴天的概率最大(也就是说如果第二天是晴天在最短路径上的话,第一天是雨天也一定在最短路径上,参见上文中Viterbi算法的基本思想)

此时已经到了最后的时刻,我们开始回溯。

其计算过程示意图如下图所示。

)的路径。

TF-IDF(词频-逆文本频率)是一种用以评估字词在文档中重要程度的统计方法。它的核心思想是,如果某个词在一篇文章中出现的频率即TF高,并且在其他文档中出现的很少,则认为这个词有很好的类别区分能力。

其中:

TextRank是一种用以关键词提取的算法,因为是基于PageRank的,所以先介绍PageRank。

PageRank通过互联网中的超链接关系确定一个网页的排名,其公式是通过一种投票的思想来设计的:如果我们计算网页A的PageRank值,那么我们需要知道哪些网页链接到A,即首先得到A的入链,然后通过入链给网页A进行投票来计算A的PR值。其公式为:

其中:

d为阻尼系数,取值范围为0-1,代表从一定点指向其他任意点的概率,一般取值0.85。

将上式多次迭代即可直到收敛即可得到结果。

TextRank算法基于PageRank的思想,利用投票机制对文本中重要成分进行排序。如果两个词在一个固定大小的窗口内共同出现过,则认为两个词之间存在连线。

公式与PageRank的基本相同。多次迭代直至收敛,即可得到结果。

在jieba分词中,TextRank设定的词窗口大小为5,将公式1迭代10次的结果作为最终权重的结果,而不一定迭代至收敛。