文章目录

  • 问题描述
  • 问题分析
  • 求解步骤
    • 1.读取词库traindata.txt,统计出四个字典:tag2id,id2tag,word2id,id2word
    • 2.计算hmm模型的三个参数(A, B, π)
    • 3. viterbi算法预测句中词的词性
      • 3.1 分析
      • 3.2 代码示例
  • 4 推荐文章

问题描述

给定词库traindata.txt(提取码为r9px),预测字符串x = 'The ad is increasing .'的词性。

问题分析

根据博客https://www.cnblogs.com/pinking/p/8531405.html的内容可知,这是一个典型的hmm预测问题。因此我们需要先基于词库,计算出hmm模型的三个参数(A, B, π),然后使用viterbi算法进行词性预测。

求解步骤

1.读取词库traindata.txt,统计出四个字典:tag2id,id2tag,word2id,id2word

代码如下:

import numpy as np
tag2id,id2tag={},{}
word2id,id2word={},{}
with open('traindata.txt','r') as f:for line in f.readlines():items=line.split('/')word,tag=items[0],items[1].rstrip()if word not in word2id.keys():word2id[word]=len(word2id)id2word[len(id2word)]=wordif tag not in tag2id.keys():tag2id[tag]=len(tag2id)id2tag[len(id2tag)]=tag

得到的四个字典的形式如下图所示:

2.计算hmm模型的三个参数(A, B, π)

word_number=len(word2id)
tag_number=len(tag2id)
A = np.zeros((tag_number, word_number)) #发射矩阵
B=np.zeros((tag_number,tag_number))#状态转移矩阵
L=np.zeros(tag_number) #初始状态矩阵pre_tag=''
with open('traindata.txt','r') as f:for line in f.readlines():items=line.split('/')wordId,tagId=word2id[items[0]],tag2id[items[1].rstrip()]if pre_tag=='': #表示是在句首位置,此时统计发射矩阵和初始状态矩阵L[tagId]+=1A[tagId][wordId]+=1else: #表示在句中位置,此时统计发射矩阵和状态转移矩阵A[tagId][wordId] += 1B[tag2id[pre_tag]][tagId]+=1if items[0]=='.': #说明这个句子结束,到了下一个句子pre_tag=''else:pre_tag=items[1].rstrip()
#将矩阵中的值转换成概率
L/=sum(L)
for i in range(tag_number):A[i] /=sum(A[i])B[i] /=sum(B[i])

3. viterbi算法预测句中词的词性

3.1 分析

viterbi算法是一种动态规划的算法,其核心思想是:先求出起始位置到下一状态的最优路径,然后基于这个最优路径的值,继续求起始位置到下下一状态的最优路径,依此类推。当然每个最优化问题中“优”的评判标准不同。在词性标注问题中,其评判条件如下图箭头位置所示:

(图片引用于早期保存的某博客的学习笔记,链接忘记存了)
从上图可以看到,为了简化运算、并且放大概率值,公式对矩阵增加了log运算,这也是编码中需要注意的点。

3.2 代码示例

def log(v):if v==0: #为了避免np.log函数报错return np.log(0.00001)else:return np.log(v)
def viterbi(x,L,A,B):seq2id=[word2id[i] for i in x.split()]lay_number=len(seq2id)P=np.zeros((lay_number,tag_number))D=np.zeros((lay_number,tag_number))for i in range(tag_number):P[0][i]=log(L[i])+log(A[i][seq2id[0]])D[0][i]=-1for layer in range(1,lay_number,1):for i in range(tag_number): #当前节点probilities = []for j in range(tag_number):#前一个节点probilities.append(P[layer-1][j]+log(B[j][i])+log(A[i][seq2id[layer]]))P[layer][i] = np.max(probilities)D[layer][i] = np.argmax(probilities)best_seq=[0]*lay_numberbest_seq[lay_number-1]=np.argmax(P[lay_number-1])#反推出最优路径for layer in range(lay_number-2,-1,-1):best_seq[layer]=int(D[layer+1][int(best_seq[layer+1])])#求出最终的词性标注结果best_seq=[id2tag[best_seq[i]] for i in range(len(best_seq))]return best_seq

测试:

if __name__ == '__main__':x = 'The ad is increasing .'print("标注结果为:",viterbi(x,L,A,B))

运行结果如下:

4 推荐文章

[1] viterbi算法词性标注
[2] 维特比算法实现词性标注
[3] 课程讲解

