Jiebe学习笔记:viterbi算法

标签: jieba 词性标注
2人阅读 评论(0) 收藏 举报
分类:

    词性标注:

    Jieba的词性标注模块仍然采用基于HMM模型的viterbi算法,在状态的描述上应用({BMES},词性)二元对。状态集合为{BMSE}这四个词位与词性(39类)的笛卡尔积,也就是有156种状态。

    从文本的起始位置开始逐字扫描,判断每个字可能的状态,与状态转移得到的期待状态求与,也就是下一个字可能的状态。与的结果是空集时以期待状态为下一个字的状态,期待状态集为空时,以整个状态集为其状态。

    

def viterbi(obs, states, start_p, trans_p, emit_p):#obs:待处理文本,states,文字可能的状态集,start_p:初始概率,
    V = [{}]  # tabular
    mem_path = [{}]
    all_states = trans_p.keys()
    for y in states.get(obs[0], all_states):  # init
    #get返回turple,表示首字所有可能的状态
        V[0][y] = start_p[y] + emit_p[y].get(obs[0], MIN_FLOAT)
        mem_path[0][y] = ''
    for t in xrange(1, len(obs)):
        V.append({})
        mem_path.append({})
        #prev_states = get_top_states(V[t-1])
        prev_states = [
            x for x in mem_path[t - 1].keys() if len(trans_p[x]) > 0]
        #如果下一状态集不为空,x为上一状态
        prev_states_expect_next = set(
            (y for x in prev_states for y in trans_p[x].keys()))
        #y:下一步可能的状态
        obs_states = set(
            states.get(obs[t], all_states)) & prev_states_expect_next
        #汉字可能的状态与期待状态的交
        if not obs_states:
            obs_states = prev_states_expect_next if prev_states_expect_next else all_states

        for y in obs_states:
            prob, state = max((V[t - 1][y0] + trans_p[y0].get(y, MIN_INF) +
                               emit_p[y].get(obs[t], MIN_FLOAT), y0) for y0 in prev_states)
            V[t][y] = prob
            mem_path[t][y] = state

    last = [(V[-1][y], y) for y in mem_path[-1].keys()]
    # if len(last)==0:
    #     print obs
    prob, state = max(last)

    route = [None] * len(obs)
    i = len(obs) - 1
    while i >= 0:
        route[i] = state
        state = mem_path[i][state]
        i -= 1
    return (prob, route)

查看评论

数据结构和算法

-
  • 1970年01月01日 08:00

自然语言处理系列之Viterbi算法

前面已经介绍了隐马尔可夫模型,本篇博文主要是介绍用 viterbi 算法来解决 HMM 中的预测问题,也称为解码问题。   维特比算法实际是用动态规划解隐马尔可夫模型预测问题,即用动态规划(dyna...
  • lionel_fengj
  • lionel_fengj
  • 2017-04-16 17:37:04
  • 1376

viterbi,维特比算法通俗理解

维特比算法说白了就是动态规划实现最短路径,只要知道“动态规划可以降低复杂度”这一点就能轻松理解维特比算法 维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一个图中的最...
  • pianistOfSoftware
  • pianistOfSoftware
  • 2016-07-24 14:25:11
  • 2667

HMM之Viterbi算法

注:本文中所有公式和思路来自于邹博先生的《机器学习升级版》,我只是为了加深记忆和理解写的本文。 我们在前边简单介绍过一个预测的近似方法,就是在每个时刻选择出最有可能出现的状态,从而得到一个状...
  • u012771351
  • u012771351
  • 2016-11-10 14:39:08
  • 864

HMM的应用与Forward算法、Viterbi算法

隐马尔科夫模型(HMM)是机器学习中的一种重要技术,也是一种PGM。HMM在自然语言处理、图像处理和计算机视觉等领域都有重要应用。而要深入了解HMM,就不得不谈到用于评估、预测和 Decoding 的...
  • baimafujinji
  • baimafujinji
  • 2016-05-06 15:04:57
  • 11198

viterbi算法linux下C++实现

算法介绍见博客:http://www.cnblogs.com/tornadomeet/archive/2012/03/24/2415889.html,实现结果与他一样,下面是我的实现细节: 一 程序整...
  • leijunan
  • leijunan
  • 2014-12-05 11:00:21
  • 977

Viterbi 算法应用实现

算法简介: Viterbi算法又叫维特比算法,其是HMM模型中在给出观测序列O,以及状态转移举证M 和 状态-观测矩阵Q之后,求解能够最佳解释序列O的状态序列S的一种动态规划算法。 如果你觉得句子太长...
  • u011531384
  • u011531384
  • 2014-12-19 20:36:04
  • 898

论Viterbi算法

[摘要]虽然Texas Instrument推出的C6000系列DSP使对信号处理的能力显著提高,但对信息处理能力要求的不断提升使提对DSP程序的优化越来越成为DSP开发工作中非常重要的环节。本文讨论...
  • caiyd08
  • caiyd08
  • 2009-12-22 11:45:00
  • 5008

HMM——维特比算法(Viterbi algorithm)

本文修正了原创里面的一些错误。
  • zb1165048017
  • zb1165048017
  • 2015-09-19 19:39:41
  • 6994

python实现viterbi算法

states = ('Healthy', 'Fever') observations = ('normal', 'cold', 'dizzy') start_probability = {'Hea...
  • xinfeng2005
  • xinfeng2005
  • 2018-01-10 15:17:22
  • 71
    个人资料
    等级:
    访问量: 1
    积分: 10
    排名: 356万+
    文章分类
    文章存档