NLP作业01:请利用HMM实现词性标注

NLP作业01:请利用HMM实现词性标注

一、作业头

这个作业属于哪个课程自然语言处理
这个作业要求在哪里http://t.csdn.cn/i8JBu
我在这个课程的目标是通过对这门课程的学习,掌握词法分析相关的技术、句法分析技术,能够熟练运用常用的分类算法、聚类算法以及深度学习算法解决自然语言处理中的工程应用问题,掌握语言信息处理的技能,为后面的学习打下坚实的理论和实践基础。
这个作业在哪个具体方面帮助我实现目标通过HMM算法模型来词性标注的有关问题,帮助我实现目标
参考文献1. https://zhuanlan.zhihu.com/p/359831957 2. https://zhuanlan.zhihu.com/p/112381092 3.https://zhuanlan.zhihu.com/p/540723944

二、对HMM模型进行介绍

  1. 定义:指的是一个隐层的马尔可夫链(MC)随机生成不可观测的状态序列,再由状态序列生成可观测的观测序列的过程。
  2. 隐马尔科夫模型由初始状态概率向量Π 、状态转移矩阵 A和观测概率矩阵B 决定。Π和 A决定状态序列,B决定观测序列。因此,隐马尔科夫模型 可以用三元符号表示,即
    -------------------------------------------- λ = (A,B,Π)------------------------------------------
    A,B,Π 称为隐马尔科夫模型的三要素。

三、 估计HMM的模型参数

这里采用「1998人民日报词性标注语料库」进行模型的训练,包括44个基本词性以及19484个句子。具体可以参考这里:https://www.heywhale.com/mw/dataset/5ce7983cd10470002b334de3
首先将每个句子预处理成下面的格式: [(word,tag), … , (word,tag)]

>>>print(sentences[:3])
[
  [('据悉', 'v'), (',', 'w'), ('在', 'p'), ('’', 'w'), ('97', 'm'), ('中国', 'ns'), ('旅游年', 'n'), ('基础', 'n'), ('上', 'f'), ('推出', 'v'), ('的', 'u'), ('’', 'w'), ('98', 'm'), ('华夏', 'n'), ('城乡游', 'n'), (',', 'w'), ('将', 'd'), ('分', 'v'), ('“', 'w'), ('古城', 'n'), ('新貌', 'n'), ('”', 'w'), ('和', 'c'), ('“', 'w'), ('乡村', 'n'), ('旅游', 'v'), ('”', 'w'), ('两', 'm'), ('个', 'q'), ('专题', 'n'), (',', 'w'), ('向', 'p'), ('海内外', 's'), ('游客', 'n'), ('全面', 'ad'), ('展示', 'v'), ('改革', 'v'), ('开放', 'v'), ('20', 'm'), ('年', 'q'), ('来', 'f'), ('我国', 'n'), ('城乡', 'n'), ('的', 'u'), ('巨变', 'vn'), ('。', 'w')], 
  [('冰雕', 'n'), ('童话', 'n'), ('世界', 'n'), ('(', 'w'), ('图片', 'n'), (')', 'w')], 
  [('新年', 't'), ('来临', 'v'), (',', 'w'), ('冰城', 'ns'), ('哈尔滨市', 'ns'), ('儿童', 'n'), ('公园', 'n'), ('为', 'p'), ('孩子', 'n'), ('们', 'k'), ('准备', 'v'), ('了', 'u'), ('特殊', 'a'), ('的', 'u'), ('贺岁', 'vn'), ('礼物', 'n'), ('———', 'w'), ('冰雕', 'n'), ('童话', 'n'), ('世界', 'n'), ('。', 'w'), ('这里', 'r'), ('包括', 'v'), ('未来', 't'), ('世界', 'n'), ('、', 'w'), ('世界', 'n'), ('奇观', 'n'), ('、', 'w'), ('迷宫', 'n'), ('等', 'u'), ('十', 'm'), ('大', 'a'), ('景区', 'n'), (',', 'w'), ('展出', 'v'), ('各种', 'r'), ('冰雕', 'n'), ('作品', 'n'), ('千', 'm'), ('余', 'm'), ('件', 'q'), ('。', 'w'), ('图', 'n'), ('为', 'v'), ('从事', 'v'), ('教育', 'vn'), ('工作', 'vn'), ('的', 'u'), ('姜', 'nr'), ('雁', 'nr'), ('(', 'w'), ('左', 'f'), (')', 'w'), ('正', 'd'), ('向', 'p'), ('6', 'm'), ('岁', 'q'), ('的', 'u'), ('儿子', 'n'), ('万万', 'nr'), ('讲', 'v'), ('恐龙', 'n'), ('的', 'u'), ('故事', 'n'), ('。', 'w')]
]

