自然语言处理-HMM-维特比算法推导句子词性

维特比算法在HMM解决的是Inference/decoding 问题。
即:
给定一句话以后,推导 出来每个单词的词性是什么

下面做一道题来练练手:
在这里插入图片描述
在这里插入图片描述
画出该句子的词格图:
在这里插入图片描述
代码实现:

import numpy as np

input_lattice = ['Noun', 'Verb', 'Adj']
input_word = ['coffee', 'takes', 'free']

input_transition_probability = [[0.4, 0.5, 0.1],
                                [0.4, 0.1, 0.2],
                                [0.5, 0.2, 0.3]]
input_emission_probability = [[0.3, 0.3, 0.4],
                              [0.2, 0.4, 0.4],
                              [0.5, 0.1, 0.4]]


def solution(input_sentence):
    input_sentence_length = len(input_sentence)
    input_lattice_length = len(input_lattice)

    dp = np.zeros((input_lattice_length, input_sentence_length))
    max_path = [-1 for i in range(input_sentence_length)]

    for i in range(input_lattice_length):
        # initiate probability
        dp[i][0] = input_emission_probability[i][0] * 1/3
    # iterate every words
    for j in range(1, input_sentence_length):
        # iterate every lattice
        max_probability_current = -1
        for i in range(input_lattice_length):
            # iterate every lattice to select the max probability of the previous words
            for k in range(input_lattice_length):
                temp_probability = (dp[k][j - 1]) * (input_transition_probability[k][i]) * (
                    input_emission_probability[i][j])
                if dp[i][j] < temp_probability:
                    dp[i][j] = temp_probability

    # find max probability and max path
    max_probability = -1
    for j in range(input_sentence_length):
        max_probability_column = -1
        for i in range(input_lattice_length):
            if j == (input_sentence_length - 1):
                if max_probability < dp[i][input_sentence_length - 1]:
                    max_probability = dp[i][input_sentence_length - 1]
                    max_path[j] = i
            else:
                if max_probability_column < dp[i][j]:
                    max_probability_column = dp[i][j]
                    max_path[j] = i
    return max_path, max_probability


# test
sentence = ['coffee', 'takes', 'free']

print(solution(sentence))

维特比算法理解:
在这里插入图片描述
执行结果:([2, 0, 1], 0.005)

这个题里面给的概率参数不是很好,所以计算出来的单词词性分别为:
coffee 副词,takes名词,free动词
概率为:0.005

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值