机器学习 - 命名实体识别之Hidden Markov Modelling

  • 概述

命名实体识别在NLP的应用中也是非常广泛的,尤其是是information extraction的领域。Named Entity Recognition(NER) 的应用中,最常用的一种算法模型是隐式马可夫模型(Hidden Markov Modelling)- HMM。本节内容主要是通过介绍HMM的原理,以及应用HMM来做一个NER的实例演示。

  • HMM原理解析

在解释HMM的原理之前,先引用几个HMM的基本概念,第一个是就是隐式状态,在本文中用H表示; 第二个就是显式状态,在本文中用大写的英文字母O表示。咱们的HMM的中,就是根据咱们的显式状态O来计算隐式状态H的概率的问题,其中在HMM中有一个基本的前提条件,那就是每一个time step的隐式状态只跟它前一步的的隐式状态有关。具体是什么意思呢,大家看我下面的一幅图片,结合这幅图片来给大家解释

首先observables是大家能直接得到的信息,例如一个句子“小李和王二在天津旅游”,这个就是一个observable的sequence,是咱们能够直接得到的信息;那么咱们如何才能够得到这句话背后所包含的隐式sequences呢?这就是咱们的HMM所要解决的问题了。从上图可以看出hidden states之间是通过transition matrix来连接的,这里咱们也可以很好的看出来每一步的hidden state仅仅是由前一步的hidden state来确定的;hidden state和observable之间是通过emission matrix来连接的,即在给定的hidden state的情况的,指向每一个observable的概率是多少。这么说的有点抽象,那么咱们通过下面的图片来展示这个transition matrix和emission matrix

上面的图片展示了HMM所需要的一些matrix,咱们的一个个分析。首先initial matrix是咱们根据语义集中的每一条数据的第一个hidden state计算出来的;transition matrix是根据咱们训练的语言集中的所有的隐式状态的计算出来的,例如咱们统计出所有的H0-》H0和H0-》H1的个数,然后除以总数,得出的分别就是H0-》H0和H0-》H1的概率,同理得出其他的Transition Matrix的其他的概率。Emission Matrix也是根据咱们训练的语义集中的数据计算出来的,它的步骤是统计出所有H0-》O0,O1, O2,O3,O4的个数,然后除以总数,得到的就是H0这个hidden state分别对应的所有的显式状态的概率, 同理也可以计算出其他的emission matrix的值。这就是得出Initial Matrix, Transition Matrix, 和 Emission Matrix的方法和步骤。从咱们的语义集中得出了这些数据过后,咱们就通过Vertibi算法来根据observable sequence计算了咱们的Hidden state sequences。

  • Vertibi 算法

Vertibi算法是一种动态路径规划的算法,它能动态的规划处最优的路径。具体在咱们NER的应用中,它能够根据咱们的上面计算出来的Transition matrix, Initial Matrix和Emmsion Matrix来规划处咱们的最优的隐式状态的sequence, 其实这里就是寻找P(H0H1H2H3H4H5...........)最大值的一种方法,这里需要注意的一个点就是局部的最优并不一定能得出全局最优的结论,这是因为每一步的隐式状态的概率并不仅仅收到当前这一步的显式状态的影响,还受到它前一步的隐式状态的影响。下面咱们来用一个小实例来展示一下Vertibi的算法,为了方便,咱们只展示一步哈,请看下图所示

  • 隐式马可夫算法和维特比算法的代码演示

上面的部分都是分析隐式马可夫算法和维特比算法的原理,那么接下来咱们具体看看它们在NER中的应用以及实际的代码演示,这里我用一个在NLP中的实例来演示这两种算法。假设我们有一个语义集,咱们根据训练数据来计算好markov的matrix,然后应用维特比算法来抽取句子中的人名的信息出来。这在NLP中是一个非常常用的案例,那咱们首先来看看计算Initial maxtrix和Transition Matrix的代码部分

   #计算初始hidden state的概率和transition matrix
    def calculate_initial_and_transition_matrix(self):
        for dictionary in self.text_corpus:
            for i, tag in enumerate(dictionary["tags"][:-1]):
                if i == 0:
                    self.pi[self.tag_index[tag]]+=1
                current_tag = self.tag_index[tag]
                next_tag = self.tag_index[dictionary["tags"][i+1]]
                self.transition[current_tag, next_tag] += 1
        self.transition /= np.sum(self.transition, axis = 1, keepdims = True)
        self.pi /= np.sum(self.pi)
        self.pi[self.pi == 0] = 1e-8
        self.transition[self.transition == 0] = 1e-8
        return self.pi, self.transition

