维特比算法

维特比算法 实现中文分词 python实现

半腔热情 提交于 2020-01-06 16:39:11
本文转载自: https://zhuanlan.zhihu.com/p/58163299 最近我在学习自然语言处理,相信大家都知道NLP的第一步就是学分词,但分词≠自然语言处理。现如今 分词工具 及如何使用网上一大堆。我想和大家分享的是结巴分词核心内容,一起探究分词的本质。 (1)、基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 什么是DAG(有向无环图)? 例如,句子“去北京大学玩”对应的DAG为{0:[0], 1:[1,2,4], 2:[2], 3:[3,4], 4:[4], 5:[5]}。DAG中{0:[0]}就表示0位置对应的是词,就是说0~0,即“去”这个词在Dict(词典库,里面记录每个词的频次)中是词条。DAG中{1:[1,2,4]},就是表示从1位置开始,在1,2,4位置都是词,就是说1~1、1~2、1~4即“北”“北京”“北京大学”这三个也是词,出现在Dict中。句子“去北京大学玩”的DAG毕竟比较短可以一眼看出来,现在来了另外一个句子“经常有意见分歧”,如何得到它的DAG呢?这时候就得通过代码来实现了。 Dict= {"经常":0.1,"经":0.05,"有":0.1, "常":0.001,"有意见":0.1, "歧":0.001,"意见":0.2,"分歧":0.2,"见":0.05,"意":0.05,"见分歧":0.05,"分

隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列

断了今生、忘了曾经 提交于 2019-12-22 00:50:40
    隐马尔科夫模型HMM(一)HMM模型基础      隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率      隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数      隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列     隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用。当然,随着目前深度学习的崛起,尤其是 RNN , LSTM 等神经网络序列模型的火热,HMM的地位有所下降。但是作为一个经典的模型,学习HMM的模型和对应算法,对我们解决问题建模的能力提高以及算法思路的拓展还是很好的。本文是HMM系列的第一篇,关注于HMM模型的基础。 1. 什么样的问题需要HMM模型     首先我们来看看什么样的问题解决可以用HMM模型。使用HMM模型时我们的问题一般有这两个特征:1)我们的问题是基于序列的,比如时间序列,或者状态序列。2)我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。     有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在键盘上敲出来的一系列字符就是观测序列

HMM隐马尔可夫模型详解

折月煮酒 提交于 2019-12-06 14:14:24
1 隐马尔可夫模型HMM 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用。 当然,随着目前深度学习的崛起,尤其是 RNN , LSTM 等神经网络序列模型的火热,HMM的地位有所下降。 但是作为一个经典的模型,学习HMM的模型和对应算法,对我们解决问题建模的能力提高以及算法思路的拓展还是很好的。 1.1 什么样的问题需要HMM模型 首先我们来看看什么样的问题解决可以用HMM模型。 使用HMM模型时我们的问题一般有这两个特征: 1)我们的问题是基于序列的,比如时间序列,或者状态序列。 2)我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。 有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了。再举一个,我在和你说话,我发出的一串连续的声音就是观测序列,而我实际要表达的一段话就是状态序列,你大脑的任务

维特比算法

馋奶兔 提交于 2019-12-06 04:41:43
维特比算法 (英语: Viterbi algorithm ) 是一种动态规划算法。它用于寻找最有可能产生观测事件序列的 维特比路径 ——隐含状态序列。 即,根据观察到的现象,推断出最可能的隐藏实质 例:医生每天问诊病人 states = ('Healthy', 'Fever') #病人要么健康要么发烧 observations = ('normal', 'cold', 'dizzy') #感觉良好/冷/头晕 start_probability = {'Healthy': 0.6, 'Fever': 0.4} #第一天可能的状态transition_probability = { 'Healthy' : {'Healthy': 0.7, 'Fever': 0.3}, #接下来一天可能的状态 'Fever' : {'Healthy': 0.4, 'Fever': 0.6}, } emission_probability = { 'Healthy' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1}, #不同状况对应可能的症状 'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6}, } 根据病人数天问诊得到的症状,如{ 良好, 冷, 头晕 },来推断其可能的状态 来源: https://www

维特比算法及python实现

霸气de小男生 提交于 2019-12-03 14:47:54
先放一张找到的算法流程图: 上图解释 : A:状态转移概率矩阵,Aij表示状态i到状态j转换的概率,即P(state=j | state=i)。下面代码中以P表示。 B:观测矩阵,Bij表示给定状态i,观测结果为j的概率。即P(observation=j | state=i) π:初始时状态概率分布,表示各状态出现的概率。代码中以pi表示。 O:输入的观测序列。 :表示经过节点(时刻t,状态state=i)的局部最优路径到此节点时对应的概率,即给定X=(x1,...xt,...xn)子序列(x1,x2,...xt)时,对应的最佳状态序列(末状态state=i)的概率值。 下面代码中以delta表示 :跟上面相关。表示上面最优路径经过的节点的上一个状态id。下面代码中以w表示。 1式理解:右边为状态state=i出现的概率乘以(状态i下观测到O[t=1]的概率) 2式理解:当前节点概率值,为(上一时刻各节点概率值乘以状态转换概率)的最大值,再乘以状态state=i时观测到O[t]的概率。这就是 动态规划 的思想了。 以上,熟悉 隐马尔可夫模型 的话,理解应该没问题了。 ------------------------------------------------------------------------- 下面进入代码部分: import numpy as np def my