【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)

news2025/1/21 12:47:18

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

隐马尔可夫模型(HMM)是关于时序的概率模型,它可用于标注等问题中

基本思想

假设一个盒子里可以装两个骰子,骰子的种类有四面的和六面的两种。现在进行猜骰子实验,该实验由实验者和分析者完成。

实验者每次随机从盒子中取出一个骰子,然后补入一个另外种类的骰子。实验者记录下每次实验后盒子中不同种类骰子的数量,可得到一个盒子状态的序列。

实验者在每次实验后掷一次骰子,并将两个骰子的点数之和告诉他。于是分析者将得到一个数字序列,称为观察序列。

用盒子中四面骰子的数量来标记盒子的状态:若盒子中有k个四面骰子,则称系统处于状态k。显然盒子状态的取值空间为I={0,1,2}。

实验者在实验中能抓出什么骰子只与当前盒子的状态有关,而与盒子以前的状态无关。具有这种特性的序列,被称为具有马尔可夫性。

盒子状态的变化可以由所谓的初始概率和转移概率来确定。

初始概率是指盒子最初处于什么状态的概率。盒子可能出现的状态有0、1、2三种,假设两种骰子随机等概放入,那么三种状态出现的概率分别为0.25、0.5、0.25,用一个向量π=(π_0,π_1,π_2)=(0.25,0.5,0.25)来表示,称此向量为初始状态概率向量。

一步转移概率矩阵:

 

矩阵的横坐标表示当前状态,纵坐标表示下一步状态。 对分析者不可见的状态序列可以认为是由π和A依概率产生的。

分析者见到的观测值又是由状态值依据所谓的观测概率(或称为发射概率)产生的。

第1个状态为1,说明盒子中有一个四面的骰子和六面的骰子。此时,能掷出的点数分别为2、3、4、5、6、7、8、9、10共9个。用b_1(2)表示在状态1时观测到点数2的观测概率,可知:b_2(2)=1/4×1/6=1/24。

计算出所有观测概率,并写成矩阵形式,可得到观测概率矩阵:

 

 可见,隐马尔可夫模型是由π、A以及B依概率确定。π和A决定状态序列,B决定观测序列。记隐马尔可夫模型为λ,λ可以由三元符号表示,即:

λ=(A,B,π)

隐马尔可夫模型在实际应用中,一般有三种问题:

1.概率计算问题

给定模型λ=(A,B,π)和观测序列O={o_1,o_2,…,o_T},计算在模型λ下观测序列O出现的概率P(O|λ)。

可以通过穷举状态序列的方法来计算指定观测序列的概率。一般采用用时较少的前向-后向算法(forward-backward algorithm)来计算。

2.学习问题

估计出隐马尔可夫模型的参数λ=(A,B,π)的问题是学习问题。隐马尔可夫模型的学习分为监督学习和无监督学习。监督学习的训练样本包含有观测序列和状态序列,无监督学习的训练样本只含有观测序列。

3.预测问题,也称为解码(decoding)问题

已知观测序列O={o_1,o_2,…,o_T}和模型λ=(A,B,π),求使条件概率P(Q|O)最大的状态序列Q={q_1,q_2,…,q_T},即给定观测序列,求最有可能的状态序列。

hmmlearn隐马尔可夫模型扩展库曾经是scikit-learn项目的一部分,现已独立成单独的Python扩展库。在Anaconda环境中,可以用“conda install hmmlearn”命令直接安装。

hmmlearn实现了三种常用的观测概率分布的隐马尔可夫模型:多项式分布、高斯分布和高斯混合分布隐马尔可夫模型。 多项式分布隐马尔可夫模型假定观测概率b_i(j)符合多项式分布。 高斯分布隐马尔可夫模型假定观测概率b_i(j)服从高斯分布。 高斯混合分布隐马尔可夫模型假定观测概率b_i(j)服务多个叠加的高斯分布。

中文分词应用示例

自然语言处理领域的很多问题都是序列标注问题。中文分词是将中文句子分解成有独立含义的字或词,如“我爱自然语言处理”可分解成“我 爱 自然 语言 处理”或“我 爱 自然语言 处理”。

标注分词方法给句子中的每个字标记一个能区分词的标签,如SBME四标注法中,“S”表示是该字是单字,“B”表示该字是一个词的首字,“M”表示该字是一个词的中间字,“E”表示该字是一个词的结尾字。

 对分词模型来说,就是要对输入序列产生正确的输出序列。采用隐马尔可夫模型作为分词模型时,输入序列是观测值序列,输出的标签序列是隐状态序列。

