医学病例命名实体识别案例

引言:NLP技术目前在社会各个领域都在应用,其中在命名实体识别方面应用很广泛,也是极具特色的。

一、利用NLP技术训练模型,来识别病例里面的关键信息。

1、搜集数据(训练数据、验证数据、测试数据还有一个字典(key:命名实体,value:实体类型)):
训练数据、验证数据、测试数据都是些病例文本信息,字典是我们要识别出来的命名实体,该字典会添加到,jieba分词工具里面,这样才能分出我们要的命名实体。

2、清洗、提取训练数据的特征
这个过程比较繁琐,这里就简单叙述一下:
1、创建一个词典
该词典是个dictkey是字的下标,value是字,这里每个字都是训练数据里面的,就相当于给训练数据里面每个字加一个索引,其中代表当句长不够,要添加的;代表在训练集中未出现的字,如下图:
在这里插入图片描述

2、创建一个实体类型字典:
在这里插入图片描述
如上图,key代表词性,value代表索引。

3、数据封装:
有了上述2个字典、训练数据和初始给的一个字典(key:命名实体,value:实体类型),我们可以封装一下测试数据:
在这里插入图片描述
如上图:训练数据是一个101218行的数组train_data,每行是一个长度为4的数组train_arrtrain_arr代表一句文本,**train_arr[0]**文本内容,**train_arr[1]**每句文本里的词在词典里面对应下标;**train_arr[2]**每个字在jieba分词里的短语顺序;**train_arr[3]**代表每个字的词性。

三、创建模型:

1、模型初始化主体信息,还有些模型参数在这里就不一一列出来了:

#字下标输入层
class DataModel{
   
	#config 模型参数
	def __init__(self, config):
	    # 字下标输入层 train_arr[1]
		self.char_inputs = tf.placeholder(dtype=tf.int32, shape=[None, None], name="CharInPuts")
	 	# 字所在句子中分词短语的顺序
		self.seg_inputs = tf.placeholder(dtype=tf.int32, shape=[None, None], name="SegInPuts")
		# 字对应的词性
		self.targets = tf.placeholder(dtype=tf.int32, shape=[None, None], name="TargetOuts")
		# dropout参数
		self.dropout = tf.placeholder(dtype=tf.float32, name="Dropout")

		# 句子的真实长度
		self.lengths = tf.cast(tf.reduce_sum(tf.sign(tf.abs(self.char_inputs)), reduction_indices=1), tf.int32)
		'''
		其他数据变化操作
		'''
	}

2、下面具体描述模型中其他的数据变化:

a、嵌入层

embedding = self.embedding_layer(self.char_inputs, self.seg_inputs, config)

#1、输入self.char_inputs和self.seg_inputs
#2、创建一个shape=[self.num_chars, self.char_dim]的矩阵;self.num_chars总的词数,每个词用一个self.char_dim维度的向量表示
#3、创建一个shape=[self.num_segs, self.seg_dim]的矩阵;self.numsegs词的顺序(0,1,2,3),每个顺序数组用一个self.seg_dim维度的向量表示
#4、把这两个矩阵合并最后生成一个shape=[?,?,self.char_dim+self.seg_dim]的矩阵并返回
def embedding_layer(self, char_inputs, seg_inputs, config, name=None):
    embedding = []
    self.char_inputs_test=char_inputs
    self.seg_inputs_test=seg_inputs
    with tf.variable_scope("char_embedding" if not name else name), tf.device('/cpu:0'):
        self.char_lookup = tf.get_variable(
                name="char_embedding",
                shape=[self.num_chars, self.char_dim],
                initializer=self.initializer)
        embedding.append(tf.nn.embedding_lookup(self.char_lookup, char_inputs))
        #self.embedding1.append(tf.nn.embedding_lookup(self.char_lookup, char_inputs))
        if config["seg_dim"]:
            with tf.variable_scope("seg_embedding"), tf.device('/cpu:0'):
                self.seg_lookup = tf.get_variable(
                    name="seg_embedding",
                    #shape=[4*20]
                    shape=[self.num_segs, self.seg_dim],
                    initializer=self.initializer)
                embedding.append(tf.nn.embedding_lookup(self.seg_lookup
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值