其次咱们来看一下计算emission matrix的代码部分

    def calculate_emmision_matrix(self):
        for dictionary in self.text_corpus:
            for word, tag in zip(dictionary["text"], dictionary["tags"]):
                self.emmision_matrix[self.tag_index[tag],self.dataloader.tokenizer.texts_to_sequences(word)[0][0]] += 1
        self.emmision_matrix /= np.sum(self.emmision_matrix, keepdims = True, axis= 1)
        self.emmision_matrix[self.emmision_matrix == 0] = 1e-8
        return self.emmision_matrix

根据咱们的训练数据咱们得出了这些matrix的值,根据这些matrix的值,咱们就可以根据输入的一句话(显式状态)来计算出这一句话中哪些字是人名(隐式状态)了,并且将这些人名信息提取出来了。这里咱们不用实际的手动的实现vertibi算法了,TensorFlow已经帮助咱们实现好了,咱们不需要再重复造轮子了,这里咱们需要引进一下TensorFlow probability这个框架了,具体的看下面的代码展示

import tensorflow_probability as tfp
import tensorflow as tf

tfd = tfp.distributions
initial_distribution = tfd.Categorical(probs=pi)
transition_maxtrix = tfd.Categorical(probs=transition)
observation_matrix = tfd.Categorical(probs = emmision)

model = tfd.HiddenMarkovModel(initial_distribution=initial_distribution,
                              transition_distribution=transition_maxtrix,
                              observation_distribution=observation_matrix,
                              num_steps=11)

test_string = "小明和老王去河边钓鱼了"
temps = [data_handler.calculator.word_index[index] for index in list(test_string)]
tag_sequence = model.posterior_mode(observations=temps)
reversed_tag_index = {value:key for key,value in data_handler.calculator.tag_index.items()}
tags = [reversed_tag_index[index] for index in tag_sequence.numpy()]
print(tags)

上面就是根据咱们的matrix(initial_distribution, transition_matrix, observation_matrix),还有显示状态(test_string),tfp根据vertibi算法帮助咱们计算出来隐式状态的sequence(tag_sequence)。这就是NER在NLP的应用中常用的一个实例。

原文地址:https://www.cnblogs.com/tangxiaobo199181/p/12585312.html

时间: 2024-10-11 01:32:05

机器学习 - 命名实体识别之Hidden Markov Modelling的相关文章

神经网络结构在命名实体识别(NER)中的应用

近年来,基于神经网络的深度学习方法在自然语言处理领域已经取得了不少进展.作为NLP领域的基础任务-命名实体识别(Named Entity Recognition,NER)也不例外,神经网络结构在NER中也取得了不错的效果.最近,我也阅读学习了一系列使用神经网络结构进行NER的相关论文,在此进行一下总结,和大家一起分享学习. 1 引言 命名实体识别(Named Entity Recognition,NER)就是从一段自然语言文本中找出相关实体,并标注出其位置以及类型,如下图.它是NLP领域中一些复

NLP入门(八)使用CRF++实现命名实体识别(NER)

CRF与NER简介 ??CRF,英文全称为conditional random field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场. ??较为简单的条件随机场是定义在线性链上的条件随机场,称为线性链条件随机场(linear chain conditional random field). 线性链条件随机场可以用于序列标注等问题,而本文需要解决的命名实体识别(NER)任务正好可通过序列标注方

CS224d 单隐层全连接网络处理英文命名实体识别tensorflow

