File size: 5,928 Bytes
691fae2 2506bd5 4a7ec60 691fae2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
---
language:
- ru
license: mit
tags:
- text2text-generation
datasets:
- Grpp/t5-russian-spell_I
base_model: Grpp/rut5-base
widget:
- text: 'Исправь: нападавше иты кроме того при наадении на отдел уиполицииранение'
---
# Model Card for Grpp/T5_spell-base
<!-- Provide a quick summary of what the model is/does. -->
Модель для исправления опечаток на русском языке
## Model Details
### Model Description
<!-- Provide a longer summary of what this model is. -->
- **Language(s) (NLP):** ['ru']
- **License:** mit
- **Finetuned from model [optional]:** Grpp/rut5-base
## Uses
<!-- Address questions around how the model is intended to be used, including the foreseeable users of the model and those affected by the model. -->
### Direct Use
<!-- This section is for the model use without fine-tuning or plugging into a larger ecosystem/app. -->
```python
from transformers import pipeline
from transformers import T5ForConditionalGeneration, T5Tokenizer, Text2TextGenerationPipeline
# Создание pipeline для генерации текста
PIPELINE = Text2TextGenerationPipeline(model=model, tokenizer=tokenizer, device=0)
def answer_m(list_texts):
texts = []
for txt in tqdm(list_texts):
texts.append(
PIPELINE(
txt,
max_length=256,
repetition_penalty=1.5,
temperature=0.7,
top_k=50,
num_return_sequences=1
)[0]['generated_text'])
return texts
text = 'нападавше иты кроме того при наадении на отдел уиполицииранение получилаи женщина из гражчданских сообщилон анронимныйистточни агентста тасс со ссылкой на источник пишет что у одногао из преступников быиевзрычатычгтка полицейские потребовали чтобнападавшие останвеились после чего те дотали ножи'
prefix = 'Исправь: '
text_to_model = prefix + text
answer_m([text_to_model])
# ['Нападавшие иты Кроме того, при нападении на отдел полиции ранение получила женщина из гражданских сообщил один аналогичный источник. Агентство ТАСС со ссылкой на источник пишет, что у одного из преступников были взрывчатка: полицейские потребовали, чтобы напавшие остановились после чего те достали ножы.']
```
## Training Details
### Training Procedure
```python
import torch
from transformers import T5ForConditionalGeneration, T5Tokenizer
from torch.utils.data import Dataset, DataLoader
from transformers import AdamW
from tqdm.auto import tqdm
raw_model = 'Grpp/T5_spell-base' # предобученная модель
DATASET = "Grpp/t5-russian-spell_I" # Введите наазвание название датасета
model = T5ForConditionalGeneration.from_pretrained(raw_model).cuda();
tokenizer = T5Tokenizer.from_pretrained(raw_model)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
# Загрузка датасета
new_dataset = load_dataset(DATASET)
model.to('cuda')
_ = model.config
batch_size = 8 # сколько примеров показываем модели за один шаг
report_steps = 1000 # раз в сколько шагов печатаем результат
epochs = 1 # сколько раз мы покажем данные модели
class TextDataset(Dataset):
def __init__(self, tokenizer, pairs):
self.tokenizer = tokenizer
self.pairs = pairs
def __len__(self):
return len(self.pairs)
def __getitem__(self, idx):
question = self.pairs[idx]['input_text'].replace('Spell correct: ', 'Исправь: ')
answer = self.pairs[idx]['label_text']
source = self.tokenizer(question, padding='max_length', truncation=True, max_length=256, return_tensors='pt')
target = self.tokenizer(answer, padding='max_length', truncation=True, max_length=256, return_tensors='pt')
target.input_ids[target.input_ids == 0] = -100
return source, target
def train_epoch(model, dataloader, optimizer):
model.train()
losses = []
for i, (x, y) in enumerate(tqdm(dataloader)):
optimizer.zero_grad()
outputs = model(
input_ids=x['input_ids'].squeeze().to(model.device),
attention_mask=x['attention_mask'].squeeze().to(model.device),
labels=y['input_ids'].squeeze().to(model.device),
decoder_attention_mask=y['attention_mask'].squeeze().to(model.device),
)
loss = outputs.loss
loss.backward()
optimizer.step()
losses.append(loss.item())
if i % report_steps == 0:
print('step', i, 'loss', np.mean(losses[-report_steps:]))
return np.mean(losses)
# Создаем датасет и даталоадер
dataset = TextDataset(tokenizer, new_dataset['train'])
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
# Оптимизатор
optimizer = AdamW(model.parameters(), lr=5e-5)
model_name_t5 = 'T5_spell-base'
# Обучение модели
for epoch in range(epochs):
print('EPOCH', epoch + 1)
epoch_loss = train_epoch(model, dataloader, optimizer)
print(f'Epoch {epoch + 1} Loss: {epoch_loss}')
# Сохранение модели после каждой эпохи
print('saving')
model.save_pretrained(model_name_t5)
tokenizer.save_pretrained(model_name_t5)
```
|