应用隐马尔可夫模型来分词,先要用大量的训练样本来训练模型,属于监督学习。在自然语言处理领域,训练样本称为语料。

用语料来有监督训练隐马尔可夫模型比较容易理解。用概率论的极大似然估计法和矩估计法都可以得到用频率来估计概率的结论。也就是说,对隐马尔可夫模型的三要素A,B,π,只需要统计它们中的每个元素在语料库中出现的频率即可。为了防止出现概率为0的情况,可采取如多项式朴素贝叶斯分类器中用到的平滑技术。

代码输出如下

 

分词结果如下 

 

 部分代码如下

import numpy as np

file = open("traindata.txt", encoding='utf-8')
test_str = "中国首次火星探测任务天问一号探测器实施近火捕获制动"

new_sents = []
sents_labels = []
for line in file.readlines():
    line = line.split()
    new_sent = ''
    sent_labels = ''
    for word in line:
        if len(word) == 1:
            new_sent += word
            sent_labels += 'S'
        elif len(word) >= 2:
            new_sent += word
            sent_labels += 'B' + 'M'*(len(word)-2) + 'E'
    if new_sent != '':
        new_sents.append([new_sent])
        sents_labels.append([sent_labels])
print("训练样本准备完毕!")
print('共有数据 %d 条' % len(new_sents))
print('平均长度:', np.mean([len(d[0]) for d in new_sents]))
# 统计转移概率矩阵A和观测概率矩阵B
A = np.zeros((4, 4))
B = np.zeros((4, 65536)) # GB2312编码
for i in range(len(sents_labels)):
    for j in range(len(sents_labels[i][0])):
        B[state.index(sents_labels[i][0][j]), ord(new_sents[i][0][j])] += 1 # 观测频率加1
    for j in range(len(sents_labels[i][0]) - 1):

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生安全系列3:5个 Kubernetes API 网络安全访问最佳实践

Kubernetes 中的 API 访问控制会经历三个步骤。首先,对请求进行身份验证,然后检查请求的有效授权,然后执行请求准入控制,最后授予访问权限。但在身份验证过程开始之前,确保正确配置网络访问控制和 TLS 连接应该是首要任…

SuperMap iPortal 对接postgis业务数据库(一):使用nodejs连接数据库并通过接口返回数据

前言 最近有很多人问SuperMap iPortal怎样对接自己的业务数据库,而目前SuperMap iPortal还没办法直接对接,但是可以通过11版本新增的低代码编辑器绕行实现.大致实现步骤如下: 1. 使用nodejs连接数据库并通过接口返回数据 2. 在大屏中请求接口数据并在图…

华为云解锁云原生数据库发展新动能

摘要:如流水般源源不断的数据都存放在哪里?云原生数据库到底是什么?企业基于云原生数据库如何随取随用,实现从 “上好云” 到 “用好云” 的跨越发展?本文分享自华为云社区《探秘・云新知丨华为云解锁云原生数据库发展…

地统计插值学习心得(一)

引言 当我们尝试使用克里金方法插值数据时,最常见的问题之一就是数据中存在极值或者说是异常值。极值是指与其他数据相比非常大或非常小的数据值。通常是由于监测设备故障或数据输入失误造成的,比如不小心删除了数据中的小数点。在进行插值之前,应手动纠正或删除这些错误数据…

非零基础自学Golang 第12章 接口与类型 12.4 空接口

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.4 空接口12.4.1 将值保存到空接口12.4.2 从空接口取值12.4.3 空接口的常见使用第12章 接口与类型 12.4 空接口 12.4.1 将值保存到空接口 空接口(interface{})是Go语言中最特殊的接…

MD5算法:利用python进行md5 hash值的获取

MD5基本概念 MD5,即信息摘要算法,英文为MD5 Message-Digest Algorithm,是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),也叫散列值&…

Live800:不做背锅侠,在线客服系统有帮助

一个公司最牛的部门是哪个? 不同的公司可能有不同的答案,但要说公司哪个部门最憋屈,承接客户的炮火最多,那一定是客服部。因为无论是产品的质量、物流、使用出了问题,消费者的负向反馈都会轰向客服,而当客…

中低压分布式电源并网方案(RCL0923群调群控协同控制终端/RCL0923A分布式光伏逆变器数据采集器)方案

