2020/11/18 python实现词性标注(含词库文件)
文章目录
- 问题描述
- 问题分析
- 求解步骤
- 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实现词性标注(含词库文件)相关推荐
- 用Python读取轻轻松松背单词的GDS词库文件
<轻轻松松背单词>是一个广泛使用的背单词软件,有丰富的词库资源.读取轻轻松松背单词GDS词库文件,可以在此基础上开发背单词类软件. #--------------------------- ...
- Windows系统错误提示:缺少词库文件winabc.cwd缺少基础表文件winabc.ovl
错误现象: Windows系统错误提示:缺少词库文件winabc.cwd缺少基础表文件winabc.ovl 解决办法: 1.右键输入法,点击设置: 2.删除现有输入法,重新安装对应的输入法,注销或者重 ...
- 从搜狗获取行业词库并转换成jieba可用的词库文件
从搜狗获取行业词库并转换成jieba可用的词库文件 从搜狗获取行业词库 利用网站在线转换 利用Django建立网站 从搜狗获取行业词库 搜狗官方的词库地址 下载下来后是.scel扩展名的文件 利用网站 ...
- 最新最全的stardict词库文件.
各位同学中,使用有道桌面词典的一定不少吧, 是不是觉得自己的词典查的东西不够专业,不够详细? 从下面的词库中添加适合的你... 享受吧.. Stardict 中文词库文件 朗道英汉字典5.0 4354 ...
- python学习笔记(自定义库文件路径)
博主最近在弄接口自动化.主要是基于python自带的unittest框架.包括 Pubilc模块定义所有接口. Main模块根据业务需求重新封装接口便于测试. config文件导入测试业务的固定参数. ...
- 2020.11.18重回ArcGIS
作为一个大龄小白,想要成为数据分析师,难比登山.总觉得自己不应只定位为一名专技人员,在山脚下转悠了若干年愣是不爬,除了有朝一日登上山顶的梦想,剩下的也只有梦想.这两天,终于下定决心,重新捡回鄙弃了很久 ...
- python列表和字典_2020/11/18 python学习第5课 列表和字典
python学习第5课 列表和字典 课程目标 熟练掌握列表.字典中元素的增删改查 理解列表和字典的区别 课程难点 列表与字典增删改查的异同 正确使用切片,深刻理解切片时冒号左右数字的意义 课程知识点总 ...
- 立冬穿短袖,生活不将就 2020.11.18日记
生活日记 今天的温度依然持续走高,最高温度竟然直接飙到了28°.中午去拿外卖的路上直接把我热到了,回来把外套.长袖都脱了,换上了刚放进行李箱里面的短袖.谁能想到在十一月中下旬我竟然又穿上了短袖.活这么 ...
- Vue——v-show的使用——2020.11.18
一丶v-show (一)v-show的用法和v-if非常相似,也用于决定一个元素是否渲染 (二)v-if和v-show都可以决定一个元素是否渲染,那么开发中我们如何选择呢? v-if当条件为false ...
最新文章
- 位序、字节序、类型序
- python字符串常量_python教程---字符串常量ascii_letters、punctuation、digits、whitespace等...
- Xamarin图表开发基础教程(4)OxyPlot框架
- 速卖通现在好做吗?深耕产品供应,优化售后发货才能走的更远
- AV1:为互联网提供开放、免费的视频编解码工具
- artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
- linux 信号_[入门]谈一谈Linux中的信号
- 滴滴定制网约车D1即将登陆长沙 市民12月中可叫到
- 最好看的css样式文字,二十款漂亮的CSS字体样式
- 软件测试方法和技术有哪些?
- WeChat for Linux
- chmod 755 究竟是什么鬼
- 雷达多普勒频率计算公式_手持式雷达电波流速仪应用
- AutoCAD 天正建筑2014安装破解
- 微信公众号采集 php,如何采集微信公众号历史消息页的详解
- win7忘记开机密码怎么弄?
- 博士生导师谈他如何检索文献
- 线性回归系数的几个性质
- python多进程爬取上海房价并画出热力图分析
- 北师大 马原 自测题复习
热门文章
- java线上培训班,附Java面经
- @RequestMapping 和 @GetMapping 、@PostMapping 的区别(详解)
- 【JS逆向】xx社区 帖子 请求参数加密(nonce)
- Linux史上最全教程
- vue 雷达扫描_Qt自定义控件之仪表盘3–雷达扫描图
- Java语言的基础知识
- 计算机网络中分组交换的要点是什么,【分组交换的要点】_试简述分组交换的要点_02、试简述分组交换的要点。...
- JSTL的jar包问题
- win10系统的字体突然变成繁体字?解決微軟鍵盤那些坑
- DotNet Bar 之 bubbleBar 使用方法