赞
踩
前言:
本文章将通过pytorch作为主要工具实现不同的模型(包括HMM,CRF,Bi-LSTM,Bi-LSTM+CRF)来解决中文命名实体识别问题,文章不会涉及过多的数学推导,但会从直观上简单解释模型的原理,主要的内容会集中在代码部分。
本文的目录结构如下:
首先,我们明确一下命名实体识别的概念:
命名实体识别(英语:Named Entity Recognition),简称 NER,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等,以及时间、数量、货币、比例数值等文字。
举个例子,假如有这么一句话:
ACM宣布,深度学习的三位创造者Yoshua Bengio, Yann LeCun, 以及Geoffrey Hinton获得了2019年的图灵奖。
那么NER的任务就是从这句话中提取出
目前在NER上表现较好的模型都是基于深度学习或者是统计学习的方法的,这些方法共同的特点都是需要大量的数据来进行学习,所以接下来我先介绍一下本项目使用的数据集的格式,好让读者在阅读模型的代码之前对数据的形式有个直观的认识。
数据集用的是论文ACL 2018Chinese NER using Lattice LSTM中从新浪财经收集的简历数据,数据的格式如下,它的每一行由一个字及其对应的标注组成,标注集采用BIOES(B表示实体开头,E表示实体结尾,I表示在实体内部,O表示非实体),句子之间用一个空行隔开。
- 美 B-LOC
- 国 E-LOC
- 的 O
- 华 B-PER
- 莱 I-PER
- 士 E-PER
-
- 我 O
- 跟 O
- 他 O
- 谈 O
- 笑 O
- 风 O
- 生 O
下面是四种不同的模型以及这Ensemble这四个模型预测结果的准确率(取最好):
最后一行Ensemble是将这四个模型的预测结果结合起来,使用“投票表决”的方法得出最后的预测结果。
下面本文将详细接受每种模型的实现:
隐马尔可夫模型描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程(李航 统计学习方法)。隐马尔可夫模型由初始状态分布,状态转移概率矩阵以及观测概率矩阵所确定。
上面的定义太过学术看不懂没关系,我们只需要知道,NER本质上可以看成是一种序列标注问题(预测每个字的BIOES标记),在使用HMM解决NER这种序列标注问题的时候,我们所能观测到的是字组成的序列(观测序列),观测不到的是每个字对应的标注(状态序列)。
对应的,HMM的三个要素可以解释为,初始状态分布就是每一个标注作为句子第一个字的标注的概率,状态转移概率矩阵就是由某一个标注转移到下一个标注的概率(设状态转移矩阵为
- class HMM(object):
- def __init__(self, N, M):
- """Args:
- N: 状态数,这里对应存在的标注的种类
- M: 观测数,这里对应有多少不同的字
- """
- self.N = N
- self.M = M
-
- # 状态转移概率矩阵 A[i][j]表示从i状态转移到j状态的概率
- self.A = torch.zeros(N, N)
- # 观测概率矩阵, B[i][j]表示i状态下生成j观测的概率
- self.B = torch.zeros(N, M)
- # 初始状态概率 Pi[i]表示初始时刻为状态i的概率
- self.Pi = torch.zeros(N)
有了模型定义,接下来的问题就是训练模型了。HMM模型的训练过程对应隐马尔可夫模型的学习问题(李航 统计学习方法),实际上就是根据训练数据根据最大似然的方法估计模型的三个要素,即上文提到的初始状态分布、状态转移概率矩阵以及观测概率矩阵。举个例子帮助理解,在估计初始状态分布的时候,假如某个标记在数据集中作为句子第一个字的标记的次数为k,句子的总数为N,那么该标记作为句子第一个字的概率可以近似估计为k/N
,很简单对吧,使用这种方法,我们近似估计HMM的三个要素,代码如下(出现过的函数将用省略号代替):
- class HMM(object):
- def __init__(self, N, M):
- ....
- def train(self, word_lists, tag_lists, word2id, tag2id):
- """HMM的训练,即根据训练语料对模型参数进行估计,
- 因为我们有观测序列以及其对应的状态序列,所以我们
- 可以使用极大似然估计的方法来估计隐马尔可夫模型的参数
- 参数:
- word_lists: 列表,其中每个元素由字组成的列表,如 ['担','任','科','员']
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。