python结巴分词函数 python 结巴分词( 三 )


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

推荐阅读