根据数据估计HMM的模型参数,这里直接采用频率估计概率的方法,但是对于
Π, A, B 会存在大量的0,所以需要进一步采用拉普拉斯平滑处理。

# 统计words和tags
words = set()
tags = set()
for words_with_tag in sentences:
    for word_with_tag in words_with_tag:
        word, tag = word_with_tag
        words.add(word)
        tags.add(tag)
words = list(words)
tags = list(tags)
# 统计 词性到词性转移矩阵A 词性到词转移矩阵B 初始向量pi
# 先初始化
A = {tag: {tag: 0 for tag in tags} for tag in tags}
B = {tag: {word: 0 for word in words} for tag in tags}
pi = {tag: 0 for tag in tags}
# 统计A,B
for words_with_tag in sentences:
    head_word, head_tag = words_with_tag[0]
    pi[head_tag] += 1
    B[head_tag][head_word] += 1
    for i in range(1, len(words_with_tag)):
        A[words_with_tag[i-1][1]][words_with_tag[i][1]] += 1
        B[words_with_tag[i][1]][words_with_tag[i][0]] += 1
# 拉普拉斯平滑处理并转换成概率
sum_pi_tag = sum(pi.values())
for tag in tags:
    pi[tag] = (pi[tag] + 1) / (sum_pi_tag + len(tags))
    sum_A_tag = sum(A[tag].values())
    sum_B_tag = sum(B[tag].values())
    for next_tag in tags:
        A[tag][next_tag] = (A[tag][next_tag] + 1) / (sum_A_tag + len(tags))
    for word in words:
        B[tag][word] = (B[tag][word] + 1) / (sum_B_tag + len(words))

四、基于维特比算法进行解码

维特比算法是用动态规划(dynamic programming)解隐马尔科夫模型预测问题,即用动态规划求概率最大路径(最优路径)。

def decode_by_viterbi(sentence):
    words = sentence.split()
    sen_length = len(words)
    T1 = [{tag: float('-inf') for tag in tags} for i in range(sen_length)]
    T2 = [{tag: None for tag in tags} for i in range(sen_length)]
    # 先进行第一步
    for tag in tags:
        T1[0][tag] = math.log(pi[tag]) + math.log(B[tag][words[0]])
    # 继续后续解码
    for i in range(1, sen_length):
        for tag in tags:
            for pre_tag in tags:
                current_prob = T1[i-1][pre_tag] + math.log(A[pre_tag][tag]) + math.log(B[tag][words[i]])
                if current_prob > T1[i][tag]:
                    T1[i][tag] = current_prob
                    T2[i][tag] = pre_tag
    # 获取最后一步的解码结果
    last_step_result = [(tag, prob) for tag, prob in T1[sen_length-1].items()]
    last_step_result.sort(key=lambda x: -1*x[1])
    last_step_tag = last_step_result[0][0]
    # 向前解码
    step = sen_length - 1
    result = [last_step_tag]
    while step > 0:
        last_step_tag = T2[step][last_step_tag]
        result.append(last_step_tag)
        step -= 1
    result.reverse()
    return list(zip(words, result))

五、 词性标注结果

decode_by_viterbi('我 和 我 的 祖国')
[('我', 'r/代词'), 
 ('和', 'c/连词'), 
 ('我', 'r'/代词), 
 ('的', 'u'/助词), 
 ('祖国', 'n'/名词)]
 
decode_by_viterbi('中国 经济 迅速 发展 , 对 世界 经济 贡献 很 大') 
[('中国', 'ns/地名'),
 ('经济', 'n/名词'),
 ('迅速', 'ad/形容词'),
 ('发展', 'v/动词'),
 (',', 'w/其他'),
 ('对', 'p/介词'),
 ('世界', 'n/名词'),
 ('经济', 'n/名词'),
 ('贡献', 'n/名词'),
 ('很', 'd'/副词),
 ('大', 'a'/形容词)]

可以看到基本都是正确的,根据文献HMM一般中文词性标注的准确率能够达到85%以上 。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值