机器学习

摘要:
本节内容主要是通过介绍HMM的原理,以及应用HMM来做一个NER的实例演示。这就是咱们的HMM所要解决的问题了。首先initialmatrix是咱们根据语义集中的每一条数据的第一个hiddenstate计算出来的;transitionmatrix是根据咱们训练的语言集中的所有的隐式状态的计算出来的,例如咱们统计出所有的H0-》H0和H0-》H1的个数,然后除以总数,得出的分别就是H0-》H0和H0-》H1的概率,同理得出其他的TransitionMatrix的其他的概率。这就是得出InitialMatrix,TransitionMatrix,和EmissionMatrix的方法和步骤。
  • 概述

命名实体识别在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的隐式状态只跟它前一步的的隐式状态有关。具体是什么意思呢,大家看我下面的一幅图片,结合这幅图片来给大家解释

机器学习第1张

首先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

机器学习第2张

上面的图片展示了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的算法,为了方便,咱们只展示一步哈,请看下图所示

机器学习第3张

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

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

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

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

    defcalculate_emmision_matrix(self):
        for dictionary inself.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]] += 1self.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这个框架了,具体的看下面的代码展示

importtensorflow_probability as tfp
importtensorflow 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 inlist(test_string)]
tag_sequence = model.posterior_mode(observations=temps)
reversed_tag_index = {value:key for key,value indata_handler.calculator.tag_index.items()}
tags = [reversed_tag_index[index] for index intag_sequence.numpy()]
print(tags)

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

免责声明:文章转载自《机器学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Unity3d:UI面板管理整合进ToLuaCentOS7 docker开启tcp端口并进行客户端远程连接下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

swiper横向轮播(兼容IE8)

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <link rel="stylesheet"href="idangerous.swiper.cs...

android Bitmap用法总结

1、Drawable→Bitmap public staticBitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap =Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),...

CSS3实现3D地球自转行星公转

截图效果:实际效果是动态的:地球自西向东自转,行星绕着地球公转,轨道也会转动 HTML页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CSS3星系轨道3D</title> &l...

CSS动画:animation、transition、transform、translate

https://blog.csdn.net/px01ih8/article/details/80780470 一、区分容易混淆的几个属性和值 先区分一下css中的几个属性:animation(动画)、transition(过渡)、transform(变形)、translate(移动)。 CSS3中的transform(变形)属性用于内联元素和块级元素,可...

遍历螺旋矩阵的技巧

遇见过挺多次,总结了一下方法,以后写的时候就不需要再慢慢想怎么模拟了 螺旋遍历数组方法: 按层模拟,从最外层开始 每次从第一个元素开始,→ ↓ ← ↑ 为一轮,通过进行操作的总次数判断是否结束 定义up,down,left,right表示 → ↓ ← ↑ 对应行的边界 up = 0; down = matrix.length-1 ; left = 0 ;...

Android中图像变换Matrix的原理

转载自:http://blog.csdn.net/pathuang68/article/details/6991867 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类。Android中的Matrix是一个3 x 3的矩阵,其内容如下:   Matrix的对图像的处理可分为四类基本变换: Translate  ...