# -*- coding: utf-8 -*- """ Created on Thu Mar 26 09:04:13 2020 @author: luol2 """ import time import sys import numpy as np import keras from src.nn_represent import CNN_RepresentationLayer,BERT_RepresentationLayer from keras.layers import * from keras.models import Model from keras_bert import load_trained_model_from_checkpoint class bioTag_CNN(): def __init__(self, model_files): self.model_type='cnn' model_test_type='cnn' self.fea_dict = {'word': 1, 'char': 1, 'lemma':0, 'pos':0} self.hyper = {'sen_max' :20, 'word_max' :40, 'charvec_size' :50, 'pos_size' :50} self.w2vfile=model_files['w2vfile'] self.charfile=model_files['charfile'] self.labelfile=model_files['labelfile'] self.posfile=model_files['posfile'] vocab={'char':self.charfile,'label':self.labelfile,'pos':self.posfile} print('loading w2v model.....') self.rep = CNN_RepresentationLayer(self.w2vfile,vocab_file=vocab, frequency=400000) print('building model......') all_fea = [] fea_list = [] if self.fea_dict['word'] == 1: word_input = Input(shape=(self.hyper['sen_max'],), dtype='int32', name='word_input') all_fea.append(word_input) word_fea = Embedding(self.rep.vec_table.shape[0], self.rep.vec_table.shape[1], weights=[self.rep.vec_table], trainable=True,mask_zero=False, input_length=self.hyper['sen_max'], name='word_emd')(word_input) fea_list.append(word_fea) if self.fea_dict['char'] == 1: char_input = Input(shape=(self.hyper['sen_max'],self.hyper['word_max']), dtype='int32', name='char_input') all_fea.append(char_input) char_fea = TimeDistributed(Embedding(self.rep.char_table_size, self.hyper['charvec_size'], trainable=True,mask_zero=False), name='char_emd')(char_input) char_fea = TimeDistributed(Conv1D(self.hyper['charvec_size']*2, 3, padding='same',activation='relu'), name="char_cnn")(char_fea) char_fea_max = TimeDistributed(GlobalMaxPooling1D(), name="char_pooling_max")(char_fea) fea_list.append(char_fea_max) if self.fea_dict['lemma'] == 1: lemma_input = Input(shape=(self.hyper['sen_max'],), dtype='int32', name='lemma_input') all_fea.append(lemma_input) lemma_fea = Embedding(self.rep.vec_table.shape[0], self.rep.vec_table.shape[1], weights=[self.rep.vec_table], trainable=True,mask_zero=False, input_length=self.hyper['sen_max'], name='lemma_emd')(lemma_input) fea_list.append(lemma_fea) if self.fea_dict['pos'] == 1: pos_input = Input(shape=(self.hyper['sen_max'],), dtype='int32', name='pos_input') all_fea.append(pos_input) pos_fea = Embedding(self.rep.pos_table_size, self.hyper['pos_size'], trainable=True,mask_zero=False, input_length=self.hyper['sen_max'], name='pos_emd')(pos_input) fea_list.append(pos_fea) if len(fea_list) == 1: concate_vec = fea_list[0] else: concate_vec = Concatenate()(fea_list) concate_vec = Dropout(0.4)(concate_vec) # model if model_test_type=='cnn': cnn = Conv1D(1024, 1, padding='valid', activation='relu',name='cnn1')(concate_vec) cnn = GlobalMaxPooling1D()(cnn) elif model_test_type=='lstm': bilstm = Bidirectional(LSTM(200, return_sequences=True, implementation=2, dropout=0.4, recurrent_dropout=0.4), name='bilstm1')(concate_vec) cnn = GlobalMaxPooling1D()(bilstm) dense = Dense(1024, activation='relu')(cnn) dense= Dropout(0.4)(dense) output = Dense(self.rep.label_table_size, activation='softmax')(dense) self.model = Model(inputs=all_fea, outputs=output) def load_model(self,model_file): self.model.load_weights(model_file) #self.model.summary() print('load cnn model done!') class bioTag_BERT(): def __init__(self, model_files): self.model_type='bert' self.maxlen = 64 config_path = model_files['config_path'] checkpoint_path = model_files['checkpoint_path'] vocab_path = model_files['vocab_path'] self.label_file=model_files['labelfile'] self.rep = BERT_RepresentationLayer( vocab_path, self.label_file) bert_model = load_trained_model_from_checkpoint(config_path, checkpoint_path, training=False, trainable=True,seq_len=self.maxlen) x1_in = Input(shape=(None,)) x2_in = Input(shape=(None,)) x = bert_model([x1_in, x2_in]) x = Lambda(lambda x: x[:, 0])(x) outputs = Dense(self.rep.label_table_size, activation='softmax')(x) self.model = Model(inputs=[x1_in,x2_in], outputs=outputs) def load_model(self,model_file): self.model.load_weights(model_file) #self.model.summary() class bioTag_Bioformer(): def __init__(self, model_files): self.model_type='bioformer' self.maxlen = 32 config_path = model_files['config_path'] checkpoint_path = model_files['checkpoint_path'] vocab_path = model_files['vocab_path'] self.label_file=model_files['labelfile'] self.rep = BERT_RepresentationLayer( vocab_path, self.label_file) bert_model = load_trained_model_from_checkpoint(config_path, checkpoint_path, training=False, trainable=True,seq_len=self.maxlen) x1_in = Input(shape=(None,)) x2_in = Input(shape=(None,)) x = bert_model([x1_in, x2_in]) x = Lambda(lambda x: x[:, 0])(x) outputs = Dense(self.rep.label_table_size, activation='softmax')(x) self.model = Model(inputs=[x1_in,x2_in], outputs=outputs) def load_model(self,model_file): self.model.load_weights(model_file) #self.model.summary() print('load bioformer model done!')