parsbert_question_answering_PQuAD
pedramyazdipoor
Pregunta y respuesta
ParsBert es un modelo de lenguaje monolingüe basado en la arquitectura BERT de Google. Este modelo está preentrenado en grandes corpus persas con varios estilos de escritura de numerosos temas (por ejemplo, científicos, novelas, noticias) con más de 3.9M de documentos, 73M de oraciones y 1.3B de palabras. En este proyecto, finetuneé ParsBert en el conjunto de datos PQuAD para la tarea de respuesta a preguntas extractivas.
Como usar
# Pytorch
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
path = 'pedramyazdipoor/parsbert_question_answering_PQuAD'
tokenizer = AutoTokenizer.from_pretrained(path)
model = AutoModelForQuestionAnswering.from_pretrained(path)
# Tensorflow
from transformers import AutoTokenizer, TFAutoModelForQuestionAnswering
path = 'pedramyazdipoor/parsbert_question_answering_PQuAD'
tokenizer = AutoTokenizer.from_pretrained(path)
model = TFAutoModelForQuestionAnswering.from_pretrained(path)
# Inference para Pytorch
import torch
import numpy as np
def generate_indexes(start_logits, end_logits, N, max_index):
output_start = start_logits
output_end = end_logits
start_indexes = np.arange(len(start_logits))
start_probs = output_start
list_start = dict(zip(start_indexes, start_probs.tolist()))
end_indexes = np.arange(len(end_logits))
end_probs = output_end
list_end = dict(zip(end_indexes, end_probs.tolist()))
sorted_start_list = sorted(list_start.items(), key=lambda x: x[1], reverse=True)
sorted_end_list = sorted(list_end.items(), key=lambda x: x[1], reverse=True)
final_start_idx, final_end_idx = [[] for l in range(2)]
start_idx, end_idx, prob = 0, 0, (start_probs.tolist()[0] + end_probs.tolist()[0])
for a in range(0,N):
for b in range(0,N):
if (sorted_start_list[a][1] + sorted_end_list[b][1]) > prob:
if (sorted_start_list[a][0] < sorted_end_list[b][0]) and (sorted_end_list[b][0] < max_index):
prob = sorted_start_list[a][1] + sorted_end_list[b][1]
start_idx = sorted_start_list[a][0]
end_idx = sorted_end_list[b][0]
final_start_idx.append(start_idx)
final_end_idx.append(end_idx)
return final_start_idx[0], final_end_idx[0]
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
model.eval().to(device)
text = 'Saludos, tengo 26 años'
question = '¿Cuántos años tengo?'
encoding = tokenizer(text,question,add_special_tokens=True, return_token_type_ids=True, return_tensors='pt', padding=True, return_offsets_mapping=True, truncation='only_first', max_length=32)
out = model(encoding['input_ids'].to(device),encoding['attention_mask'].to(device), encoding['token_type_ids'].to(device))
answer_start_index, answer_end_index = generate_indexes(out['start_logits'][0][1:], out['end_logits'][0][1:], 5, 0)
print(tokenizer.tokenize(text + question))
print(tokenizer.tokenize(text + question)[answer_start_index : (answer_end_index + 1)])
Funcionalidades
- Basado en la arquitectura BERT de Google
- Preentrenado en grandes corpus persas
- Finetuneado en el conjunto de datos PQuAD para respuesta a preguntas
- Incluye código fuente y documentación detallada
- Soporte para PyTorch y TensorFlow
Casos de uso
- Responder preguntas extractivas basadas en texto en persa
- Aplicaciones en sistemas de respuesta automática en persa
- Soporte para investigaciones que requieren interpretación de textos en persa