pedramyazdipoor/persian_xlm_roberta_large
pedramyazdipoor
Pregunta y respuesta
XLM-RoBERTA es un modelo de lenguaje multilingüe preentrenado en 2.5TB de datos filtrados de CommonCrawl que contiene 100 idiomas. Fue introducido en el documento 'Unsupervised Cross-lingual Representation Learning at Scale' por Conneau et al. Este modelo multilingüe de XLM-RoBERTa grande para QA en varios idiomas está afinado en varios conjuntos de datos de QA, pero PQuAD, que es el mayor conjunto de datos persa de QA hasta ahora. Este segundo modelo es nuestro modelo base para ser afinado.
Como usar
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
path = 'pedramyazdipoor/persian_xlm_roberta_large'
tokenizer = AutoTokenizer.from_pretrained(path)
model = AutoModelForQuestionAnswering.from_pretrained(path)
text = 'سلام من پدرامم 26 سالمه'
question = 'چند سالمه؟'
encoding = tokenizer(question, text, 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)])
def generate_indexes(start_logits, end_logits, N, min_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) #Descending sort by probability
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] 0]) and (sorted_start_list[a][0] > min_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]
# Dispositivos
import torch
import numpy as np
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
model.eval().to(device)
Funcionalidades
- Fine-tuning en el conjunto de entrenamiento de PQuAD
- Tiempos de entrenamiento largos
- Base de modelo de lenguaje: 'deepset/xlm-roberta-large-squad2'
- Evaluación en el conjunto de prueba persa de PQuAD
- Mejora sobre ParsBert en PQuAD
Casos de uso
- Responder preguntas en persa
- Mejora en modelos anteriores como ParsBert