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