中低压分布式电源并网方案(RCL0923群调群控协同控制终端/RCL0923A分布式光伏逆变器数据采集器)方案 中低压分布式电源并网方案(RCL0923群调群控协同控制终端/分布式光伏逆变器数据采集器)方案 RCL0923分布式光伏电源群调群控协调控制终端/分布式光伏逆变器数据采集器 方案一…

Kotlin基本的语法学习

1.变量 在Kotlin中定义变量的方式和Java区别很大,在Java中如果想要定义一个变量,需要在变量前面声明这个变量的类型,比如说int a表示a是一个整型变量,String b表示b是一个字符串变量。而Kotlin中定义一个变量,只允许在…

操作系统:用C语言模拟先进先出的算法(FIFO)、最久未使用算法(LRU)、改进的Clock置换算法的命中率。

2.1 实验目的 通过请求页面式存储管理中页面置换算法设计,了解存储技术的特点,掌握请求页式存储管理的页面置换算法。 2.2 实验内容 用程序实现生产者——消费者问题,将指令序列转换为用户虚存中的请求调用页面流。 具体要求: …

以太坊的ecrecover预编译合约

1. 引言 前序博客: ECDSA VS Schnorr signature VS BLS signature ECDSA,全称为Elliptic curve Digital Signature Algorithm,采用Elliptic curve cryptography来实现的数字签名算法。 公私钥对(pk,P)(pk,P)(pk,P),其中公钥Pp…

阿里云-数据仓库-全链路大数据开发治理平台-DataWorks的数字世界

一、前言 上文我讲到 阿里云-数据仓库-数据分析开发神器-ODPS ,今天我带领大家一起走进神器的成长环境及它的数据世界。 二、 DataWorks是什么 DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎,为数据仓库、数据湖、湖仓一体等…

大数据-压缩与打包

一、gzip命令 1、选项参数 参数作用-c(compress)将压缩的数据输出到标准输出(stdout)上-d(decompress)解压缩-t(test)可以用来检验一个压缩文件的一致性,看看文件有无错…

艾美捷甘油比色测定试剂盒-简单,敏感,高效

艾美捷甘油比色测定试剂盒,利用双酶联反应系统来检测血清和血浆中的甘油的含量.最后用酶标仪在540nm处测吸光度值即可. 甘油是甘油三酯的骨架,是参与氧化和合成过程的能量代谢的重要中间体。甘油和游离脂肪酸循环水平的测量被认为反映了脂肪分解&#xf…

快应用的优势与劣势对比

2018年,“快应用”标准正式推出。快应用是九大手机厂商基于硬件平台共同推出的新型应用生态。用户无需下载安装,即点即用,享受原生应用的性能体验。 快应用框架深度集成进各厂商手机系统中,可以在操作系统层面实现用户需求与应用…

艾美捷甘油比色测定试剂盒基本参数和相关文献说明

背景: 哺乳动物中,甘油三脂主要储存在脂肪组织中,作为主要的能量储存仓库.当禁食阶段,存储在肝脏和脂肪组织中的甘油三酯被脂肪酶分解形成脂肪酸和甘油. 艾美捷甘油比色测定试剂盒基本参数: 中文名称:甘油…

dpdk中的librte_malloc库

dpdk中的librte_malloc库提供了能够分配任意大小内存的API。 该库的目标是提供类似malloc的函数从hugepage中分配内存,以及帮助应用程序移植。 通常情况下,这种类型的分配不应该在数据平面处理,因为其比基于内存池的分配更慢, …

网站被反诈中心DNS劫持解决教程

如果你的网站部分地区用户访问反馈访问不了,测试域名DNS被劫持到了127.0.0.1 或 0.0.0.0 可能是域名被墙了,或则被反诈中心拦截了,如果遇到该问题,需要检测单单被运营商拦截还是也有被反诈中心拦截。 排查过程: 可以把问题域名通过…

H5 雪碧图 移动的机器猫

精灵图(英语:Sprite),又被称为雪碧图或拼合图。在计算机图形学中,当一张二维图像 集成进场景中,成为整个显示图像的一部分时,这张图就称为精灵图。 本文中用的就是这张,来自爱给网。…

Python:Flask简介与实践

文章目录简介一、简单使用二、调试模式三、路由四、路径变量五、构造URL六、HTTP方法七、静态文件八、模板生成九、日志输出十、处理请求1. Request 对象十一、文件上传十二、Cookies十三、重定向和错误十四、响应处理十五、Sessions十六、模板简介1. 模板标签2. 继承3. 控制流…