import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Dropout, Bidirectional, LSTM
from tensorflow.keras.models import Model
from transformers import TFBertModel, BertTokenizer
import numpy as np
# Load pre-trained BERT tokenizer and model
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
bert_model = TFBertModel.from_pretrained('bert-base-uncased')
# Sample data (texts and labels) - placeholder
texts = ["John lives in New York.", "Mary was born on July 5th."]
labels = [[1,0,0,2,2,0], [1,0,0,0,3,3,0]] # Example label encoding for entities
# Tokenize texts
inputs = tokenizer(texts, return_tensors='tf', padding=True, truncation=True, max_length=32)
# Define model
input_ids = Input(shape=(32,), dtype=tf.int32, name='input_ids')
attention_mask = Input(shape=(32,), dtype=tf.int32, name='attention_mask')
bert_outputs = bert_model(input_ids, attention_mask=attention_mask)[0] # sequence output
x = Bidirectional(LSTM(64, return_sequences=True))(bert_outputs)
x = Dropout(0.3)(x)
outputs = Dense(5, activation='softmax')(x) # 5 entity classes including 'O'
model = Model(inputs=[input_ids, attention_mask], outputs=outputs)
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=3e-5), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Dummy labels padded to shape (batch_size, 32)
y_train = np.zeros((len(texts), 32), dtype=np.int32)
# Train model
model.fit({'input_ids': inputs['input_ids'], 'attention_mask': inputs['attention_mask']}, y_train, epochs=3, batch_size=2)
# After training, evaluate on validation data to get improved accuracy