2020/11/18 python实现词性标注(含词库文件)相关推荐

  1. 用Python读取轻轻松松背单词的GDS词库文件

    <轻轻松松背单词>是一个广泛使用的背单词软件,有丰富的词库资源.读取轻轻松松背单词GDS词库文件,可以在此基础上开发背单词类软件. #--------------------------- ...

  2. Windows系统错误提示:缺少词库文件winabc.cwd缺少基础表文件winabc.ovl

    错误现象: Windows系统错误提示:缺少词库文件winabc.cwd缺少基础表文件winabc.ovl 解决办法: 1.右键输入法,点击设置: 2.删除现有输入法,重新安装对应的输入法,注销或者重 ...

  3. 从搜狗获取行业词库并转换成jieba可用的词库文件

    从搜狗获取行业词库并转换成jieba可用的词库文件 从搜狗获取行业词库 利用网站在线转换 利用Django建立网站 从搜狗获取行业词库 搜狗官方的词库地址 下载下来后是.scel扩展名的文件 利用网站 ...

  4. 最新最全的stardict词库文件.

    各位同学中,使用有道桌面词典的一定不少吧, 是不是觉得自己的词典查的东西不够专业,不够详细? 从下面的词库中添加适合的你... 享受吧.. Stardict 中文词库文件 朗道英汉字典5.0 4354 ...

  5. python学习笔记(自定义库文件路径)

    博主最近在弄接口自动化.主要是基于python自带的unittest框架.包括 Pubilc模块定义所有接口. Main模块根据业务需求重新封装接口便于测试. config文件导入测试业务的固定参数. ...

  6. 2020.11.18重回ArcGIS

    作为一个大龄小白,想要成为数据分析师,难比登山.总觉得自己不应只定位为一名专技人员,在山脚下转悠了若干年愣是不爬,除了有朝一日登上山顶的梦想,剩下的也只有梦想.这两天,终于下定决心,重新捡回鄙弃了很久 ...

  7. python列表和字典_2020/11/18 python学习第5课 列表和字典

    python学习第5课 列表和字典 课程目标 熟练掌握列表.字典中元素的增删改查 理解列表和字典的区别 课程难点 列表与字典增删改查的异同 正确使用切片,深刻理解切片时冒号左右数字的意义 课程知识点总 ...

  8. 立冬穿短袖,生活不将就 2020.11.18日记

    生活日记 今天的温度依然持续走高,最高温度竟然直接飙到了28°.中午去拿外卖的路上直接把我热到了,回来把外套.长袖都脱了,换上了刚放进行李箱里面的短袖.谁能想到在十一月中下旬我竟然又穿上了短袖.活这么 ...

  9. Vue——v-show的使用——2020.11.18

    一丶v-show (一)v-show的用法和v-if非常相似,也用于决定一个元素是否渲染 (二)v-if和v-show都可以决定一个元素是否渲染,那么开发中我们如何选择呢? v-if当条件为false ...

最新文章

  1. 位序、字节序、类型序
  2. python字符串常量_python教程---字符串常量ascii_letters、punctuation、digits、whitespace等...
  3. Xamarin图表开发基础教程(4)OxyPlot框架
  4. 速卖通现在好做吗?深耕产品供应,优化售后发货才能走的更远
  5. AV1:为互联网提供开放、免费的视频编解码工具
  6. artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
  7. linux 信号_[入门]谈一谈Linux中的信号
  8. 滴滴定制网约车D1即将登陆长沙 市民12月中可叫到
  9. 最好看的css样式文字,二十款漂亮的CSS字体样式
  10. 软件测试方法和技术有哪些?
  11. WeChat for Linux
  12. chmod 755 究竟是什么鬼
  13. 雷达多普勒频率计算公式_手持式雷达电波流速仪应用
  14. AutoCAD 天正建筑2014安装破解
  15. 微信公众号采集 php,如何采集微信公众号历史消息页的详解
  16. win7忘记开机密码怎么弄?
  17. 博士生导师谈他如何检索文献
  18. 线性回归系数的几个性质
  19. python多进程爬取上海房价并画出热力图分析
  20. 北师大 马原 自测题复习

热门文章

  1. java线上培训班,附Java面经
  2. @RequestMapping 和 @GetMapping 、@PostMapping 的区别(详解)
  3. 【JS逆向】xx社区 帖子 请求参数加密(nonce)
  4. Linux史上最全教程
  5. vue 雷达扫描_Qt自定义控件之仪表盘3–雷达扫描图
  6. Java语言的基础知识
  7. 计算机网络中分组交换的要点是什么,【分组交换的要点】_试简述分组交换的要点_02、试简述分组交换的要点。...
  8. JSTL的jar包问题
  9. win10系统的字体突然变成繁体字?解決微軟鍵盤那些坑
  10. DotNet Bar 之 bubbleBar 使用方法