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

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
简介: 【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)

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

隐马尔可夫模型(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):

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

相关文章
|
8天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
9天前
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
17 1
|
5天前
|
数据采集 存储 数据处理
探索Python中的异步编程:从基础到实战
【10月更文挑战第39天】在编程世界中,时间就是效率的代名词。Python的异步编程特性,如同给程序穿上了一双翅膀,让它们在执行任务时飞得更高、更快。本文将带你领略Python异步编程的魅力,从理解其背后的原理到掌握实际应用的技巧,我们不仅会讨论理论基础,还会通过实际代码示例,展示如何利用这些知识来提升你的程序性能。准备好让你的Python代码“起飞”了吗?让我们开始这场异步编程的旅程!
13 0
|
9天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
6月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
239 14
|
6月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
114 1
|
6月前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
6月前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
306 0
|
6月前
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
913 0
|
6月前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机(SVM)算法
【2月更文挑战第20天】 在数据科学与人工智能的领域中,支持向量机(SVM)是一种强大的监督学习算法,它基于统计学习理论中的VC维理论和结构风险最小化原理。本文将深入探讨SVM的核心概念、工作原理以及实际应用案例。我们将透过算法的数学原理,揭示如何利用SVM进行有效的数据分类与回归分析,并讨论其在处理非线性问题时的优势。通过本文,读者将对SVM有更深层次的理解,并能够在实践中应用这一算法解决复杂的数据问题。
82 0