什么是NER? 命名实体识别(NER)是指识别文本中具有特定意义的实体,主要包括人名.地名.机构名.专有名词等.命名实体识别是信息提取.问答系统.句法分析.机器翻译等应用领域的重要基础工具,作为结构化信息提取的重要步骤. NER具体任务 1.确定实体位置 2.确定实体类别 给一个单词,我们需要根据上下文判断,它属于下面四类的哪一个,如果都不属于,则类别为0,即不是实体,所以这是一个需要分成 5 类的问题: ? Person (PER) ? Organization (ORG) ? Locatio

命名实体识别---入门

命名实体识别(Named Entity Recognition,后文简称NER) 是指从文本中识别具有特定类别的实体(通常是名词),例如人名.地名.机构名.专有名词等.命名实体识别是信息 检索,查询分类,自动问答等问题的基础任务,其效果直接影响后续处理的效果,因此是自然语言处理研究的一个基础问题. 传统的方法 NER的问题通常被抽象为序列标注(Sequence labeling)问题.所谓序列标注是指对序列中每个符号赋予一个特定的标签.

基于深度学习做命名实体识别

基于CRF做命名实体识别系列 用CRF做命名实体识别(一) 用CRF做命名实体识别(二) 用CRF做命名实体识别(三) 摘要 1. 之前用CRF做了命名实体识别,效果还可以,最高达到0.9293,当然这是自己用sklearn写的计算F1值, 后来用**conlleval.pl**对CRF测试结果进行评价,得到的F1值是**0.9362**. 2. 接下来基于BILSTM-CRF做命名实体识别,代码不是自己写的,用的github上的一个大佬写的,换了自己的数据集,得到最终的结果是0.92. 3.

用深度学习做命名实体识别(四)——模型训练

通过本文你将了解如何训练一个人名.地址.组织.公司.产品.时间,共6个实体的命名实体识别模型. 准备训练样本 下面的链接中提供了已经用brat标注好的数据文件以及brat的配置文件,因为标注内容较多放到brat里加载会比较慢,所以拆分成了10份,每份包括3000多条样本数据,将这10份文件和相应的配置文件放到brat目录/data/project路径下,然后就可以从浏览器访问文件内容以及相应的标注情况了. 链接:https://pan.baidu.com/s/1-wjQnvCSrbhor9x3G

用深度学习做命名实体识别(六)-BERT介绍

什么是BERT? BERT,全称是Bidirectional Encoder Representations from Transformers.可以理解为一种以Transformers为主要框架的双向编码表征模型.所以要想理解BERT的原理,还需要先理解什么是Transformers. Transformers简单来说是一个将一组序列转换成另一组序列的黑盒子,这个黑盒子内部由编码器和解码器组成,编码器负责编码输入序列,然后解码器负责将编码器的输出转换为另一组序列.具体可以参考这篇文章<想研究B

用深度学习做命名实体识别(七)-CRF介绍

还记得之前介绍过的命名实体识别系列文章吗,可以从句子中提取出人名.地址.公司等实体字段,当时只是简单提到了BERT+CRF模型,BERT已经在上一篇文章中介绍过了,本文将对CRF做一个基本的介绍.本文尽可能不涉及复杂晦涩的数学公式,目的只是快速了解CRF的基本概念以及其在命名实体识别等自然语言处理领域的作用. 什么是CRF? CRF,全称 Conditional Random Fields,中文名:条件随机场.是给定一组输入序列的条件下,另一组输出序列的条件概率分布模型. 什么时候可以用CRF?

用CRF做命名实体识别

摘要 本文主要讲述了关于人民日报标注语料的预处理,利用CRF++工具包对模型进行训练以及测试 目录 明确我们的标注任务 语料和工具 数据预处理 1.数据说明 2.数据预处理 模型训练及测试 1.流程 2.标注集 3.特征模板 4.CRF++包的使用说明 总结与展望 正文 1.明确我们的标注任务 这篇文章主要是介绍用CRF模型去提取人民日报语料的时间.人物.地点及组织机构名,也就是提取TIME.PERSON.LOCATION.ORGANIZATION四种实体.训练我们直接使用CRF++工具包. 2