NLP_HW1 / corssencode_inference.py
PetrovDE's picture
edit onw anser
b57c185
from typing import List, Tuple, Any
import numpy as np
from transformers import AutoTokenizer
from bi_encoder import get_corpus, get_question
import torch
from model import CrossEncoderBert
device = "cuda" if torch.cuda.is_available() else "cpu"
model = CrossEncoderBert()
model.model.resize_token_embeddings(len(model.tokenizer))
model.load_state_dict(torch.load('model/torch_model', map_location=torch.device(device)))
model.tokenizer = AutoTokenizer.from_pretrained('model/tokenizer')
model.to(device)
def get_range_answers(
context: str,
question: str,
num_answers: int = 5) -> list[str]:
corpus = get_corpus(context, question)
context_question = f'{context} [Cont_token] {question}'
context_questions = [context_question] * len(corpus)
tokenized_texts = model.tokenizer(
context_questions,
corpus,
max_length=512,
padding=True,
truncation=True,
return_tensors='pt'
).to(device)
with torch.no_grad():
ce_scores = model(tokenized_texts['input_ids'],
tokenized_texts['attention_mask']).squeeze(-1)
ce_scores = torch.sigmoid(ce_scores)
scores = ce_scores.cpu().numpy()
scores_ix = np.argsort(scores)[::-1]
best_answers = []
for idx in scores_ix[:num_answers]:
best_answers.append((scores[idx], corpus[idx]))
best_answers = [str(x[1]) for x in best_answers]
return best_answers
def get_best_answer(
context: str,
question: str
) -> str:
return get_range_answers(context, question, 1)