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)
```