引言:NLP技术目前在社会各个领域都在应用,其中在命名实体识别方面应用很广泛,也是极具特色的。
一、利用NLP技术训练模型,来识别病例里面的关键信息。
1、搜集数据(训练数据、验证数据、测试数据还有一个字典(key:命名实体,value:实体类型)):
训练数据、验证数据、测试数据都是些病例文本信息,字典是我们要识别出来的命名实体,该字典会添加到,jieba分词工具里面,这样才能分出我们要的命名实体。
2、清洗、提取训练数据的特征
这个过程比较繁琐,这里就简单叙述一下:
1、创建一个词典
该词典是个dict,key是字的下标,value是字,这里每个字都是训练数据里面的,就相当于给训练数据里面每个字加一个索引,其中代表当句长不够,要添加的;代表在训练集中未出现的字,如下图:
2、创建一个实体类型字典:
如上图,key代表词性,value代表索引。
3、数据封装:
有了上述2个字典、训练数据和初始给的一个字典(key:命名实体,value:实体类型),我们可以封装一下测试数据:
如上图:训练数据是一个101218行的数组train_data,每行是一个长度为4的数组train_arr,train_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