├── .DS_Store
├── DigitalPeter
├── README.md
├── advanced_methods.ipynb
├── baseline.ipynb
└── pics
│ ├── counts_hor.png
│ ├── leaderboard.png
│ ├── line_label.png
│ └── one_line.jpg
├── IDP-forms
├── README.md
├── august.png
└── form.png
├── README.md
└── school_notebooks
├── .DS_Store
├── README.md
└── pics
├── 460.png
├── razmetka_list.png
└── razmetka_word.png
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/.DS_Store
--------------------------------------------------------------------------------
/DigitalPeter/README.md:
--------------------------------------------------------------------------------
1 | # DigitalPeter
2 |
3 | [Link](https://huggingface.co/datasets/sberbank-ai/Peter) to HuggingFace repo of the Peter dataset (there you can download and read about the dataset).
4 |
5 | ## Description
6 |
7 | The dataset consists of 9694 images and text files. There are 265788 symbols and approximately 50998 words.
8 |
9 |
10 |
11 |
12 |
13 | Each pair consists of one image file and one text file. File names have the format . Where - is a document number, - is a page number in the document , - is a line number in the page of document . Such a naming system was created to help researchers who use our dataset to reconstruct original texts. One can train NLP models to help decrease the HTR model error.
14 |
15 | Here is an example of one line of text.
16 |
17 |
18 |
19 |
20 |
21 | Here is an example of segmented document.
22 |
23 |
24 |
25 |
26 | ## Train
27 |
28 | Keras implementation of CNN-GRU-CTC model is presented in notebook [```baseline.ipynb```].
29 |
30 | ## Competition
31 | We held a competition based on Digital Peter dataset.
32 | Here is github [link](https://github.com/sberbank-ai/digital_peter_aij2020). Here is competition [page](https://ods.ai/tracks/aij2020) (need to register).
33 |
34 | Here is the final leaderboard for this competition. Scores are presented for the private set. Baseline solution presented in this github has the following metric - 9,786 44,222 21,532 (CER,WER,ACC).
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/DigitalPeter/baseline.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 3,
6 | "metadata": {
7 | "colab": {},
8 | "colab_type": "code",
9 | "id": "WyBpW92f6Ara",
10 | "scrolled": true
11 | },
12 | "outputs": [],
13 | "source": [
14 | "import numpy as np\n",
15 | "import cv2\n",
16 | "import os\n",
17 | "import string\n",
18 | "import matplotlib.pyplot as plt\n",
19 | "import tqdm\n",
20 | "from os.path import join\n",
21 | "from collections import Counter\n",
22 | "import re \n",
23 | "import io\n",
24 | "import copy\n",
25 | "from tensorflow.keras import layers\n",
26 | "import editdistance\n",
27 | "\n",
28 | "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
29 | "from tensorflow.keras import layers\n",
30 | "\n",
31 | "from tensorflow.keras.layers import Dense, LSTM,GRU, Reshape, BatchNormalization, Input, Conv2D, MaxPool2D, Lambda, Bidirectional\n",
32 | "from tensorflow.keras.models import Model\n",
33 | "from tensorflow.keras.activations import relu, sigmoid, softmax\n",
34 | "import tensorflow.keras.backend as K\n",
35 | "from tensorflow.keras.utils import to_categorical\n",
36 | "from tensorflow.keras.callbacks import ModelCheckpoint"
37 | ]
38 | },
39 | {
40 | "cell_type": "markdown",
41 | "metadata": {},
42 | "source": [
43 | "Versions."
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": 5,
49 | "metadata": {},
50 | "outputs": [
51 | {
52 | "name": "stdout",
53 | "output_type": "stream",
54 | "text": [
55 | "TensorFlow version: 2.2.0\n",
56 | "Keras version: 2.4.3\n"
57 | ]
58 | }
59 | ],
60 | "source": [
61 | "import keras\n",
62 | "import tensorflow as tf\n",
63 | "print('TensorFlow version:', tf.__version__)\n",
64 | "print('Keras version:', keras.__version__)"
65 | ]
66 | },
67 | {
68 | "cell_type": "code",
69 | "execution_count": 8,
70 | "metadata": {},
71 | "outputs": [],
72 | "source": [
73 | "gpus = tf.config.experimental.list_physical_devices('GPU')\n",
74 | "if gpus:\n",
75 | " # Restrict TensorFlow to only allocate 1GB of memory on the first GPU\n",
76 | " tf.config.experimental.set_virtual_device_configuration(\n",
77 | " gpus[0],\n",
78 | " [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=28000)])\n",
79 | " logical_gpus = tf.config.experimental.list_logical_devices('GPU')\n",
80 | " #physical_devices = tf.config.list_physical_devices('GPU')\n",
81 | " #tf.config.experimental.set_memory_growth(physical_devices[0], True)"
82 | ]
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "metadata": {},
87 | "source": [
88 | "* CUDA 10.1\n",
89 | "* cv2 4.3.0\n",
90 | "* numpy 1.19.2\n",
91 | "* re 2.2.1\n",
92 | "* tqdm 4.46.0\n",
93 | "* matplotlib 3.3.2\n",
94 | "\n",
95 | "\n",
96 | "\n",
97 | "* Nvidia Tesla V100 32Gb"
98 | ]
99 | },
100 | {
101 | "cell_type": "markdown",
102 | "metadata": {
103 | "colab_type": "text",
104 | "id": "XYb61RIzE_kW"
105 | },
106 | "source": [
107 | "**Path for images ant labels.**"
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": 6,
113 | "metadata": {},
114 | "outputs": [
115 | {
116 | "name": "stdout",
117 | "output_type": "stream",
118 | "text": [
119 | "9694\n"
120 | ]
121 | }
122 | ],
123 | "source": [
124 | "#This foler contains txt files with translation \n",
125 | "trans_dir = 'data/words'\n",
126 | "#This folder contains jpg images\n",
127 | "image_dir = 'data/images'\n",
128 | "\n",
129 | "print(len(os.listdir(trans_dir)))"
130 | ]
131 | },
132 | {
133 | "cell_type": "markdown",
134 | "metadata": {},
135 | "source": [
136 | "Show one image."
137 | ]
138 | },
139 | {
140 | "cell_type": "code",
141 | "execution_count": 10,
142 | "metadata": {},
143 | "outputs": [],
144 | "source": [
145 | "example = os.listdir(image_dir)[0]"
146 | ]
147 | },
148 | {
149 | "cell_type": "code",
150 | "execution_count": 11,
151 | "metadata": {},
152 | "outputs": [
153 | {
154 | "data": {
155 | "image/png": "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\n",
156 | "text/plain": [
157 | ""
158 | ]
159 | },
160 | "metadata": {
161 | "needs_background": "light"
162 | },
163 | "output_type": "display_data"
164 | }
165 | ],
166 | "source": [
167 | "img = plt.imread(image_dir+'/'+example)\n",
168 | "plt.imshow(img)\n",
169 | "plt.show()"
170 | ]
171 | },
172 | {
173 | "cell_type": "markdown",
174 | "metadata": {},
175 | "source": [
176 | "And translation."
177 | ]
178 | },
179 | {
180 | "cell_type": "code",
181 | "execution_count": 9,
182 | "metadata": {
183 | "scrolled": true
184 | },
185 | "outputs": [
186 | {
187 | "name": "stdout",
188 | "output_type": "stream",
189 | "text": [
190 | "в тонигъ загналъ какъ росиские войски гдѣ я каман\n"
191 | ]
192 | }
193 | ],
194 | "source": [
195 | "with io.open(trans_dir+'/'+example[:-3]+'txt', 'r', encoding='utf8') as file:\n",
196 | " data = file.read()\n",
197 | "\n",
198 | "print(data)"
199 | ]
200 | },
201 | {
202 | "cell_type": "markdown",
203 | "metadata": {},
204 | "source": [
205 | "Peter is a dataset of russian language. But there is some english letter. Here in baseline we drop lines that contains english letters. It allows us to reduce the number of unique symbols. We do it only for train set."
206 | ]
207 | },
208 | {
209 | "cell_type": "code",
210 | "execution_count": 14,
211 | "metadata": {},
212 | "outputs": [],
213 | "source": [
214 | "english = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'm', 'n' ,'o', 'p', 'r', 's', 't', 'u', 'w']"
215 | ]
216 | },
217 | {
218 | "cell_type": "code",
219 | "execution_count": 15,
220 | "metadata": {},
221 | "outputs": [],
222 | "source": [
223 | "def text_to_labels(text):\n",
224 | " return list(map(lambda x: letters.index(x), text))"
225 | ]
226 | },
227 | {
228 | "cell_type": "markdown",
229 | "metadata": {},
230 | "source": [
231 | "Here we prepare labels (translated text). Ignore lines with english letters."
232 | ]
233 | },
234 | {
235 | "cell_type": "code",
236 | "execution_count": 16,
237 | "metadata": {},
238 | "outputs": [],
239 | "source": [
240 | "def process_texts(image_dir,trans_dir):\n",
241 | " lens = []\n",
242 | " include_english = 0\n",
243 | " letters = ''\n",
244 | "\n",
245 | " lines = []\n",
246 | " names = []\n",
247 | " \n",
248 | " all_files = os.listdir(trans_dir)\n",
249 | " for filename in os.listdir(image_dir):\n",
250 | " if filename[:-3]+'txt' in all_files:\n",
251 | " name, ext = os.path.splitext(filename)\n",
252 | " txt_filepath = join(trans_dir, name + '.txt')\n",
253 | " with open(txt_filepath, 'r') as file:\n",
254 | " data = file.read()\n",
255 | " if len(data)==0:\n",
256 | " continue\n",
257 | " if len(set(data).intersection(english))>0:\n",
258 | " continue\n",
259 | "\n",
260 | " lines.append(data)\n",
261 | " names.append(filename)\n",
262 | " lens.append(len(data))\n",
263 | " letters += data\n",
264 | " print('Max string length:', max(Counter(lens).keys()))\n",
265 | " print('Number of lines with english letters (we drop it) ',include_english)\n",
266 | "\n",
267 | " return names,lines,Counter(letters)"
268 | ]
269 | },
270 | {
271 | "cell_type": "markdown",
272 | "metadata": {},
273 | "source": [
274 | "So we get list of images (filenames), list of translated lines and the character dictionary."
275 | ]
276 | },
277 | {
278 | "cell_type": "code",
279 | "execution_count": 17,
280 | "metadata": {},
281 | "outputs": [
282 | {
283 | "name": "stdout",
284 | "output_type": "stream",
285 | "text": [
286 | "Max string length: 76\n",
287 | "Number of lines with english letters (we drop it) 0\n"
288 | ]
289 | }
290 | ],
291 | "source": [
292 | "names,lines,cnt = process_texts(image_dir,trans_dir)"
293 | ]
294 | },
295 | {
296 | "cell_type": "code",
297 | "execution_count": 18,
298 | "metadata": {},
299 | "outputs": [
300 | {
301 | "name": "stdout",
302 | "output_type": "stream",
303 | "text": [
304 | "Unique characters in train: # ( ) + / 0 1 2 3 4 5 6 7 8 9 [ ] i k l | × ǂ а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ѣ – ⊕ ⊗\n"
305 | ]
306 | }
307 | ],
308 | "source": [
309 | "letters = set(cnt.keys())\n",
310 | "\n",
311 | "letters = sorted(list(letters))\n",
312 | "print('Unique characters in train:', ' '.join(letters))"
313 | ]
314 | },
315 | {
316 | "cell_type": "markdown",
317 | "metadata": {},
318 | "source": [
319 | "Here we load images, resize and normalize it."
320 | ]
321 | },
322 | {
323 | "cell_type": "code",
324 | "execution_count": 19,
325 | "metadata": {
326 | "colab": {},
327 | "colab_type": "code",
328 | "id": "aXbMbbD5CREV"
329 | },
330 | "outputs": [],
331 | "source": [
332 | "def process_image(img):\n",
333 | " w, h,_ = img.shape\n",
334 | " \n",
335 | " new_w = 128\n",
336 | " new_h = int(h * (new_w / w))\n",
337 | " img = cv2.resize(img, (new_h, new_w))\n",
338 | " w, h,_ = img.shape\n",
339 | " \n",
340 | " img = img.astype('float32')\n",
341 | " \n",
342 | " if w < 128:\n",
343 | " add_zeros = np.full((128-w, h,3), 255)\n",
344 | " img = np.concatenate((img, add_zeros))\n",
345 | " w, h,_ = img.shape\n",
346 | " \n",
347 | " if h < 1024:\n",
348 | " add_zeros = np.full((w, 1024-h,3), 255)\n",
349 | " img = np.concatenate((img, add_zeros), axis=1)\n",
350 | " w, h,_ = img.shape\n",
351 | " \n",
352 | " if h > 1024 or w > 128:\n",
353 | " dim = (1024,128)\n",
354 | " img = cv2.resize(img, dim)\n",
355 | " \n",
356 | " img = cv2.subtract(255, img)\n",
357 | "\n",
358 | " img = img / 255\n",
359 | " \n",
360 | " return img"
361 | ]
362 | },
363 | {
364 | "cell_type": "markdown",
365 | "metadata": {
366 | "colab_type": "text",
367 | "id": "77zmid7KHly9"
368 | },
369 | "source": [
370 | "**Prepare data.**"
371 | ]
372 | },
373 | {
374 | "cell_type": "code",
375 | "execution_count": 20,
376 | "metadata": {},
377 | "outputs": [],
378 | "source": [
379 | "def generate_data(lines,names,image_dir):\n",
380 | " data_images = []\n",
381 | " data_labels = []\n",
382 | " data_input_length = []\n",
383 | " data_label_length = []\n",
384 | " data_original_text = []\n",
385 | " #data_original_image = []\n",
386 | " \n",
387 | " max_label_len = 0\n",
388 | " for line, name in tqdm.tqdm_notebook(zip(lines,names)):\n",
389 | " img = cv2.imread(image_dir+'/'+name)\n",
390 | " #original_image = copy.deepcopy(img)\n",
391 | " img = process_image(img)\n",
392 | " try:\n",
393 | " label = text_to_labels(line)\n",
394 | " except:\n",
395 | " print('bad_label')\n",
396 | " continue\n",
397 | " data_images.append(img)\n",
398 | " data_labels.append(label)\n",
399 | " data_input_length.append(255)\n",
400 | " data_label_length.append(len(line))\n",
401 | " data_original_text.append(line)\n",
402 | " #data_original_image.append(original_image)\n",
403 | " \n",
404 | " if len(line) > max_label_len:\n",
405 | " max_label_len = len(line)\n",
406 | " \n",
407 | " return data_images, data_labels, data_input_length, data_label_length, \\\n",
408 | " data_original_text, max_label_len"
409 | ]
410 | },
411 | {
412 | "cell_type": "markdown",
413 | "metadata": {},
414 | "source": [
415 | "Create train set and val set."
416 | ]
417 | },
418 | {
419 | "cell_type": "code",
420 | "execution_count": 21,
421 | "metadata": {},
422 | "outputs": [],
423 | "source": [
424 | "lines_train = []\n",
425 | "names_train = []\n",
426 | "\n",
427 | "lines_val = []\n",
428 | "names_val = []\n",
429 | "\n",
430 | "\n",
431 | "for num,(line, name) in enumerate(zip(lines,names)):\n",
432 | " if num % 15 == 0:\n",
433 | " lines_val.append(line)\n",
434 | " names_val.append(name)\n",
435 | " else:\n",
436 | " lines_train.append(line)\n",
437 | " names_train.append(name)"
438 | ]
439 | },
440 | {
441 | "cell_type": "code",
442 | "execution_count": 22,
443 | "metadata": {
444 | "scrolled": true
445 | },
446 | "outputs": [
447 | {
448 | "name": "stderr",
449 | "output_type": "stream",
450 | "text": [
451 | "/home/user/conda/lib/python3.7/site-packages/ipykernel_launcher.py:10: TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0\n",
452 | "Please use `tqdm.notebook.tqdm` instead of `tqdm.tqdm_notebook`\n",
453 | " # Remove the CWD from sys.path while we load stuff.\n"
454 | ]
455 | },
456 | {
457 | "data": {
458 | "application/vnd.jupyter.widget-view+json": {
459 | "model_id": "a002a2b68d6044f8acaab17a9894a6d7",
460 | "version_major": 2,
461 | "version_minor": 0
462 | },
463 | "text/plain": [
464 | "HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
465 | ]
466 | },
467 | "metadata": {},
468 | "output_type": "display_data"
469 | },
470 | {
471 | "name": "stdout",
472 | "output_type": "stream",
473 | "text": [
474 | "\n"
475 | ]
476 | }
477 | ],
478 | "source": [
479 | "train_images, train_labels, train_input_length, train_label_length, train_original_text, \\\n",
480 | " train_max_label_len = generate_data(lines_train, names_train, image_dir)"
481 | ]
482 | },
483 | {
484 | "cell_type": "code",
485 | "execution_count": 23,
486 | "metadata": {
487 | "scrolled": true
488 | },
489 | "outputs": [
490 | {
491 | "name": "stderr",
492 | "output_type": "stream",
493 | "text": [
494 | "/home/user/conda/lib/python3.7/site-packages/ipykernel_launcher.py:10: TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0\n",
495 | "Please use `tqdm.notebook.tqdm` instead of `tqdm.tqdm_notebook`\n",
496 | " # Remove the CWD from sys.path while we load stuff.\n"
497 | ]
498 | },
499 | {
500 | "data": {
501 | "application/vnd.jupyter.widget-view+json": {
502 | "model_id": "8f398a828e8645dd9cb32198f5946d66",
503 | "version_major": 2,
504 | "version_minor": 0
505 | },
506 | "text/plain": [
507 | "HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
508 | ]
509 | },
510 | "metadata": {},
511 | "output_type": "display_data"
512 | },
513 | {
514 | "name": "stdout",
515 | "output_type": "stream",
516 | "text": [
517 | "\n"
518 | ]
519 | }
520 | ],
521 | "source": [
522 | "val_images, val_labels, val_input_length, val_label_length, val_original_text, \\\n",
523 | " val_max_label_len = generate_data(lines_val, names_val, image_dir)"
524 | ]
525 | },
526 | {
527 | "cell_type": "code",
528 | "execution_count": 24,
529 | "metadata": {
530 | "scrolled": false
531 | },
532 | "outputs": [
533 | {
534 | "name": "stdout",
535 | "output_type": "stream",
536 | "text": [
537 | "76\n"
538 | ]
539 | }
540 | ],
541 | "source": [
542 | "max_label_len = max(train_max_label_len,val_max_label_len)\n",
543 | "print(max_label_len)"
544 | ]
545 | },
546 | {
547 | "cell_type": "markdown",
548 | "metadata": {},
549 | "source": [
550 | "A couple of processed images with translation."
551 | ]
552 | },
553 | {
554 | "cell_type": "code",
555 | "execution_count": 25,
556 | "metadata": {},
557 | "outputs": [
558 | {
559 | "name": "stderr",
560 | "output_type": "stream",
561 | "text": [
562 | "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n"
563 | ]
564 | },
565 | {
566 | "name": "stdout",
567 | "output_type": "stream",
568 | "text": [
569 | "тивом призрѣниi со\n"
570 | ]
571 | },
572 | {
573 | "data": {
574 | "image/png": "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\n",
575 | "text/plain": [
576 | ""
577 | ]
578 | },
579 | "metadata": {
580 | "needs_background": "light"
581 | },
582 | "output_type": "display_data"
583 | },
584 | {
585 | "name": "stderr",
586 | "output_type": "stream",
587 | "text": [
588 | "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n"
589 | ]
590 | },
591 | {
592 | "name": "stdout",
593 | "output_type": "stream",
594 | "text": [
595 | "ми свинцовыми\n"
596 | ]
597 | },
598 | {
599 | "data": {
600 | "image/png": "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\n",
601 | "text/plain": [
602 | ""
603 | ]
604 | },
605 | "metadata": {
606 | "needs_background": "light"
607 | },
608 | "output_type": "display_data"
609 | }
610 | ],
611 | "source": [
612 | "rnd = np.random.choice(range(len(train_images)),2)\n",
613 | "\n",
614 | "for i in rnd:\n",
615 | " print(train_original_text[i])\n",
616 | " plt.imshow(train_images[i])\n",
617 | " plt.show()"
618 | ]
619 | },
620 | {
621 | "cell_type": "markdown",
622 | "metadata": {
623 | "colab_type": "text",
624 | "id": "S08OVL07IsRY"
625 | },
626 | "source": [
627 | "**Pad labels to maximun length**"
628 | ]
629 | },
630 | {
631 | "cell_type": "code",
632 | "execution_count": 26,
633 | "metadata": {
634 | "colab": {},
635 | "colab_type": "code",
636 | "id": "CqJP3ZfnCbX5"
637 | },
638 | "outputs": [],
639 | "source": [
640 | "train_padded_label = pad_sequences(train_labels, \n",
641 | " maxlen=max_label_len, \n",
642 | " padding='post',\n",
643 | " value=len(letters))\n",
644 | "\n",
645 | "val_padded_label = pad_sequences(val_labels, \n",
646 | " maxlen=max_label_len, \n",
647 | " padding='post',\n",
648 | " value=len(letters))"
649 | ]
650 | },
651 | {
652 | "cell_type": "code",
653 | "execution_count": 27,
654 | "metadata": {
655 | "colab": {
656 | "base_uri": "https://localhost:8080/",
657 | "height": 34
658 | },
659 | "colab_type": "code",
660 | "id": "rPN6audwCnCO",
661 | "outputId": "245631e4-ae4f-40ca-d3c6-713cdf2d8fe6",
662 | "scrolled": true
663 | },
664 | "outputs": [
665 | {
666 | "data": {
667 | "text/plain": [
668 | "((8928, 76), (638, 76))"
669 | ]
670 | },
671 | "execution_count": 27,
672 | "metadata": {},
673 | "output_type": "execute_result"
674 | }
675 | ],
676 | "source": [
677 | "train_padded_label.shape, val_padded_label.shape"
678 | ]
679 | },
680 | {
681 | "cell_type": "markdown",
682 | "metadata": {},
683 | "source": [
684 | "Takes a lot of time."
685 | ]
686 | },
687 | {
688 | "cell_type": "code",
689 | "execution_count": null,
690 | "metadata": {
691 | "colab": {},
692 | "colab_type": "code",
693 | "id": "AsGyb8qGCoqb"
694 | },
695 | "outputs": [],
696 | "source": [
697 | "train_images = np.asarray(train_images)\n",
698 | "train_input_length = np.asarray(train_input_length)\n",
699 | "train_label_length = np.asarray(train_label_length)\n",
700 | "\n",
701 | "val_images = np.asarray(val_images)\n",
702 | "val_input_length = np.asarray(val_input_length)\n",
703 | "val_label_length = np.asarray(val_label_length)"
704 | ]
705 | },
706 | {
707 | "cell_type": "code",
708 | "execution_count": 36,
709 | "metadata": {
710 | "colab": {
711 | "base_uri": "https://localhost:8080/",
712 | "height": 34
713 | },
714 | "colab_type": "code",
715 | "id": "ynka_dx2D05g",
716 | "outputId": "a9528c37-881f-4fda-ad94-73894acc166c"
717 | },
718 | "outputs": [
719 | {
720 | "data": {
721 | "text/plain": [
722 | "(8928, 128, 1024, 3)"
723 | ]
724 | },
725 | "execution_count": 36,
726 | "metadata": {},
727 | "output_type": "execute_result"
728 | }
729 | ],
730 | "source": [
731 | "train_images.shape"
732 | ]
733 | },
734 | {
735 | "cell_type": "markdown",
736 | "metadata": {
737 | "colab_type": "text",
738 | "id": "1bcjvY3bKFXj"
739 | },
740 | "source": [
741 | "## **Model**"
742 | ]
743 | },
744 | {
745 | "cell_type": "markdown",
746 | "metadata": {},
747 | "source": [
748 | "The model consists of several CNN, GRU layers and use CTC-Loss."
749 | ]
750 | },
751 | {
752 | "cell_type": "code",
753 | "execution_count": 37,
754 | "metadata": {},
755 | "outputs": [],
756 | "source": [
757 | "inputs = Input(shape=(128,1024,3))\n",
758 | "\n",
759 | "conv_1 = Conv2D(64, (3,3), activation = 'relu', padding='same')(inputs)\n",
760 | "pool_1 = MaxPool2D(pool_size=(4, 2), strides=2)(conv_1)\n",
761 | "\n",
762 | "conv_2 = Conv2D(128, (3,3), activation = 'relu', padding='same')(pool_1)\n",
763 | "pool_2 = MaxPool2D(pool_size=(4, 2), strides=2)(conv_2)\n",
764 | "\n",
765 | "conv_3 = Conv2D(256, (3,3), activation = 'relu', padding='same')(pool_2)\n",
766 | "\n",
767 | "conv_4 = Conv2D(256, (3,3), activation = 'relu', padding='same')(conv_3)\n",
768 | "\n",
769 | "pool_4 = MaxPool2D(pool_size=(4, 1),padding='same')(conv_4)\n",
770 | "\n",
771 | "conv_5 = Conv2D(512, (3,3), activation = 'relu', padding='same')(pool_4)\n",
772 | "\n",
773 | "batch_norm_5 = BatchNormalization()(conv_5)\n",
774 | "\n",
775 | "conv_6 = Conv2D(512, (3,3), activation = 'relu', padding='same')(batch_norm_5)\n",
776 | "batch_norm_6 = BatchNormalization()(conv_6)\n",
777 | "pool_6 = MaxPool2D(pool_size=(4, 1),padding='same')(batch_norm_6)\n",
778 | "\n",
779 | "conv_7 = Conv2D(512, (2,2), activation = 'relu')(pool_6)\n",
780 | "\n",
781 | "squeezed = Lambda(lambda x: K.squeeze(x, 1))(conv_7)\n",
782 | "\n",
783 | "blstm_1 = Bidirectional(GRU(256, return_sequences=True, dropout = 0.2))(squeezed)\n",
784 | "blstm_2 = Bidirectional(GRU(256, return_sequences=True, dropout = 0.2))(blstm_1)\n",
785 | "\n",
786 | "outputs = Dense(len(letters)+1, activation = 'softmax')(blstm_2)\n",
787 | "act_model = Model(inputs=inputs, outputs=outputs)\n",
788 | " \n",
789 | "the_labels = Input(name='the_labels', shape=[max_label_len], dtype='float32')\n",
790 | "input_length = Input(name='input_length', shape=[1], dtype='int64')\n",
791 | "label_length = Input(name='label_length', shape=[1], dtype='int64')\n",
792 | "\n",
793 | "def ctc_lambda_func(args):\n",
794 | " y_pred, labels, input_length, label_length = args\n",
795 | "\n",
796 | " return K.ctc_batch_cost(labels, y_pred, input_length, label_length)\n",
797 | "\n",
798 | "loss_out = Lambda(ctc_lambda_func, output_shape=(1,), name='ctc')([outputs, the_labels, input_length, label_length])\n",
799 | "\n",
800 | "model = Model(inputs=[inputs, the_labels, input_length, label_length], outputs=loss_out)"
801 | ]
802 | },
803 | {
804 | "cell_type": "code",
805 | "execution_count": 38,
806 | "metadata": {},
807 | "outputs": [
808 | {
809 | "name": "stdout",
810 | "output_type": "stream",
811 | "text": [
812 | "Model: \"model_2\"\n",
813 | "_________________________________________________________________\n",
814 | "Layer (type) Output Shape Param # \n",
815 | "=================================================================\n",
816 | "input_2 (InputLayer) [(None, 128, 1024, 3)] 0 \n",
817 | "_________________________________________________________________\n",
818 | "conv2d_7 (Conv2D) (None, 128, 1024, 64) 1792 \n",
819 | "_________________________________________________________________\n",
820 | "max_pooling2d_4 (MaxPooling2 (None, 63, 512, 64) 0 \n",
821 | "_________________________________________________________________\n",
822 | "conv2d_8 (Conv2D) (None, 63, 512, 128) 73856 \n",
823 | "_________________________________________________________________\n",
824 | "max_pooling2d_5 (MaxPooling2 (None, 30, 256, 128) 0 \n",
825 | "_________________________________________________________________\n",
826 | "conv2d_9 (Conv2D) (None, 30, 256, 256) 295168 \n",
827 | "_________________________________________________________________\n",
828 | "conv2d_10 (Conv2D) (None, 30, 256, 256) 590080 \n",
829 | "_________________________________________________________________\n",
830 | "max_pooling2d_6 (MaxPooling2 (None, 8, 256, 256) 0 \n",
831 | "_________________________________________________________________\n",
832 | "conv2d_11 (Conv2D) (None, 8, 256, 512) 1180160 \n",
833 | "_________________________________________________________________\n",
834 | "batch_normalization_2 (Batch (None, 8, 256, 512) 2048 \n",
835 | "_________________________________________________________________\n",
836 | "conv2d_12 (Conv2D) (None, 8, 256, 512) 2359808 \n",
837 | "_________________________________________________________________\n",
838 | "batch_normalization_3 (Batch (None, 8, 256, 512) 2048 \n",
839 | "_________________________________________________________________\n",
840 | "max_pooling2d_7 (MaxPooling2 (None, 2, 256, 512) 0 \n",
841 | "_________________________________________________________________\n",
842 | "conv2d_13 (Conv2D) (None, 1, 255, 512) 1049088 \n",
843 | "_________________________________________________________________\n",
844 | "lambda_1 (Lambda) (None, 255, 512) 0 \n",
845 | "_________________________________________________________________\n",
846 | "bidirectional_2 (Bidirection (None, 255, 512) 1182720 \n",
847 | "_________________________________________________________________\n",
848 | "bidirectional_3 (Bidirection (None, 255, 512) 1182720 \n",
849 | "_________________________________________________________________\n",
850 | "dense_1 (Dense) (None, 255, 61) 31293 \n",
851 | "=================================================================\n",
852 | "Total params: 7,950,781\n",
853 | "Trainable params: 7,948,733\n",
854 | "Non-trainable params: 2,048\n",
855 | "_________________________________________________________________\n"
856 | ]
857 | }
858 | ],
859 | "source": [
860 | "act_model.summary()"
861 | ]
862 | },
863 | {
864 | "cell_type": "code",
865 | "execution_count": 39,
866 | "metadata": {},
867 | "outputs": [],
868 | "source": [
869 | "batch_size = 60\n",
870 | "epochs = 300\n",
871 | "\n",
872 | "from tensorflow.keras.callbacks import EarlyStopping,ReduceLROnPlateau\n",
873 | "\n",
874 | "model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer = 'adam', metrics=['accuracy'])\n",
875 | "\n",
876 | "os.makedirs('checkpoint', exist_ok=True)\n",
877 | "\n",
878 | "filepath=\"checkpoint/model.hdf5\""
879 | ]
880 | },
881 | {
882 | "cell_type": "code",
883 | "execution_count": 28,
884 | "metadata": {
885 | "scrolled": true
886 | },
887 | "outputs": [
888 | {
889 | "name": "stdout",
890 | "output_type": "stream",
891 | "text": [
892 | "Epoch 1/300\n",
893 | "\n",
894 | "Epoch 00001: val_accuracy improved from -inf to 0.00000, saving model to checkpoint/model.hdf5\n",
895 | "149/149 - 77s - loss: 104.3876 - accuracy: 0.0000e+00 - val_loss: 96.3332 - val_accuracy: 0.0000e+00 - lr: 0.0010\n",
896 | "Epoch 2/300\n",
897 | "\n",
898 | "Epoch 00002: val_accuracy did not improve from 0.00000\n",
899 | "149/149 - 70s - loss: 89.1907 - accuracy: 0.0000e+00 - val_loss: 95.7020 - val_accuracy: 0.0000e+00 - lr: 0.0010\n",
900 | "Epoch 3/300\n",
901 | "\n",
902 | "Epoch 00003: val_accuracy did not improve from 0.00000\n",
903 | "149/149 - 71s - loss: 82.0753 - accuracy: 0.0000e+00 - val_loss: 124.4885 - val_accuracy: 0.0000e+00 - lr: 0.0010\n",
904 | "Epoch 4/300\n",
905 | "\n",
906 | "Epoch 00004: val_accuracy did not improve from 0.00000\n",
907 | "149/149 - 69s - loss: 43.9647 - accuracy: 0.0000e+00 - val_loss: 82.0149 - val_accuracy: 0.0000e+00 - lr: 0.0010\n",
908 | "Epoch 5/300\n",
909 | "\n",
910 | "Epoch 00005: val_accuracy did not improve from 0.00000\n",
911 | "149/149 - 70s - loss: 20.9432 - accuracy: 0.0021 - val_loss: 32.4083 - val_accuracy: 0.0000e+00 - lr: 0.0010\n",
912 | "Epoch 6/300\n",
913 | "\n",
914 | "Epoch 00006: val_accuracy improved from 0.00000 to 0.01254, saving model to checkpoint/model.hdf5\n",
915 | "149/149 - 69s - loss: 14.9283 - accuracy: 0.0094 - val_loss: 16.7367 - val_accuracy: 0.0125 - lr: 0.0010\n",
916 | "Epoch 7/300\n",
917 | "\n",
918 | "Epoch 00007: val_accuracy improved from 0.01254 to 0.02194, saving model to checkpoint/model.hdf5\n",
919 | "149/149 - 70s - loss: 12.1023 - accuracy: 0.0217 - val_loss: 14.8859 - val_accuracy: 0.0219 - lr: 0.0010\n",
920 | "Epoch 8/300\n",
921 | "\n",
922 | "Epoch 00008: val_accuracy improved from 0.02194 to 0.03605, saving model to checkpoint/model.hdf5\n",
923 | "149/149 - 70s - loss: 10.2147 - accuracy: 0.0310 - val_loss: 12.3754 - val_accuracy: 0.0361 - lr: 0.0010\n",
924 | "Epoch 9/300\n",
925 | "\n",
926 | "Epoch 00009: val_accuracy did not improve from 0.03605\n",
927 | "149/149 - 70s - loss: 8.7750 - accuracy: 0.0414 - val_loss: 11.4294 - val_accuracy: 0.0345 - lr: 0.0010\n",
928 | "Epoch 10/300\n",
929 | "\n",
930 | "Epoch 00010: val_accuracy improved from 0.03605 to 0.04075, saving model to checkpoint/model.hdf5\n",
931 | "149/149 - 69s - loss: 7.6014 - accuracy: 0.0534 - val_loss: 10.4927 - val_accuracy: 0.0408 - lr: 0.0010\n",
932 | "Epoch 11/300\n",
933 | "\n",
934 | "Epoch 00011: val_accuracy improved from 0.04075 to 0.06113, saving model to checkpoint/model.hdf5\n",
935 | "149/149 - 70s - loss: 6.7488 - accuracy: 0.0625 - val_loss: 10.2705 - val_accuracy: 0.0611 - lr: 0.0010\n",
936 | "Epoch 12/300\n",
937 | "\n",
938 | "Epoch 00012: val_accuracy improved from 0.06113 to 0.06897, saving model to checkpoint/model.hdf5\n",
939 | "149/149 - 69s - loss: 6.0431 - accuracy: 0.0787 - val_loss: 10.7830 - val_accuracy: 0.0690 - lr: 0.0010\n",
940 | "Epoch 13/300\n",
941 | "\n",
942 | "Epoch 00013: val_accuracy improved from 0.06897 to 0.07837, saving model to checkpoint/model.hdf5\n",
943 | "149/149 - 70s - loss: 5.3598 - accuracy: 0.0997 - val_loss: 10.0072 - val_accuracy: 0.0784 - lr: 0.0010\n",
944 | "Epoch 14/300\n",
945 | "\n",
946 | "Epoch 00014: val_accuracy did not improve from 0.07837\n",
947 | "149/149 - 69s - loss: 4.8348 - accuracy: 0.1294 - val_loss: 10.5405 - val_accuracy: 0.0674 - lr: 0.0010\n",
948 | "Epoch 15/300\n",
949 | "\n",
950 | "Epoch 00015: val_accuracy did not improve from 0.07837\n",
951 | "149/149 - 68s - loss: 4.5673 - accuracy: 0.1416 - val_loss: 10.1993 - val_accuracy: 0.0658 - lr: 0.0010\n",
952 | "Epoch 16/300\n",
953 | "\n",
954 | "Epoch 00016: val_accuracy did not improve from 0.07837\n",
955 | "149/149 - 69s - loss: 4.0955 - accuracy: 0.1748 - val_loss: 10.6662 - val_accuracy: 0.0737 - lr: 0.0010\n",
956 | "Epoch 17/300\n",
957 | "\n",
958 | "Epoch 00017: val_accuracy improved from 0.07837 to 0.09718, saving model to checkpoint/model.hdf5\n",
959 | "149/149 - 71s - loss: 3.8578 - accuracy: 0.2050 - val_loss: 10.2725 - val_accuracy: 0.0972 - lr: 0.0010\n",
960 | "Epoch 18/300\n",
961 | "\n",
962 | "Epoch 00018: val_accuracy improved from 0.09718 to 0.11912, saving model to checkpoint/model.hdf5\n",
963 | "149/149 - 70s - loss: 3.5073 - accuracy: 0.2476 - val_loss: 10.5677 - val_accuracy: 0.1191 - lr: 0.0010\n",
964 | "Epoch 19/300\n",
965 | "\n",
966 | "Epoch 00019: val_accuracy improved from 0.11912 to 0.14420, saving model to checkpoint/model.hdf5\n",
967 | "149/149 - 69s - loss: 2.8024 - accuracy: 0.3693 - val_loss: 10.1999 - val_accuracy: 0.1442 - lr: 7.0000e-04\n",
968 | "Epoch 20/300\n",
969 | "\n",
970 | "Epoch 00020: val_accuracy improved from 0.14420 to 0.15831, saving model to checkpoint/model.hdf5\n",
971 | "149/149 - 67s - loss: 2.3308 - accuracy: 0.4944 - val_loss: 10.5464 - val_accuracy: 0.1583 - lr: 7.0000e-04\n",
972 | "Epoch 21/300\n",
973 | "\n",
974 | "Epoch 00021: val_accuracy improved from 0.15831 to 0.18652, saving model to checkpoint/model.hdf5\n",
975 | "149/149 - 69s - loss: 2.1199 - accuracy: 0.5715 - val_loss: 10.8228 - val_accuracy: 0.1865 - lr: 7.0000e-04\n",
976 | "Epoch 22/300\n",
977 | "\n",
978 | "Epoch 00022: val_accuracy did not improve from 0.18652\n",
979 | "149/149 - 68s - loss: 2.0357 - accuracy: 0.5982 - val_loss: 10.9063 - val_accuracy: 0.1646 - lr: 7.0000e-04\n",
980 | "Epoch 23/300\n",
981 | "\n",
982 | "Epoch 00023: val_accuracy did not improve from 0.18652\n",
983 | "149/149 - 67s - loss: 2.0971 - accuracy: 0.5846 - val_loss: 11.3419 - val_accuracy: 0.1599 - lr: 7.0000e-04\n",
984 | "Epoch 24/300\n",
985 | "\n",
986 | "Epoch 00024: val_accuracy improved from 0.18652 to 0.19122, saving model to checkpoint/model.hdf5\n",
987 | "149/149 - 70s - loss: 1.8410 - accuracy: 0.6875 - val_loss: 10.9926 - val_accuracy: 0.1912 - lr: 4.9000e-04\n",
988 | "Epoch 25/300\n",
989 | "\n",
990 | "Epoch 00025: val_accuracy improved from 0.19122 to 0.20063, saving model to checkpoint/model.hdf5\n",
991 | "149/149 - 69s - loss: 1.6492 - accuracy: 0.7849 - val_loss: 11.4924 - val_accuracy: 0.2006 - lr: 4.9000e-04\n",
992 | "Epoch 26/300\n",
993 | "\n",
994 | "Epoch 00026: val_accuracy did not improve from 0.20063\n",
995 | "149/149 - 68s - loss: 1.5997 - accuracy: 0.8113 - val_loss: 11.6080 - val_accuracy: 0.1803 - lr: 4.9000e-04\n",
996 | "Epoch 27/300\n",
997 | "\n",
998 | "Epoch 00027: val_accuracy did not improve from 0.20063\n",
999 | "149/149 - 67s - loss: 1.6060 - accuracy: 0.8129 - val_loss: 11.7693 - val_accuracy: 0.1897 - lr: 4.9000e-04\n",
1000 | "Epoch 28/300\n",
1001 | "\n",
1002 | "Epoch 00028: val_accuracy did not improve from 0.20063\n",
1003 | "149/149 - 69s - loss: 1.5591 - accuracy: 0.8310 - val_loss: 12.1967 - val_accuracy: 0.1803 - lr: 4.9000e-04\n",
1004 | "Epoch 29/300\n",
1005 | "\n",
1006 | "Epoch 00029: val_accuracy did not improve from 0.20063\n",
1007 | "149/149 - 68s - loss: 1.4836 - accuracy: 0.8729 - val_loss: 11.7354 - val_accuracy: 0.2006 - lr: 3.4300e-04\n",
1008 | "Epoch 30/300\n",
1009 | "\n",
1010 | "Epoch 00030: val_accuracy improved from 0.20063 to 0.21473, saving model to checkpoint/model.hdf5\n",
1011 | "149/149 - 71s - loss: 1.4073 - accuracy: 0.9115 - val_loss: 11.9670 - val_accuracy: 0.2147 - lr: 3.4300e-04\n",
1012 | "Epoch 31/300\n",
1013 | "\n",
1014 | "Epoch 00031: val_accuracy did not improve from 0.21473\n",
1015 | "149/149 - 68s - loss: 1.3808 - accuracy: 0.9239 - val_loss: 12.3359 - val_accuracy: 0.2069 - lr: 3.4300e-04\n",
1016 | "Epoch 32/300\n",
1017 | "\n",
1018 | "Epoch 00032: val_accuracy did not improve from 0.21473\n",
1019 | "149/149 - 66s - loss: 1.3714 - accuracy: 0.9239 - val_loss: 12.2297 - val_accuracy: 0.2006 - lr: 3.4300e-04\n",
1020 | "Epoch 33/300\n",
1021 | "\n",
1022 | "Epoch 00033: val_accuracy did not improve from 0.21473\n",
1023 | "149/149 - 66s - loss: 1.3745 - accuracy: 0.9303 - val_loss: 12.2128 - val_accuracy: 0.2100 - lr: 3.4300e-04\n",
1024 | "Epoch 00033: early stopping\n"
1025 | ]
1026 | }
1027 | ],
1028 | "source": [
1029 | "es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=20)\n",
1030 | "reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.7,\n",
1031 | " patience=5, min_lr=0.00001)\n",
1032 | "\n",
1033 | "checkpoint = ModelCheckpoint(filepath=filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='auto')\n",
1034 | "callbacks_list = [checkpoint,es,reduce_lr]\n",
1035 | "\n",
1036 | "history = model.fit(x=[train_images, train_padded_label, train_input_length, train_label_length],\n",
1037 | " y=np.zeros(len(train_images)),\n",
1038 | " batch_size=batch_size, \n",
1039 | " epochs=epochs, \n",
1040 | " validation_data=([val_images, val_padded_label, val_input_length, val_label_length], [np.zeros(len(val_images))]),\n",
1041 | " verbose=2,\n",
1042 | " callbacks=callbacks_list)\n"
1043 | ]
1044 | },
1045 | {
1046 | "cell_type": "markdown",
1047 | "metadata": {},
1048 | "source": [
1049 | "Look at val metrics."
1050 | ]
1051 | },
1052 | {
1053 | "cell_type": "code",
1054 | "execution_count": 40,
1055 | "metadata": {},
1056 | "outputs": [],
1057 | "source": [
1058 | "import time"
1059 | ]
1060 | },
1061 | {
1062 | "cell_type": "code",
1063 | "execution_count": 41,
1064 | "metadata": {
1065 | "scrolled": true
1066 | },
1067 | "outputs": [
1068 | {
1069 | "name": "stdout",
1070 | "output_type": "stream",
1071 | "text": [
1072 | "5.158626556396484\n"
1073 | ]
1074 | }
1075 | ],
1076 | "source": [
1077 | "start = time.time()\n",
1078 | "act_model.load_weights(filepath)\n",
1079 | "prediction = act_model.predict(val_images)\n",
1080 | "\n",
1081 | "decoded = K.ctc_decode(prediction, \n",
1082 | " input_length=np.ones(prediction.shape[0]) * prediction.shape[1],\n",
1083 | " greedy=True)[0][0]\n",
1084 | "out = K.get_value(decoded)\n",
1085 | "end = time.time()\n",
1086 | "print(end-start)"
1087 | ]
1088 | },
1089 | {
1090 | "cell_type": "code",
1091 | "execution_count": 42,
1092 | "metadata": {
1093 | "scrolled": true
1094 | },
1095 | "outputs": [
1096 | {
1097 | "name": "stdout",
1098 | "output_type": "stream",
1099 | "text": [
1100 | "Ground truth -> Recognized\n",
1101 | "[ERR:3] \"в тонигъ загналъ какъ росиские войски гдѣ я каман\" -> \"в кониюъ загналъ какъ росиские войски гдѣя каман\"\n",
1102 | "[ERR:4] \"дѣла же оное iмѣет быт по сему перво надлежит\" -> \"дѣла же оное iмѣет бы го сему перлонадлежит\"\n",
1103 | "[OK] \"крѣпости тыся\" -> \"крѣпости тыся\"\n",
1104 | "[OK] \"шал что наши там з голоду поми\" -> \"шал что наши там з голоду поми\"\n",
1105 | "[ERR:1] \"а над ними съ губерниi камисар\" -> \"а надними съ губерниi камисар\"\n",
1106 | "[ERR:3] \"со фъсѣ войском вошел при котором доволное число\" -> \"софъсѣ войском вошел прикотором доволнае число\"\n",
1107 | "[ERR:2] \"буде же ночь то в одном пушечном перестрѣле\" -> \"буде же но чѣ то в одном пушечном перестрѣле\"\n",
1108 | "[ERR:2] \"каз iли камисарам\" -> \"каз iликами сарам\"\n",
1109 | "[ERR:5] \"а нынѣ вкратце пишу что не описаны преiз\" -> \"а нынѣ вкратце пишу что не отиияншу преiз\"\n",
1110 | "[OK] \"учинит] i тѣм лутчюю выгоду\" -> \"учинит] i тѣм лутчюю выгоду\"\n",
1111 | "[ERR:1] \"теля iз вассы выбит буде же крѣпъ\" -> \"теля iз вассы выбит будеже крѣпъ\"\n",
1112 | "[OK] \"ген i отака стралзунта\" -> \"ген i отака стралзунта\"\n",
1113 | "[ERR:4] \"обувей i протъчево\" -> \"обове i проть чево\"\n",
1114 | "[ERR:2] \"толко б мы не лениво бла\" -> \"толкоб мы нелениво бла\"\n",
1115 | "[OK] \"талию не въступил бы при сем\" -> \"талию не въступил бы при сем\"\n",
1116 | "[ERR:1] \"ства i дай нам знат конечно сего дни\" -> \"ства i дайнам знат конечно сего дни\"\n",
1117 | "[ERR:2] \"дебурской помераниi до элбинга а там взяф\" -> \"дебурской помераниi дом элбинга атам взяф\"\n",
1118 | "[ERR:1] \"любимым путем хотя хочетца с тобою\" -> \"любимым путом хотя хочетца с тобою\"\n",
1119 | "[ERR:2] \"сукны не подрежат но покупат у руских\" -> \"сукны не подрежат но покупат урусских\"\n",
1120 | "[ERR:6] \"ца карарбелныя лѣса подрядом а не уѣзноми людм\" -> \"ца карабнныя лѣса подрядом а не уѣзомилюм\"\n",
1121 | "[ERR:7] \"понеже кв от нас в амстрадамѣ + своiм войском\" -> \"понеже к в от нас вам страрамѣ вом войском\"\n",
1122 | "[ERR:2] \"другое чтоб отнюд с вами телѣгъ не\" -> \"другое чтоб отнюд свами те лѣгъ не\"\n",
1123 | "[ERR:1] \"iтит прямо к абоу\" -> \"iтит прямо кабоу\"\n",
1124 | "[ERR:4] \"на 1 чтоб депутатом в амстердамѣ\" -> \"на 1 чтоб депут татом вам стердамѣ\"\n",
1125 | "[ERR:1] \"дѣемся с помошию божиею также как лифъ\" -> \"дѣемся с помошию божиею также каклифъ\"\n",
1126 | "[OK] \"неси каралефъскому величеству чтоб iз\" -> \"неси каралефъскому величеству чтоб iз\"\n",
1127 | "[OK] \"посылаю копию какову полу\" -> \"посылаю копию какову полу\"\n",
1128 | "[ERR:1] \"а от которых областѣй ожи\" -> \"а от которых областѣй ожа\"\n",
1129 | "[OK] \"городицкой людей прибавит iз тѣхъ кото\" -> \"городицкой людей прибавит iз тѣхъ кото\"\n",
1130 | "[ERR:1] \"ности впред проiзойтит могут на то я тогда\" -> \"ности впред проiзойтит могут на тоя тогда\"\n",
1131 | "[OK] \"тысячь на своей пълатѣ i чтоб\" -> \"тысячь на своей пълатѣ i чтоб\"\n",
1132 | "[ERR:1] \"чтоб толко проводит\" -> \"чтоб толко просодит\"\n",
1133 | "[OK] \"му корпусу позволено было\" -> \"му корпусу позволено было\"\n",
1134 | "[ERR:2] \"чтоб самим наперет притит къ\" -> \"чтоб самим наперет притикъ\"\n",
1135 | "[ERR:2] \"ду наскоро также мы слышим бутто\" -> \"ду на скоро также мы слышим бутт\"\n",
1136 | "[ERR:3] \"чтоб вам iз города вытит но нынѣ\" -> \"чтоб вам iнзгородавытит но нынѣ\"\n",
1137 | "[ERR:3] \"возмущению быт i при том конечно\" -> \"возмущонию быт i при i том конечно\"\n",
1138 | "[ERR:3] \"+ николи не бывало хо\" -> \"+ николинебы вало хо\"\n",
1139 | "[OK] \"ц в учинили а особли\" -> \"ц в учинили а особли\"\n",
1140 | "[ERR:2] \"i понеже междо оными толко два\" -> \"i по неже междо оными толко дова\"\n",
1141 | "[ERR:1] \"жай до петербурха [куда дай боже скоро быт\" -> \"жай до петербурха [куда дай боже скоробыт\"\n",
1142 | "[ERR:1] \"близ мѣсеца как на почте поѣхали\" -> \"близ мѣсецаы как на почте поѣхали\"\n",
1143 | "[ERR:7] \"а въ мѣ а понеже сия переселка времени тре\" -> \"а вѣмѣ а понеже сей я переселка време нитре\"\n",
1144 | "[ERR:2] \"чин капитана камандера толко в сем\" -> \"чин капита на камандера толко всем\"\n",
1145 | "[ERR:1] \"секая кореспонденцию остаюсь\" -> \"секая кореспонденчию остаюсь\"\n",
1146 | "[ERR:3] \"фелтъмаршала ш i стат гдѣ он прикажет\" -> \"фелтъмаршалаш i стат гдѣ ови прикажет\"\n",
1147 | "[OK] \"х которому указ [ныне въ небытиi ко\" -> \"х которому указ [ныне въ небытиi ко\"\n",
1148 | "[ERR:1] \"вѣдения пути чи\" -> \"вѣдения путичи\"\n",
1149 | "[ERR:2] \"ской i так малодою невѣскою вам поздра\" -> \"ской i так малодою не воскою вам поздра\"\n",
1150 | "[ERR:6] \"ко не чаю чтоб здѣлалас аднакож буде i не здѣлаетца у\" -> \"конеч1ю чиоб з дѣлалас аднакож буде i нездѣлаетца у\"\n",
1151 | "[OK] \"му] которых богом i iнтересам просили\" -> \"му] которых богом i iнтересам просили\"\n",
1152 | "[ERR:5] \"ему i господину михайлу шере\" -> \"ему i гуспъдилу ми хайлушере\"\n",
1153 | "[ERR:4] \"но не могли также паче всѣх тѣх мѣс\" -> \"но неможли так же паче всѣх тѣхг мѣс\"\n",
1154 | "[ERR:4] \"в чем засвидѣтелствуем\" -> \"в сем за с видѣтелстеуем\"\n",
1155 | "[OK] \"скъ наших iз полши о том обявъляю что\" -> \"скъ наших iз полши о том обявъляю что\"\n",
1156 | "[ERR:1] \"в конце мая i все престороги учинили\" -> \"в концемая i все престороги учинили\"\n",
1157 | "[OK] \"что дѣйствоват в обшую\" -> \"что дѣйствоват в обшую\"\n",
1158 | "[ERR:1] \"въ 42 года не была аднакож подож\" -> \"въ 4 2 года не была аднакож подож\"\n",
1159 | "[ERR:3] \"со фъсею силолою сухопутною обратитца\" -> \"софъсею силорою сухепутною обратитца\"\n",
1160 | "[ERR:3] \"неотмѣнно в ыстинной дружбѣ пре\" -> \"не отмѣнно выстинной дружбъ пре\"\n",
1161 | "[ERR:2] \"чтоб мнѣ мое писмо поттвердит\" -> \"счтоб мнѣ мое писмо поттведит\"\n",
1162 | "[ERR:3] \"аднакож оныя х кривицу маршироват\" -> \"аднакож оныя х кривицумарши мват\"\n",
1163 | "[OK] \"для турецкого дѣла i что\" -> \"для турецкого дѣла i что\"\n",
1164 | "[OK] \"ряя ко оному провадит\" -> \"ряя ко оному провадит\"\n",
1165 | "[ERR:7] \"ною ж вар анкартоу съ якарем i на том\" -> \"ною жвар анкарто усъ я карем i каком\"\n",
1166 | "[ERR:6] \"ятел зетировался в угол к местечку iмерек\" -> \"ятел зетировался вуголк местечку iбмик\"\n",
1167 | "[ERR:3] \"губернатороф iмѣт лантър лантъратофъ\" -> \"губернатороф i мѣт лонтърлантъратофъ\"\n",
1168 | "[OK] \"ту а мы вам пришлем гдѣ стат\" -> \"ту а мы вам пришлем гдѣ стат\"\n",
1169 | "[ERR:3] \"неслуживым пока реше\" -> \"не служивым по кареше\"\n",
1170 | "[OK] \"ленска стоiт готофъ i iмѣ\" -> \"ленска стоiт готофъ i iмѣ\"\n",
1171 | "[OK] \"7\" -> \"7\"\n",
1172 | "[ERR:4] \"ля отдѣлатца i ѣхат] на другое писмо отвѣтствую\" -> \"ля от дѣлатца iѣхат ] на другое писмо отвѣтстую\"\n",
1173 | "[OK] \"а потом бомбордиро\" -> \"а потом бомбордиро\"\n",
1174 | "[ERR:4] \"i чаю завътра туды поспѣт плате i\" -> \"i чаю завъ тратуды поспѣт плат еi\"\n",
1175 | "[OK] \"ратца было невозможно\" -> \"ратца было невозможно\"\n",
1176 | "[OK] \"крѣпость аднакож та\" -> \"крѣпость аднакож та\"\n",
1177 | "[ERR:2] \"му потребно вспомогай также в намоще\" -> \"му потребно вспомогай также в на моше\"\n",
1178 | "[OK] \"1\" -> \"1\"\n",
1179 | "[ERR:2] \"статы то проси дабы без вся\" -> \"статы то проси дабы беззбся\"\n",
1180 | "[OK] \"дѣлат\" -> \"дѣлат\"\n",
1181 | "[ERR:1] \"давълеет а оную линѣ\" -> \"давълеет а оною линѣ\"\n",
1182 | "[OK] \"вой полой водѣ отправит сюды\" -> \"вой полой водѣ отправит сюды\"\n",
1183 | "[OK] \"реки здешней\" -> \"реки здешней\"\n",
1184 | "[ERR:3] \"то конечно подай\" -> \"токонечно пдар\"\n",
1185 | "[ERR:1] \"⊕ понеже непъриятел\" -> \"о понеже непъриятел\"\n",
1186 | "[ERR:2] \"богу со въсѣми судами дошли близ новой\" -> \"богу совъсѣми судами дошли близновой\"\n",
1187 | "[OK] \"прис\" -> \"прис\"\n",
1188 | "[ERR:51] \"(+ i заведчи дат торговым людем собрафъ кумпанию буде\" -> \"( \"\n",
1189 | "[ERR:1] \"поставим а людей\" -> \"посавим а людей\"\n",
1190 | "[ERR:4] \"впрѣд ⊕\" -> \"врудсю\"\n",
1191 | "[ERR:3] \"ская пословица тюсхенъ дун\" -> \"ская пословицатю схенъ дут\"\n",
1192 | "[OK] \"ликую\" -> \"ликую\"\n",
1193 | "[OK] \"готовъленинем чтоб с помощию\" -> \"готовъленинем чтоб с помощию\"\n",
1194 | "[ERR:1] \"i драгунам когда приѣдет к вам\" -> \"i драгу нам когда приѣдет к вам\"\n",
1195 | "[ERR:1] \"понеже зело случай требует\" -> \"онеже зело случай требует\"\n",
1196 | "[ERR:4] \"зоноф не вывадит\" -> \"зоу невывадит\"\n",
1197 | "[ERR:1] \"також i фълот нашъ слава богу множитца уже\" -> \"також i фълот нашъ слава богу множитца уж\"\n",
1198 | "[ERR:2] \"зат за корабль флейтъ i другую пару\" -> \"зат за кораблѣ флейтъ i другую паро\"\n",
1199 | "[OK] \"квартиры главъному войску розписат\" -> \"квартиры главъному войску розписат\"\n",
1200 | "[ERR:40] \"+ которых просим в походѣ iх когда за стер\" -> \" к\"\n",
1201 | "[OK] \"лодых взят в службу прямых подячих в пи\" -> \"лодых взят в службу прямых подячих в пи\"\n",
1202 | "[OK] \"будут\" -> \"будут\"\n",
1203 | "[OK] \"+\" -> \"+\"\n",
1204 | "[OK] \"понеже салдаты чаю сим мар\" -> \"понеже салдаты чаю сим мар\"\n",
1205 | "[OK] \"то с однѣм благодарением\" -> \"то с однѣм благодарением\"\n",
1206 | "[ERR:1] \"господин +\" -> \"гусподин +\"\n",
1207 | "[ERR:4] \"винкелгакъ i делфин починит совершенно поне\" -> \"винкелгакъ i делфин принит совершенло по не\"\n",
1208 | "[ERR:36] \"а каково опъределение учинено о страл\" -> \"(+ \"\n",
1209 | "[OK] \"такъ блиско что не дастъ дѣлат выше\" -> \"такъ блиско что не дастъ дѣлат выше\"\n",
1210 | "[ERR:2] \"переѣхат на остроф руген а с сухова\" -> \"перегхат на остроф руген а ссухова\"\n",
1211 | "[ERR:4] \"элбинга полки пойдут вскорѣ отсель к вам взятых стари\" -> \"длбинга полки пойдут вскорѣ от сельы вам взятых стари\"\n",
1212 | "[ERR:10] \"i онѣ равъною жъ стрелбою отвѣтствовали а вым\" -> \"i онѣ равоною жъстрел огъ отвѣ с твовалиавам\"\n",
1213 | "[ERR:2] \"дели оной на также на 12 частей [как i у га\" -> \"дели оной на также нам 12 частей [как i уга\"\n",
1214 | "[OK] \"дат о здѣшем i что надлежит к пред\" -> \"дат о здѣшем i что надлежит к пред\"\n",
1215 | "[ERR:1] \"iнова писат не iмѣю толко что мы слава\" -> \"iнова писат не iмѣю чтолко что мы слава\"\n",
1216 | "[ERR:1] \"се а за то б обязался в полшу шведаф никали\" -> \"се а за тоб обязался в полшу шведаф никали\"\n",
1217 | "[ERR:2] \"еше пят а по нужде три чтоб ежели невозмож\" -> \"ешепят а понужде три чтоб ежели невозмож\"\n",
1218 | "[ERR:3] \"дѣйствително с на\" -> \"дѣйствително ша\"\n",
1219 | "[ERR:3] \"те каралю i какъ возможно дѣлайте гдѣ\" -> \"те каралю i какъ возможно дѣлай тне гдо\"\n",
1220 | "[OK] \"понеже здѣшние господа\" -> \"понеже здѣшние господа\"\n",
1221 | "[ERR:8] \"[i почат оное сего же лѣта]\" -> \"[почат оносегожечѣти]\"\n",
1222 | "[OK] \"2\" -> \"2\"\n",
1223 | "[ERR:2] \"выведены\" -> \"въiведены\"\n",
1224 | "[ERR:3] \"[+ а ежели к в iзволит\" -> \"[а е жели к в iзволит\"\n",
1225 | "[OK] \"петръ\" -> \"петръ\"\n",
1226 | "[ERR:2] \"резыват пут скамповѣем\" -> \"резыват путскамповнем\"\n",
1227 | "[ERR:3] \"⊗ [около сих мѣстъ [на половин\" -> \"⊕ [о коло сих мѣстъ [на половинѣ\"\n",
1228 | "[ERR:2] \"на москвѣ\" -> \"ни москвы\"\n",
1229 | "[ERR:3] \"литца то аглинским ежели силно принуждат будут\" -> \"литца то аглински ежели силно принуж дат будун\"\n",
1230 | "[ERR:1] \"хотѣл сегодни отвѣтствоват но для напа\" -> \"хотѣл сего дни отвѣтствоват но для напа\"\n",
1231 | "[ERR:6] \"ды пристали всѣ къ элзенфорсу + что\" -> \"ды пристали всѣ ксъ элзенфорсчь о\"\n",
1232 | "[OK] \"обявъляем что драгуны i казаки\" -> \"обявъляем что драгуны i казаки\"\n",
1233 | "[ERR:2] \"то разумѣетца сей же доноситель\" -> \"торазумѣетца сей же доносителе\"\n",
1234 | "[ERR:2] \"давано\" -> \"пцдавано\"\n",
1235 | "[ERR:2] \"понеже я с великим удивъ\" -> \"понежея с великим уди въ\"\n",
1236 | "[OK] \"яко преслушникоф нашего указу i какоф\" -> \"яко преслушникоф нашего указу i какоф\"\n",
1237 | "[ERR:7] \"анкартоу гинсофъ за оною привезат\" -> \"аснскорку угинсофъза оною привезат\"\n",
1238 | "[ERR:1] \"д силу iмѣет при кото\" -> \"д силу iмѣет прикото\"\n",
1239 | "[ERR:3] \"рѣ гдѣ выподает река мста iли до\" -> \"рѣгдѣ вы подает рекамста iли до\"\n",
1240 | "[ERR:2] \"что мнѣ честно i чисто нелѣносно но паче ревъностно\" -> \"что мнѣчестно i чисто нелѣносно но пачеревъностно\"\n",
1241 | "[ERR:1] \"оставит нужное число i тѣх коi старее а мо\" -> \"оставит нужное число i нѣх коi старее а мо\"\n",
1242 | "[ERR:7] \"ложению\" -> \"+ \"\n",
1243 | "[ERR:3] \"сал ты к нам что отпустил камелного мас\" -> \"салты к нам что отпустилка мелного мас\"\n",
1244 | "[OK] \"для того заранее сие пред\" -> \"для того заранее сие пред\"\n",
1245 | "[OK] \"явълениi цесарского минис\" -> \"явълениi цесарского минис\"\n",
1246 | "[OK] \"маршъ\" -> \"маршъ\"\n",
1247 | "[ERR:2] \"iзвѣщение о караблях обрѣтающихся\" -> \"iзвѣщение о караблях обрѣтающих са\"\n",
1248 | "[ERR:1] \"iз питербурха въ 5 д ген петръ\" -> \"iз питербурха въ 8 д ген петръ\"\n",
1249 | "[ERR:5] \"провианту было попо конѣ\" -> \"прови анруу было по по к онѣ\"\n",
1250 | "[ERR:2] \"ско в шону буде же к в iзволит прис\" -> \"скко вшону буде же к в iзволит прис\"\n",
1251 | "[ERR:1] \"сына моего совершилас на которой\" -> \"сына моего совершиласна которой\"\n",
1252 | "[ERR:3] \"въ такой нечаемой отмѣнѣ же\" -> \"въ такой нечечемой отмѣнѣже\"\n",
1253 | "[ERR:3] \"прошедшею с турки неча\" -> \"прошедшею сторкинеча\"\n",
1254 | "[OK] \"права i усилевот посты дабы в нужном\" -> \"права i усилевот посты дабы в нужном\"\n",
1255 | "[ERR:2] \"на луг уйтит нѣкоторыя\" -> \"насуг уйтит нѣкоторыя\"\n",
1256 | "[ERR:3] \"катеринушка друг мой здравъствуй\" -> \"катеринушка дромой здравъствуй\"\n",
1257 | "[ERR:6] \"i облехчит в чем пристойно дабы тѣм подат охоту для болшева iх\" -> \"i облечит в сем пристойно дабы тѣм подат охоту для боневвiх\"\n",
1258 | "[OK] \"зом что учинят\" -> \"зом что учинят\"\n",
1259 | "[ERR:4] \"вице адмирал шветской лили съ 8ю караб\" -> \"вице адмирал швет ской линибъ 8ю караб\"\n",
1260 | "[ERR:1] \"ятелем поiску аднако ж того смотрѣт\" -> \"ятелем поiску аднакож того смотрѣт\"\n",
1261 | "[OK] \"бытия не дават главъ\" -> \"бытия не дават главъ\"\n",
1262 | "[ERR:1] \"волство показат ч\" -> \"волство показат ѣ\"\n",
1263 | "[OK] \"дет\" -> \"дет\"\n",
1264 | "[ERR:3] \"лит опасна + нападения\" -> \"лит опасна днападени я\"\n",
1265 | "[OK] \"не должны служит\" -> \"не должны служит\"\n",
1266 | "[ERR:1] \"по въсегдашнему своему обы\" -> \"повъсегдашнему своему обы\"\n",
1267 | "[OK] \"непъриятеля\" -> \"непъриятеля\"\n",
1268 | "[OK] \"для того что еше\" -> \"для того что еше\"\n",
1269 | "[OK] \"щание непъраведно\" -> \"щание непъраведно\"\n",
1270 | "[ERR:3] \"+ i пъравъда л так силен что сам ште\" -> \"+ iпъравъ дал так силен что сам ште\"\n",
1271 | "[ERR:2] \"билис мы iнаго с помощию\" -> \"билисмы i наго с помощию\"\n",
1272 | "[ERR:2] \"тиллери отпиши гдѣ она i скоро л будет к вам\" -> \"тиллери отпиши гдѣ онаi скорол будет к вам\"\n",
1273 | "[OK] \"iз торгоу въ 14 д сентебря петръ\" -> \"iз торгоу въ 14 д сентебря петръ\"\n",
1274 | "[ERR:1] \"обор\" -> \"обоур\"\n",
1275 | "[ERR:3] \"лѣднея нынешнея моя от\" -> \"лѣднеяны не шнея моя от\"\n",
1276 | "[ERR:2] \"кофъ там не задержали которыя раз\" -> \"кофъ там не задержали которы яраз\"\n",
1277 | "[ERR:2] \"також магазеiны готовит болшей в лифляндах\" -> \"також магазеiныготовит болшей в лифландах\"\n",
1278 | "[ERR:4] \"тел нынѣ стаял сие кладетца\" -> \"тол ны нѣстатял сие кладетца\"\n",
1279 | "[ERR:2] \"не отдалятца горазда дабы\" -> \"не отдалятца го разда дабоы\"\n",
1280 | "[ERR:2] \"не дат\" -> \"недит\"\n",
1281 | "[ERR:2] \"нату переведены бу\" -> \"наету переведоны бу\"\n",
1282 | "[ERR:6] \"1 тавърофскую крѣпость от низкого мѣста укрѣпит\" -> \"+ ти върофскую крѣ поть от низ кого мѣста укрѣпит\"\n",
1283 | "[ERR:1] \"вручен а генерал репъ\" -> \"вручет а генерал репъ\"\n",
1284 | "[ERR:1] \"я вѣтры будут опасно берегите\" -> \"я вѣры будут опасно берегите\"\n",
1285 | "[ERR:8] \"пости дабы взят провиантъ i пъротчее\" -> \"пости дабы взят провлантыпърат че\"\n",
1286 | "[ERR:2] \"пъриятели болшими караблями сво\" -> \"пъриятели босшими карабля ми сво\"\n",
1287 | "[ERR:1] \"товит работником припасы\" -> \"товит работ ником припасы\"\n",
1288 | "[OK] \"2\" -> \"2\"\n",
1289 | "[ERR:3] \"но i запасы целы також i iх починит мочно\" -> \"но i запасыцелы також iх iх починит моно\"\n",
1290 | "[ERR:9] \"прамы дѣлат i блокшхипен дѣлат половину в полотску\" -> \"i прамы гѣла i блокшиинендѣлат половину в полоткуч\"\n",
1291 | "[OK] \"понадобитца аднакож\" -> \"понадобитца аднакож\"\n",
1292 | "[ERR:7] \"+ к острову\" -> \"у ноте робу\"\n",
1293 | "[ERR:3] \"(+ i что вам дожидатца л беркъголцовой рабо\" -> \"(+ i что вам дожида цал беркъ голцовой рабо\"\n",
1294 | "[OK] \"остроф риген чтоб оной сея зимы\" -> \"остроф риген чтоб оной сея зимы\"\n",
1295 | "[ERR:5] \"ли мы вѣдомость что партия на\" -> \"ли мы вѣдомость что пар i няна\"\n",
1296 | "[OK] \"в полше аднакож в сентебрѣ\" -> \"в полше аднакож в сентебрѣ\"\n",
1297 | "[ERR:1] \"медвѣдя в одной берлуге не уживутца\" -> \"медвѣдя в одной берлугене уживутца\"\n",
1298 | "[ERR:2] \"в чем клянуся пед нынѣ\" -> \"в чем клянуся пѣднынѣ\"\n",
1299 | "[ERR:3] \"слава богу все здѣсь добро пово\" -> \"слава богу все здѣсъ добропове\"\n",
1300 | "[ERR:1] \"ся получил а въ городѣ не отказываем нынешнего\" -> \"ся получил а въ городѣ не отказывоем нынешнего\"\n",
1301 | "[ERR:1] \"в книгу а старай вырезаф притом же\" -> \"в книгу а старай вырезаф при том же\"\n",
1302 | "[ERR:2] \"послѣднее будет горше первово\" -> \"послѣднее будет горшеперово\"\n",
1303 | "[ERR:2] \"5 ю днями уже постъ крѣпъкой\" -> \"5ю днями уже постъ крѣпълой\"\n",
1304 | "[ERR:3] \"к вам i велѣно iм дойтит до перепъравы а оттол\" -> \"к вам i велѣно iм фдойтит до перепъравыа от тол\"\n",
1305 | "[ERR:4] \"я протиф элзенфорса стат на якор к сюйдной сто\" -> \"я протиф элзенфорса статная корк сюйдной сто\"\n",
1306 | "[OK] \"дѣла дѣла наши как здѣс\" -> \"дѣла дѣла наши как здѣс\"\n",
1307 | "[ERR:2] \"карабли уже в лутчею степен у нас при\" -> \"карабли уже влутчею с тепен у нас при\"\n",
1308 | "[ERR:3] \"уступит [о котором шведы уже явъно\" -> \"уступит [окотором шведы уже я въ но\"\n",
1309 | "[ERR:1] \"хотной в марте мѣсеце i для того сею зи\" -> \"хонной в марте мѣсеце i для того сею зи\"\n",
1310 | "[ERR:1] \"лат тотчах указ чтоб шли карабли кото\" -> \"лат тотчах указ чтоб шли карабликото\"\n",
1311 | "[ERR:7] \"ѣхат в новъгородской уѣздъ в то мѣсто гдѣ\" -> \"ѣхат в но въ городкой уѣздъ в томѣ стогдо\"\n",
1312 | "[ERR:3] \"о бамбардироване я к вам писал дважды\" -> \"о вам бардироване я к вам писал двады\"\n",
1313 | "[ERR:5] \"четырех i шти футоф длины добро\" -> \"четыбреж i штирутоф длины доро\"\n",
1314 | "[ERR:1] \"5 4\" -> \"5 +\"\n",
1315 | "[ERR:5] \"меiн фринтъ писмо от вас въ вчера\" -> \"шеунфринтъ писло от вас въ вера\"\n",
1316 | "[ERR:2] \"что отвѣтствоват iбо уже о сей ма\" -> \"то отвѣтсвоват iбо уже о сей ма\"\n",
1317 | "[ERR:2] \"сеце писем не получим то в первых чис\" -> \"сеце пи сем ре получим то в первых чис\"\n",
1318 | "[ERR:1] \"того что был мир i не хотѣли дат\" -> \"того что был мир i нехотѣли дат\"\n",
1319 | "[ERR:2] \"но i тѣ вексели что от се\" -> \"но iтѣ векрели что от се\"\n",
1320 | "[ERR:3] \"нашими соб людми упъралятца\" -> \"нашими собдд люми упъралятца\"\n",
1321 | "[ERR:5] \"а жених и третево дни виделся\" -> \"ажених се трет еводни виделся\"\n",
1322 | "[ERR:1] \"1719\" -> \"1711\"\n",
1323 | "[OK] \"6\" -> \"6\"\n",
1324 | "[ERR:8] \"i былъ у кораля а въчерас он поутру былъ у меня\" -> \"iбыилю укораля а въчерас онпоутрубылну меня\"\n",
1325 | "[ERR:1] \"заран сказана было i чтоб\" -> \"заран сказа на было i чтоб\"\n",
1326 | "[ERR:6] \"коф с собою] також i самое то мѣсто тве\" -> \"кофскобою] також i самое томѣ сто тво\"\n",
1327 | "[ERR:1] \"бдет\" -> \"бде\"\n",
1328 | "[ERR:3] \"а горѣлыя клѣтки полском черес под своiм\" -> \"а горѣлыя к лѣнки полском серес под своiм\"\n",
1329 | "[ERR:2] \"рубят лѣса на скомповѣi i опъредѣлит чтоб ко\" -> \"рубят лѣса на ском повѣi i опъредолит чтоб ко\"\n",
1330 | "[ERR:2] \"нию короны шведской князю iх то мочно iм обѣщат\" -> \"нию короны шведской к незю iх то мочно iм обѣщат\"\n",
1331 | "[ERR:1] \"а служителей сколко\" -> \"а служитеяей сколко\"\n",
1332 | "[ERR:2] \"та таго ради силою i по силѣ сего обна\" -> \"та тагоради силою i посилѣ сего обна\"\n",
1333 | "[ERR:2] \"гантин i грузит оною алтиллерию зимою во оныя\" -> \"гантис i грузит оною а лтиллерию зимою во оныя\"\n",
1334 | "[ERR:5] \"тит iскат другова\" -> \"тит i ск тдругопе\"\n",
1335 | "[ERR:3] \"для лечения i ежели богъ iзволит\" -> \"дяялечения i ежели богь iзволит\"\n",
1336 | "[ERR:1] \"ю чтоб одному королю обявит\" -> \"ю чтоб одному корояю обявит\"\n",
1337 | "[ERR:3] \"увидит что iх выше ево силы тотчас\" -> \"увидит что iх вышеево силы тотча н\"\n",
1338 | "[OK] \"фири iли на башню для сего учения\" -> \"фири iли на башню для сего учения\"\n",
1339 | "[ERR:4] \"ном затонѣ i самарѣ такъ\" -> \"ном за томѣ i самалѣ такю\"\n",
1340 | "[ERR:4] \"чего оноя учинена] поне того) iбо\" -> \"чего оноя учине нам] понетогор iбо\"\n",
1341 | "[OK] \"тикулярного дѣла\" -> \"тикулярного дѣла\"\n",
1342 | "[ERR:2] \"i высядши на землю\" -> \"i высядшиназемлю\"\n",
1343 | "[OK] \"верефки i парусы каковы есть i запасных\" -> \"верефки i парусы каковы есть i запасных\"\n",
1344 | "[ERR:1] \"нанят голанцофъ\" -> \"накят голанцофъ\"\n",
1345 | "[ERR:3] \"лѣни руже положили\" -> \"лѣнирѣже положиля\"\n",
1346 | "[ERR:2] \"всегда iмѣя фут па\" -> \"всегда iмѣя фунпа\"\n",
1347 | "[OK] \"ду то скоро паки богу iзволшу к вам\" -> \"ду то скоро паки богу iзволшу к вам\"\n",
1348 | "[ERR:1] \"женскому колѣну свой оному послѣднему в родѣ\" -> \"жетскому колѣну свой оному послѣднему в родѣ\"\n",
1349 | "[ERR:2] \"г ш ѣхат [мѣсто iмерек] i понеже вы\" -> \"гшѣхат [мѣсто iмерек] i понеже вы\"\n",
1350 | "[OK] \"все б за нами осталас +\" -> \"все б за нами осталас +\"\n",
1351 | "[ERR:1] \"лакоф переменит i держат iх пока великой\" -> \"лакоф переменит i держа iх пока великой\"\n",
1352 | "[ERR:6] \"сем мѣстъ а iменно каломак хухры луки\" -> \"сем мѣсть а сменно ксало мак хухры я уки\"\n",
1353 | "[ERR:1] \"в полдни полночь дабы непъриятел не зналъ въ\" -> \"в полдни полночь дабы непъриятел незналъ въ\"\n",
1354 | "[ERR:2] \"iбо прика не точию хо\" -> \"iбо приса не точиюхо\"\n",
1355 | "[OK] \"не обрѣтаетца то оною амуницию пос\" -> \"не обрѣтаетца то оною амуницию пос\"\n",
1356 | "[ERR:1] \"ли онее\" -> \"лионее\"\n",
1357 | "[ERR:7] \"пушек 24–i–18 фунтовых – 40\" -> \"гушек 2 4 i8 фунтовых л40\"\n",
1358 | "[ERR:5] \"тите о забавах i тово нет у нас поне\" -> \"тите о забеевах i товоне у нас по не\"\n",
1359 | "[OK] \"понеже\" -> \"понеже\"\n",
1360 | "[ERR:2] \"того ради возможно пот сей час один дат\" -> \"того ради возможно потсей час оддин дат\"\n",
1361 | "[OK] \"3\" -> \"3\"\n",
1362 | "[OK] \"зу аднакож до тѣх мѣстъ\" -> \"зу аднакож до тѣх мѣстъ\"\n",
1363 | "[ERR:4] \"ли въ 26 д прошлаго мѣсеца гдѣ равъно азофско\" -> \"ли въ 2 6 прошлагомѣсеца гдъ равъно азофско\"\n",
1364 | "[ERR:3] \"не iмѣю от тебя о том междо тѣм слышу\" -> \"не iмѣю оттебя о том меж дотѣм слышу\"\n",
1365 | "[ERR:1] \"ссоры чего онѣ iщут\" -> \"ссоры чего онѣiщут\"\n",
1366 | "[ERR:3] \"госпадина ная смотря по дѣлу\" -> \"господинания смотря по дѣлу\"\n",
1367 | "[ERR:4] \"ремени когда оберетца от бом\" -> \"ремнни когда беретца обом\"\n",
1368 | "[ERR:3] \"роны по десяти вѣрстъ въверхъ\" -> \"роны подесяти верстъ въ верхъ\"\n",
1369 | "[OK] \"обявъляю вам что мы слава богу въ 5 д сего\" -> \"обявъляю вам что мы слава богу въ 5 д сего\"\n",
1370 | "[ERR:5] \"в слутску въ 17 д марта 1711\" -> \"в слутскувв 17 д марая711\"\n",
1371 | "[ERR:1] \"но которой листъ перепъравя вклеiли\" -> \"но которойлистъ перепъравя вклеiли\"\n",
1372 | "[OK] \"как вы сами пишете\" -> \"как вы сами пишете\"\n",
1373 | "[ERR:1] \"ца куды конюнктуры поворотятца\" -> \"ца куды коню нктуры поворотятца\"\n",
1374 | "[ERR:1] \"до устья реки а которая\" -> \"до устья рекиа которая\"\n",
1375 | "[ERR:2] \"пъриятеля i крѣпос\" -> \"пъриятеля i клѣпой\"\n",
1376 | "[OK] \"а наiпаче когда турки увѣдаю о каком\" -> \"а наiпаче когда турки увѣдаю о каком\"\n",
1377 | "[ERR:1] \"невозможно] i стал iс пушек стрелят\" -> \"невозможно] i стал iспушек стрелят\"\n",
1378 | "[ERR:4] \"но не будет хотя б i здурилис то б також\" -> \"но не будет хотя б iздурилистоб такорж\"\n",
1379 | "[OK] \"е\" -> \"е\"\n",
1380 | "[ERR:1] \"iзправитца тогда мы всѣми силами о\" -> \"iз правитца тогда мы всѣми силами о\"\n",
1381 | "[ERR:2] \"ралнаго мира по котором чаю не без\" -> \"ралнагомира по котаром чаю не без\"\n",
1382 | "[ERR:4] \"твы обѣiх iменем моiм обнадежит\" -> \"ттвы обѣ iх iменем моiм обнаджи\"\n",
1383 | "[ERR:1] \"также чрез партикулярныя писма есть вѣдомость\" -> \"также чрез партинулярныя писма есть вѣдомость\"\n",
1384 | "[ERR:2] \"держат аднакож бог вѣсть\" -> \"держат аднакож богвѣстъ\"\n",
1385 | "[ERR:3] \"писмо ваше купно з жестоким отказазом\" -> \"писмоваше купно о жестоским отказазом\"\n",
1386 | "[OK] \"скляеф басъ\" -> \"скляеф басъ\"\n",
1387 | "[ERR:2] \"онѣ возмут то б для лутчей iх ласки полными\" -> \"онѣ возмут тоб дл я лутчей iх ласки полными\"\n",
1388 | "[ERR:10] \"то б упъравълялъ дѣла къ возможно\" -> \"тобу поневълялъ дѣлакъ возми нно\"\n",
1389 | "[OK] \"ли оной сенат iли хто\" -> \"ли оной сенат iли хто\"\n",
1390 | "[ERR:2] \"ли i разпорядили\" -> \"ли i разгорадили\"\n",
1391 | "[ERR:1] \"ты будут аднакож поѣжайте в мо\" -> \"ты будут аднакос поѣжайте в мо\"\n",
1392 | "[ERR:8] \"ва i по три i въ розныя часы то сть поутру въвечеру\" -> \"ва i потри i върозныя часы тость поурувъвочелм\"\n",
1393 | "[ERR:4] \"толко однѣмѣ борствором\" -> \"толко однѣ мѣбествором\"\n",
1394 | "[ERR:1] \"+\" -> \"1\"\n",
1395 | "[OK] \"в дополнъку в померанию послат три полка\" -> \"в дополнъку в померанию послат три полка\"\n",
1396 | "[ERR:1] \"пости от реки не iмѣетъ] а замокъ потшит\" -> \"пости отреки не iмѣетъ] а замокъ потшит\"\n",
1397 | "[ERR:1] \"ли когда понадабитца чтоб\" -> \"ли когда по надабитца чтоб\"\n",
1398 | "[OK] \"к м что ежели непъ\" -> \"к м что ежели непъ\"\n",
1399 | "[OK] \"ние сут для тишины iм\" -> \"ние сут для тишины iм\"\n",
1400 | "[OK] \"причины к войнѣ\" -> \"причины к войнѣ\"\n",
1401 | "[ERR:1] \"о сем послан указ къ ф м\" -> \"о сем послан указ фъ ф м\"\n",
1402 | "[OK] \"но хотя б зело силен непъриятел был\" -> \"но хотя б зело силен непъриятел был\"\n",
1403 | "[ERR:3] \"дня будем якор бросат у александровой крѣ\" -> \"дня будем якорбросат у алеѣандровой крѣ\"\n",
1404 | "[ERR:2] \"компаниi чтоб зимою морем iтит i то та\" -> \"компаниi чтоб зимою морем iтит то та\"\n",
1405 | "[OK] \"тавълен былъ\" -> \"тавълен былъ\"\n",
1406 | "[ERR:1] \"ца может також старайся ка\" -> \"ца может також старайсяка\"\n",
1407 | "[ERR:2] \"по обеим канцам\" -> \"по обѣiм канцам\"\n",
1408 | "[OK] \"3\" -> \"3\"\n",
1409 | "[OK] \"для iх склонности i то учинено будет по се\" -> \"для iх склонности i то учинено будет по се\"\n",
1410 | "[OK] \"хотя оная нам не нужда вовъсе удер\" -> \"хотя оная нам не нужда вовъсе удер\"\n",
1411 | "[ERR:1] \"а когда не iмѣем нужда оных флатироват\" -> \"а когда не iмѣем нужда оным флатироват\"\n",
1412 | "[ERR:1] \"жели хто пощадит тот сам тою каз\" -> \"жели хто пощадит тот сам тою кай\"\n",
1413 | "[OK] \"въ 2 д декабря 1712\" -> \"въ 2 д декабря 1712\"\n",
1414 | "[OK] \"сестры\" -> \"сестры\"\n",
1415 | "[ERR:3] \"а переход наш богу iзволшу кончае заф\" -> \"а переходнаш богу iз волшу кончаезаф\"\n",
1416 | "[ERR:1] \"iли столяроф\" -> \"iли столягоф\"\n",
1417 | "[OK] \"400\" -> \"400\"\n",
1418 | "[ERR:1] \"толко до тѣх мѣстъ не отда\" -> \"толко до тѣх мѣсть не отда\"\n",
1419 | "[ERR:1] \"наступат i оного по возмож\" -> \"наступат i оного повозмож\"\n",
1420 | "[ERR:3] \"болот рѣкъ i протчих крепостей трудно будет\" -> \"болотрѣкъ i протчих крепостей тродно будот\"\n",
1421 | "[ERR:2] \"милость которую господин адмирал в 6 д сего ж мѣсеца\" -> \"милость которую госкодин адмирал в 6 д сегож мѣсеца\"\n",
1422 | "[ERR:1] \"паки к нему г ад своего присылал\" -> \"паки к нему г а д своего присылал\"\n",
1423 | "[ERR:1] \"королефского в как удобнѣе\" -> \"королеф ского в как удобнѣе\"\n",
1424 | "[ERR:2] \"ку указ есть в наших\" -> \"ку указ есть в нашиис\"\n",
1425 | "[ERR:2] \"озчивая мѣсто куды пойдет\" -> \"озчива ямѣсто куды пойдет\"\n",
1426 | "[OK] \"тавят алтиллерию i потом на оных\" -> \"тавят алтиллерию i потом на оных\"\n",
1427 | "[ERR:1] \"iли iзволте дѣлат iли каму\" -> \"iхи iзволте дѣлат iли каму\"\n",
1428 | "[ERR:7] \"медлил на оные отвѣ i тѣм бы времени не потерял\" -> \"медлил н а он еобѣ i тѣм бы времени не потелят\"\n",
1429 | "[ERR:4] \"завтрее чрез днестръ пойдем\" -> \"за втре чретз днестръ пойдемй\"\n",
1430 | "[OK] \"сеца\" -> \"сеца\"\n",
1431 | "[ERR:2] \"iбо почал отступат i жечь i зжегъ\" -> \"iбо почал отступат i жечь iз жегъ\"\n",
1432 | "[ERR:1] \"пищеш ты якобы для лекарства\" -> \"пишеш ты якобы для лекарства\"\n",
1433 | "[ERR:2] \"кая починка которому неболшая\" -> \"кая починка которому не болшаия\"\n",
1434 | "[OK] \"ских грамотных для того ж\" -> \"ских грамотных для того ж\"\n",
1435 | "[ERR:1] \"но в первых iли о половинѣ будущаго\" -> \"но в первых iли о половинѣ будущуго\"\n",
1436 | "[ERR:2] \"до абова дойдем то шведы принужде\" -> \"до абовадой дем то шведы принужде\"\n",
1437 | "[ERR:1] \"старание приложит iмѣет також\" -> \"старание приложит iмѣет тако\"\n",
1438 | "[OK] \"того для лутче тѣм поспѣшит ко\" -> \"того для лутче тѣм поспѣшит ко\"\n",
1439 | "[OK] \"к послам писанныя\" -> \"к послам писанныя\"\n",
1440 | "[OK] \"заранее упърепит а что к тому надобно\" -> \"заранее упърепит а что к тому надобно\"\n",
1441 | "[ERR:1] \"с водяная мѣлница\" -> \"с въдяная мѣлница\"\n",
1442 | "[ERR:2] \"ла о елзенфорсе [которую прилагаю при сем]\" -> \"ла о елзенфорсе [которую прилогаю присем]\"\n",
1443 | "[ERR:5] \"нечаева + [понеже нѣжин у вас будет за с\" -> \"не чаева+ [понеже нѣжлин у вас буде зас\"\n",
1444 | "[ERR:2] \"жиею соверша дѣла быт к вам конеч\" -> \"жиею соверша дѣла быт к вам колнен\"\n",
1445 | "[ERR:3] \"со въсѣми окрисностями во оных пи\" -> \"со въсѣми окрисностя мивооных пи\"\n",
1446 | "[ERR:3] \"словѣ о удержаниi транпор\" -> \"словѣ су держаниi транпор\"\n",
1447 | "[ERR:4] \"о зело обидном состаяниi нашего трупа при страл\" -> \"о зело обидном состая ниi наше готрупа пристрал\"\n",
1448 | "[ERR:2] \"же резиденцию вам iмѣт в питербурхѣ\" -> \"жере зиденцию вам iмѣт в питербурхѣ\"\n",
1449 | "[ERR:3] \"iли въ первых чiслѣх февъраля буду\" -> \"iли въ первых теслѣ февъраля буду\"\n",
1450 | "[ERR:1] \"пус оставит буде\" -> \"пус остаовит буде\"\n",
1451 | "[ERR:2] \"iзволте толко обождат до 9 iли 10 iюля а буде не пос\" -> \"iзволте толко обождат д0 9 iли 10 8юля а буде не пос\"\n",
1452 | "[ERR:1] \"могу слѣдовать + i тако прошу\" -> \"могу слѣдоват + i тако прошу\"\n",
1453 | "[ERR:3] \"жет iз таго быт прибыл тож смотрѣт правѣдат\" -> \"жет iз таго бын прибыл тож стетрѣт правѣдат\"\n",
1454 | "[ERR:3] \"по фокарюстъ\" -> \"пофо карюсть\"\n",
1455 | "[ERR:1] \"тел пойдет около озе\" -> \"тел пойдет около о зе\"\n",
1456 | "[ERR:2] \"в межиходѣ в трех милях от бран\" -> \"в межихо дѣ в тре милях от бран\"\n",
1457 | "[OK] \"даны нынѣ\" -> \"даны нынѣ\"\n",
1458 | "[ERR:2] \"ки сюды дворянина головънина [с ко\" -> \"ки сюды дворя нина головънина [ско\"\n",
1459 | "[OK] \"пропали\" -> \"пропали\"\n",
1460 | "[ERR:3] \"дут iз финландиi то iм опас\" -> \"дут iзфинландиi тоiм опад\"\n",
1461 | "[ERR:1] \"равъда i можешь iх величес\" -> \"равъда i можешу iх величес\"\n",
1462 | "[ERR:1] \"а о саксонцах не помя\" -> \"а осаксонцах не помя\"\n",
1463 | "[ERR:1] \"лагат по сему\" -> \"лагат посему\"\n",
1464 | "[ERR:3] \"сохли а я слышал что нынешнево году не рубили i та\" -> \"сохли а я слышал что нынеш невогоду не рубили iта\"\n",
1465 | "[ERR:5] \"приказывал я к тебѣ с шепелевым чтоб\" -> \"приказывал я ктебѣсшепелеым что\"\n",
1466 | "[OK] \"с франциею обязалис протиф\" -> \"с франциею обязалис протиф\"\n",
1467 | "[ERR:2] \"тором iз сих мѣстъ iзволят о боурѣ получили мы вѣ\" -> \"тором iз сих мѣсть iзволят обоурѣ получили мы вѣ\"\n",
1468 | "[OK] \"четы карабли дѣлат iли i зачаты да\" -> \"четы карабли дѣлат iли i зачаты да\"\n",
1469 | "[ERR:3] \"зѣло нужен iбо погибелок новогородских бое\" -> \"зѣлонужен iбо погибелок новогород скихбое\"\n",
1470 | "[OK] \"шлете то взысконо будет на вас\" -> \"шлете то взысконо будет на вас\"\n",
1471 | "[ERR:3] \"(+ iзволте все без описки чинит\" -> \"( iзволте все без сопискичинит\"\n",
1472 | "[ERR:1] \"також чтоб дали въ том гарантироф а iменно прус\" -> \"такол чтоб дали въ том гарантироф а iменно прус\"\n",
1473 | "[ERR:1] \"жело жит iбо я левъщею не умѣя въ\" -> \"жело жит iбо я левъщею не умѣю въ\"\n",
1474 | "[ERR:6] \"з другой но сие не точию от а\" -> \"з дрогой носе не точию ба\"\n",
1475 | "[ERR:2] \"понеже семенофской полкъ шел iз кур\" -> \"понеже семенофсккой полкъшел iз кур\"\n",
1476 | "[ERR:5] \"судами сквоз шхеры до ар\" -> \"судами с к возшхеры даар\"\n",
1477 | "[ERR:2] \"ляем а къ i то дастаем\" -> \"ляем ако i то дастаем\"\n",
1478 | "[ERR:1] \"лѣно удержеват\" -> \"лѣно удерже ват\"\n",
1479 | "[ERR:2] \"[куды мнѣ совѣтовали] прика\" -> \"[куды мнѣ ловѣтрвали] прика\"\n",
1480 | "[ERR:7] \"какорами набиват старыми кана\" -> \"какобами пажи ват ставысеми кана\"\n",
1481 | "[ERR:2] \"к ва\" -> \"квя\"\n",
1482 | "[ERR:1] \"аднакож могло бы i то\" -> \"аднакож моглобы i то\"\n",
1483 | "[ERR:1] \"5\" -> \"я\"\n",
1484 | "[ERR:2] \"iзволилъ\" -> \"iз волил\"\n",
1485 | "[OK] \"величества алтиллериi 6 12 i 6 6\" -> \"величества алтиллериi 6 12 i 6 6\"\n",
1486 | "[ERR:2] \"[как iменем королевъским\" -> \"[как i менем короревъским\"\n",
1487 | "[OK] \"зело жал что вес союз разрушит\" -> \"зело жал что вес союз разрушит\"\n",
1488 | "[ERR:2] \"i ежели не будет вашему строению\" -> \"i еели не будет вашемустроению\"\n",
1489 | "[ERR:3] \"зунтѣ обрѣтаюшегося хотя я уже многожды\" -> \"зуннѣ обрѣтаюшегося хотяя уже много жды\"\n",
1490 | "[OK] \"да завъладѣт не намѣре\" -> \"да завъладѣт не намѣре\"\n",
1491 | "[OK] \"дешевъле можете сыскат а нам оной\" -> \"дешевъле можете сыскат а нам оной\"\n",
1492 | "[OK] \"ево склонность к тому то\" -> \"ево склонность к тому то\"\n",
1493 | "[OK] \"вырасумления людем а портикуляр\" -> \"вырасумления людем а портикуляр\"\n",
1494 | "[ERR:2] \"новых наших непъриятелей хот\" -> \"новых наших непъриятелей хтто\"\n",
1495 | "[ERR:4] \"пълету держат баталиос на москвѣ\" -> \"пълетiу держат батали осна москвя\"\n",
1496 | "[ERR:2] \"матка здрафъствуй\" -> \"маткат драфъствуй\"\n",
1497 | "[ERR:6] \"щего (+ iже воздастъ комуж\" -> \"щего о i же воздасстъкому ж\"\n",
1498 | "[ERR:2] \"не скоро войски наши вышли а для чего то уже\" -> \"нескоро войски наш вышли а для чего то уже\"\n",
1499 | "[ERR:1] \"такожъ въ iх содержан\" -> \"такожъ въ iх содежан\"\n",
1500 | "[ERR:3] \"нужны а на новых еще друзей голстинцоф\" -> \"нужны а на новых ена дру зей голстинцоф\"\n",
1501 | "[ERR:1] \"чтоб провиантъ былъ саксонской\" -> \"чтоб проваантъ былъ саксонской\"\n",
1502 | "[OK] \"держано будет\" -> \"держано будет\"\n",
1503 | "[ERR:6] \"но] сие бомбардированя учинит\" -> \"но] с ткбом барировая учинит\"\n",
1504 | "[OK] \"господа сенат\" -> \"господа сенат\"\n",
1505 | "[ERR:2] \"i при\" -> \"+т при\"\n",
1506 | "[ERR:2] \"да уже под бостиона\" -> \"да уже подбости она\"\n",
1507 | "[ERR:3] \"на 2ю невозможно прежде бытия в карсъбат тово у\" -> \"на iю невозможно преждебытия в карсъбат товоу\"\n",
1508 | "[ERR:1] \"скую службу на галѣры ж та\" -> \"ккую службу на галѣры ж та\"\n",
1509 | "[OK] \"вѣкъ iли полтараста iс которых\" -> \"вѣкъ iли полтараста iс которых\"\n",
1510 | "[ERR:2] \"в гузомѣ говорил что окрѣсностию что\" -> \"вгузомѣ говорил что окрѣдностию что\"\n",
1511 | "[ERR:2] \"лию ежели непъриятел похочет також\" -> \"лию ежели непъриятел похочет i також\"\n",
1512 | "[ERR:2] \"тепска под ригу\" -> \"тепска по дригу\"\n",
1513 | "[OK] \"+\" -> \"+\"\n",
1514 | "[OK] \"ныя от крайнего упатку\" -> \"ныя от крайнего упатку\"\n",
1515 | "[ERR:36] \"+ то есть с понеделника на офъторникъ\" -> \"(+ \"\n",
1516 | "[ERR:1] \"салдаты i пушкари которыя вѣдомы от го\" -> \"салдаты i пушкари которыя вѣдомы отго\"\n",
1517 | "[ERR:4] \"по фъсѣм обстоятелствам\" -> \"по фъсѣ олбстоятелсто вам\"\n",
1518 | "[ERR:7] \"вам придат i на сей час возмите к себѣ\" -> \"вам придат i нанечас возмитекебѣ\"\n",
1519 | "[ERR:2] \"по самарѣ i iным рекам осмотрѣт для поселени\" -> \"по самарѣ i iны рекам осмотрѣт для по селени\"\n",
1520 | "[ERR:1] \"ресами будет нежели iсполнят в ползу оныя\" -> \"ресами будет нежелин iсполнят в ползу оныя\"\n",
1521 | "[OK] \"поненеже к бе\" -> \"поненеже к бе\"\n",
1522 | "[OK] \"с порохом\" -> \"с порохом\"\n",
1523 | "[ERR:2] \"го же дому кие будут пред\" -> \"гоже домукие будут пред\"\n",
1524 | "[ERR:2] \"сторон болшова канала а\" -> \"сторон болшава канала я\"\n",
1525 | "[ERR:2] \"над соединенною дабы\" -> \"надсоединенною абы\"\n",
1526 | "[ERR:3] \"с вышепомянутым\" -> \"с в выше помянутым\"\n",
1527 | "[ERR:1] \"обявъляю вам что сего дня намѣ\" -> \"обявъляю вам что сего дня нанѣ\"\n",
1528 | "[OK] \"петръ\" -> \"петръ\"\n",
1529 | "[ERR:1] \"ские в шонон войдут тогда\" -> \"сие в шонон войдут тогда\"\n",
1530 | "[ERR:5] \"сию компанию едва несравънителну прошлой даро\" -> \"смю компанинию едва нествънителну прошлой даро\"\n",
1531 | "[ERR:5] \"далголмъ амуницию пос\" -> \"дал гомъ амуницию iт пос\"\n",
1532 | "[ERR:3] \"ремени принуждены покинут пока паки\" -> \"реме ни принуждены покинут покапаке\"\n",
1533 | "[ERR:2] \"да будет послушен\" -> \"да будетт послущен\"\n",
1534 | "[ERR:2] \"будет толко зело с неудоволством слышим\" -> \"будет толко дело с не удоволством слышим\"\n",
1535 | "[ERR:1] \"румянцоф к нам приѣхал i о мирѣ обявилъ\" -> \"румянцоф к нам приѣхал i омирѣ обявилъ\"\n",
1536 | "[ERR:3] \"побей челом кнес папѣ чтоб с тобою\" -> \"побей челом к неспапѣ чтоб стобою\"\n",
1537 | "[ERR:15] \"60 iли 66 пушках i для того надлежит сим лѣтом i осеню в дос\" -> \"ычиыкушках i для того надлежи сисмлѣто i осеню вдос\"\n",
1538 | "[ERR:2] \"факцию турки i здѣлали\" -> \"факцию турки iз дѣлали\"\n",
1539 | "[OK] \"3\" -> \"3\"\n",
1540 | "[ERR:6] \"в сих днях писал брат ваш цесарское ве\" -> \"в сих дних писал страт вашце сарскоеве\"\n",
1541 | "[ERR:2] \"без вышнего указу\" -> \"без вышнегеуказу\"\n",
1542 | "[ERR:5] \"по ся поры ни одного не присыла\" -> \"пося порыниодного пеприсыла\"\n",
1543 | "[OK] \"понеже алтиллериi нынѣ доволно\" -> \"понеже алтиллериi нынѣ доволно\"\n",
1544 | "[OK] \"так быт ка оныя есть\" -> \"так быт ка оныя есть\"\n",
1545 | "[ERR:2] \"здѣ прилагаетца нѣкоторое о них\" -> \"здѣ прилагаетца нѣ которое оних\"\n",
1546 | "[OK] \"не могли того ради взяли резелюци\" -> \"не могли того ради взяли резелюци\"\n",
1547 | "[ERR:2] \"отвѣтстъвуюм сто\" -> \"отвѣтствую сто\"\n",
1548 | "[ERR:2] \"досок по два боутца iли по три добрых гвоздя\" -> \"досок подва боутца iли потри добрых гвоздя\"\n",
1549 | "[ERR:2] \"та не может при\" -> \"тане може при\"\n",
1550 | "[ERR:2] \"рому въремени надобно мы iмѣем въ эл\" -> \"рому въремени надобно мы iмѣем в ътэл\"\n",
1551 | "[ERR:3] \"не так как толкуют [хто же сему вина что\" -> \"не так как толкую [ттоже сему вина что\"\n",
1552 | "[OK] \"каго края паки оных посылат\" -> \"каго края паки оных посылат\"\n",
1553 | "[ERR:2] \"синявину писанное видѣлъ\" -> \"синя вину писанно е видѣлъ\"\n",
1554 | "[ERR:1] \"по первой травѣ в прочем надѣемся\" -> \"попервой травѣ в прочем надѣемся\"\n",
1555 | "[ERR:5] \"празником (+ також возми с собою i афицероф\" -> \"празнико о також возми собою i афицероф\"\n",
1556 | "[ERR:2] \"ца iли б выручки от кого дождат\" -> \"ца iли б выручки откого до ждат\"\n",
1557 | "[ERR:3] \"отвѣтствую что к губернатором азоф\" -> \"отвѣтствую что к губернатором авго\"\n",
1558 | "[ERR:9] \"правъда въ 18 лѣт + первою на\" -> \"правъда въ 1улѣт перъюто\"\n",
1559 | "[ERR:2] \"ц i г точию яко пъ\" -> \"ц i г точию якопѣ\"\n",
1560 | "[ERR:1] \"тоф i судоф чтоб при первом вскрытиi воды\" -> \"тоф i судоф чтоб при первом вскрытиiводы\"\n",
1561 | "[ERR:7] \"i другихъ дѣлъ до зимы\" -> \"iдру гильдѣлю дозимы\"\n",
1562 | "[ERR:7] \"остермана ежели великой нужды не iмѣете изволте\" -> \"остермана ежели аликой нужды не iлъете i волти\"\n",
1563 | "[OK] \"хором прокопон\" -> \"хором прокопон\"\n",
1564 | "[ERR:4] \"в послѣдних числѣхъ генваря буде ра\" -> \"в послѣдних числѣхъ генраря будерес\"\n",
1565 | "[ERR:1] \"ства померанские i сие толко комедия\" -> \"ства померанские i сие толко ко медия\"\n",
1566 | "[ERR:1] \"петръ\" -> \"потръ\"\n",
1567 | "[ERR:4] \"ло в котором пишете о жаловане также\" -> \"ло в котором пишете ожалаване так еже\"\n",
1568 | "[ERR:3] \"лажу покинут жал вчерашнего дни с утра i за\" -> \"лаожу покинут ал вчерашнего дни сутра i за\"\n",
1569 | "[ERR:2] \"i коi надежней поля\" -> \"iко i надежней поля\"\n",
1570 | "[OK] \"будет к померанской войнѣ того\" -> \"будет к померанской войнѣ того\"\n",
1571 | "[ERR:4] \"при нем коннице двум дивизиям янусовой\" -> \"принем коннице двумдивизиям пну совой\"\n",
1572 | "[ERR:3] \"вал iбо i послѣдней город ревель генералу лейтенанту\" -> \"вал iбо i послѣдней город ревелъ генералу лей тнанту\"\n",
1573 | "[ERR:6] \"пасть к флоту непърия\" -> \"пастъ к флопоминерърия\"\n",
1574 | "[ERR:1] \"маршу зело томны а когда придут к го\" -> \"моршу зело томны а когда придут к го\"\n",
1575 | "[OK] \"не въсѣ были а iменно в нижней полубѣ толко\" -> \"не въсѣ были а iменно в нижней полубѣ толко\"\n",
1576 | "[ERR:1] \"а ежели отчего боже сохрани попадет\" -> \"а ежели отчего боже сохрани по падет\"\n",
1577 | "[ERR:6] \"нил i чтоб в конце авъгуста къромѣ кромѣ\" -> \"нил i чтоб в конце а въ густакоралѣ кромѣ\"\n",
1578 | "[ERR:3] \"сикундоват задним\" -> \"шкундовет задним\"\n",
1579 | "[ERR:8] \"нам подлинно знат i не опустит дѣлат iли iтит вон так\" -> \"нам подлинноэнат i не опустинт дѣлат i листит вонак\"\n",
1580 | "[ERR:3] \"о фълотѣ нашем надежды + не iмѣйтѣ iбо еще\" -> \"о фълотѣ нашем надеждыд не iмѣй тѣ iбо еще\"\n",
1581 | "[ERR:3] \"добстфъ чрер реку комоникацию учинит\" -> \"добствъ чрерреку комоникацию учини\"\n",
1582 | "[OK] \"17\" -> \"17\"\n",
1583 | "[ERR:1] \"зон выпустит по послѣ\" -> \"зон выпустит но послѣ\"\n",
1584 | "[OK] \"вина француского самого доброго\" -> \"вина француского самого доброго\"\n",
1585 | "[ERR:1] \"ца в слобоцкие городы i писат\" -> \"ца в слобоцки е городы i писат\"\n",
1586 | "[OK] \"2\" -> \"2\"\n",
1587 | "[ERR:1] \"дет понеже не к в\" -> \"дет пънеже не к в\"\n",
1588 | "[ERR:1] \"мы зело удивъляемся вашему\" -> \"мы зело удивъляемсявашему\"\n",
1589 | "[ERR:3] \"товит на оных а когда\" -> \"товит нароых а когде\"\n",
1590 | "[OK] \"2\" -> \"2\"\n",
1591 | "[OK] \"5\" -> \"5\"\n",
1592 | "[OK] \"ны а потом мы iх от\" -> \"ны а потом мы iх от\"\n",
1593 | "[ERR:2] \"iтить с полками к штетину\" -> \"1тть с полками к штетину\"\n",
1594 | "[OK] \"указ что дѣлат в сей короткой час для\" -> \"указ что дѣлат в сей короткой час для\"\n",
1595 | "[ERR:2] \"паки с королем iмѣли комференцию на ко\" -> \"паки с королем i мѣли комференцию нако\"\n",
1596 | "[ERR:4] \"i крылѣ iмѣли то б чрез оную жъ\" -> \"i крылѣ iмѣли тоб чрез омую чь\"\n",
1597 | "[ERR:2] \"жены того ради\" -> \"желеы того ради\"\n",
1598 | "[ERR:2] \"в состояниi вездѣ\" -> \"в состояниi веде\"\n",
1599 | "[ERR:4] \"конечно въсю iз шлезiвика так\" -> \"конечно въсю iзшлез i викатак\"\n",
1600 | "[ERR:4] \"но нынѣ в голстиндиi дѣла слава богу так добро\" -> \"ненынѣ в гостиндиi дѣла слава богу так добо\"\n",
1601 | "[ERR:6] \"полъшеста того ради не могут от\" -> \"полъшерта ткого ради не могбо\"\n",
1602 | "[ERR:2] \"какъ\" -> \"ккак\"\n",
1603 | "[ERR:4] \"рпарционы на укърайнѣ дават по раз\" -> \"фарционы на укърайнѣдават пораз\"\n",
1604 | "[ERR:1] \"а далее сухим путем нѣ\" -> \"а далее сухим путемнѣ\"\n",
1605 | "[ERR:1] \"риятеля подождат iзволил дабы наши пол\" -> \"риятеля подождат iзволил дабы нашит пол\"\n",
1606 | "[ERR:1] \"в свѣю отпустят (+\" -> \"всвѣю отпустят (+\"\n",
1607 | "[OK] \"то библиотеку выпъросит\" -> \"то библиотеку выпъросит\"\n",
1608 | "[OK] \"лареi чтоб потом\" -> \"лареi чтоб потом\"\n",
1609 | "[ERR:1] \"i жаловане при пол\" -> \"i жаловасе при пол\"\n",
1610 | "[ERR:5] \"писмо ваше чрез михеля получил на которое отвѣт\" -> \"писмо ваше чрез мижели получил на котурое отбот\"\n",
1611 | "[ERR:4] \"покинуф побѣжал\" -> \"покиноф побѣвохал\"\n",
1612 | "[ERR:1] \"iли буде непъря\" -> \"iля буде непъря\"\n",
1613 | "[OK] \"ланы были для работных людей\" -> \"ланы были для работных людей\"\n",
1614 | "[ERR:1] \"то солгал\" -> \"то солпал\"\n",
1615 | "[ERR:4] \"по заключениi сего окорта\" -> \"позаключениi сеу о корта\"\n",
1616 | "[OK] \"оным дымом ушелъ\" -> \"оным дымом ушелъ\"\n",
1617 | "[OK] \"мы к вам особливое писмо о iх же дѣлѣ\" -> \"мы к вам особливое писмо о iх же дѣлѣ\"\n",
1618 | "[ERR:2] \"к пожелаемому миру\" -> \"к пожелае мому меру\"\n",
1619 | "[ERR:4] \"[iбо работа там зело пълоха нѣ на чем возит]\" -> \"[iбо работатам зело пълоханѣ на чем возию\"\n",
1620 | "[ERR:1] \"зборы которыя берутца въ ратушу для\" -> \"зборы которыя берутца въратушу для\"\n",
1621 | "[ERR:6] \"дѣйствоват\" -> \"дем оонат\"\n",
1622 | "[OK] \"дабы тѣм всякое опасение\" -> \"дабы тѣм всякое опасение\"\n",
1623 | "[OK] \"3\" -> \"3\"\n",
1624 | "[OK] \"господа сенат\" -> \"господа сенат\"\n",
1625 | "[ERR:2] \"iх ворофъство опровергнут тол\" -> \"i ворофъство опговергнут тол\"\n",
1626 | "[OK] \"(+ при въступлениi нашем\" -> \"(+ при въступлениi нашем\"\n",
1627 | "[ERR:3] \"вда долго ждали да прямова мира\" -> \"вда долгождали да прямовами ра\"\n",
1628 | "[ERR:1] \"ком случае а еже\" -> \"ком случое а еже\"\n",
1629 | "[ERR:1] \"к чему въ первых надлежит\" -> \"к чаму въ первых надлежит\"\n",
1630 | "[ERR:5] \"будущим i векселям немедленно iзполнят\" -> \"будушим о векселям немедленно iз поняс\"\n",
1631 | "[OK] \"2\" -> \"2\"\n",
1632 | "[ERR:2] \"i ше\" -> \"iеее\"\n",
1633 | "[ERR:3] \"поiску с помощию божиею\" -> \"по i ску спомощию божиею\"\n",
1634 | "[OK] \"новат нелзя\" -> \"новат нелзя\"\n",
1635 | "[ERR:2] \"iбо i лос здѣс обявил бутто о турках\" -> \"iбо iлос здѣс обявил буто о турках\"\n",
1636 | "[OK] \"господин потканслѣръ\" -> \"господин потканслѣръ\"\n",
1637 | "[OK] \"i тако к в ни откул непъ\" -> \"i тако к в ни откул непъ\"\n",
1638 | "[OK] \"i понеже нынѣ ревелская посылъка\" -> \"i понеже нынѣ ревелская посылъка\"\n",
1639 | "[OK] \"ны а для воды возможно послат несколко\" -> \"ны а для воды возможно послат несколко\"\n",
1640 | "[ERR:3] \"рига i эсперанция на мели были то однакож\" -> \"рига i эеперанция намели были то однакол\"\n",
1641 | "[ERR:3] \"стеру i оттол [буде трудно бу\" -> \"ятеру iот тол [буде трудно бу\"\n",
1642 | "[ERR:29] \"риятель с армѣею достич не мог\" -> \"+ \"\n",
1643 | "[ERR:5] \"трактам для чего я вчерас капитана сиверса с о\" -> \"трактам для чго я вчерас осапитане сиверса со\"\n",
1644 | "[OK] \"более не дѣлат я сказал что я ни\" -> \"более не дѣлат я сказал что я ни\"\n",
1645 | "[OK] \"2\" -> \"2\"\n",
1646 | "[OK] \"лу непъриятеля отако\" -> \"лу непъриятеля отако\"\n",
1647 | "[ERR:8] \"я в великом удивълениi i в печалю у есть\" -> \"я е великом удивълениемх iтчалю у есть\"\n",
1648 | "[ERR:2] \"господин амбасадер\" -> \"господин л басадер\"\n",
1649 | "[ERR:3] \"пра\" -> \"бъъ\"\n",
1650 | "[OK] \"на оной же б садитца что же о выво\" -> \"на оной же б садитца что же о выво\"\n",
1651 | "[ERR:2] \"конечно пойдем к стралзун\" -> \"конечно пойде кстралзун\"\n",
1652 | "[ERR:4] \"i когда о том наш м провѣдаф стал королю гаворит\" -> \"i кода о том наш м провѣдаф стал королюговобит\"\n",
1653 | "[ERR:1] \"что ты указ iмѣешь все в ползу ево дѣлат\" -> \"что ты указ iмѣешь все в пролзу ево дѣлат\"\n",
1654 | "[ERR:10] \"принциар фискалоф у каждого дѣла по одному которыя еще\" -> \"пчнафискалоф укаж дого дѣла по одну которыя еще\"\n",
1655 | "[ERR:3] \"iз торнъ въ 1 д сентерря 1711\" -> \"iзторнъ въ 1 д сентеррях +711\"\n",
1656 | "[ERR:2] \"нешнею осеню вырубит а зимою вы\" -> \"нешнею отею вырубит а зимою вы\"\n",
1657 | "[ERR:6] \"провин княжство овъладѣли а непъри\" -> \"пиловин к няж сдиво овъладѣли а непъри\"\n",
1658 | "[ERR:2] \"iз кросена октебря вѣрныi друг i брат\" -> \"iз кросена октебря вѣрныi вруж i брат\"\n",
1659 | "[ERR:6] \"по том отступълениi на третей дѣн прибылъ\" -> \"потом отступълениi на тротрден прибылъ\"\n",
1660 | "[OK] \"i тако сие обявя вашему величеству оным поздравъ\" -> \"i тако сие обявя вашему величеству оным поздравъ\"\n",
1661 | "[OK] \"в котором вы пишете о запо\" -> \"в котором вы пишете о запо\"\n",
1662 | "[ERR:2] \"i караблей i так а выслат сих лутче сухим\" -> \"i караблей i ток а выслат сих лутчесухим\"\n",
1663 | "[ERR:2] \"домость которого вскорѣ ожидаем\" -> \"домоть которого всксорѣ ожидаем\"\n",
1664 | "[ERR:8] \"купъно с но\" -> \"ку твешо\"\n",
1665 | "[ERR:2] \"най развѣ онѣ зачнут дабы iх тѣм не въздорожит\" -> \"най развѣ онѣ закнут дабы iх тѣм не въ здорожит\"\n",
1666 | "[OK] \"1\" -> \"1\"\n",
1667 | "[ERR:2] \"i лутче б оной iмѣт прежъде\" -> \"i лутчеб оной iмѣт прежвде\"\n",
1668 | "[ERR:1] \"оной ломат i тѣм пъротчие починеват\" -> \"оной ломят i тѣм пъротчие починеват\"\n",
1669 | "[OK] \"+\" -> \"+\"\n",
1670 | "[OK] \"того ради предлажите iм та\" -> \"того ради предлажите iм та\"\n",
1671 | "[OK] \"до пятницы которого дня ра\" -> \"до пятницы которого дня ра\"\n",
1672 | "[ERR:2] \"знет трудно оного держат того для по\" -> \"онет терудно оного держат того для по\"\n",
1673 | "[OK] \"лѣса iли iныя крѣпости\" -> \"лѣса iли iныя крѣпости\"\n",
1674 | "[ERR:8] \"возих в воли к в кам оной\" -> \"вочих в волешекал оной\"\n",
1675 | "[ERR:5] \"чина что ежели гдѣ мѣшкат\" -> \"чина чн ежели гдѣ мѣша г\"\n",
1676 | "[ERR:2] \"меня зело опечалили для слабых там пос\" -> \"меня зело опечотлили для слабых там пос\"\n",
1677 | "[ERR:2] \"лежашей пут чрез швед полшею недалеко от бран\" -> \"лежашей пот чрез швед полшею не далеко от бран\"\n",
1678 | "[ERR:2] \"стах iзготовит каналами i сюдерзеем а на сюдер\" -> \"стах iзготобит каналами i сюдерзеем а насюдер\"\n",
1679 | "[OK] \"доват буду о чем пространнее\" -> \"доват буду о чем пространнее\"\n",
1680 | "[ERR:2] \"но была чтоб времени не потерят\" -> \"но была что в ремени не потерят\"\n",
1681 | "[ERR:4] \"указ iмѣете чтоб эбинскую алтиллерию отпровадит\" -> \"указ iмѣеть чтоб эбинскую алтиллерию отпровяд\"\n",
1682 | "[ERR:1] \"дали чтоб по окончаниi рады вам\" -> \"дали чтоб по окончениi рады вам\"\n",
1683 | "[ERR:1] \"куды удобнѣе нам ѣхат там велите\" -> \"куды удобнѣе нам ѣхан там велите\"\n",
1684 | "[ERR:1] \"а что о моем быте к вам iстинно б рад\" -> \"а что о моем быте к вам iстинно брад\"\n",
1685 | "[ERR:3] \"послушанъ такъ же о нѣкото\" -> \"послушанъ такъже онѣко то\"\n",
1686 | "[OK] \"ежели же к в сам своiм\" -> \"ежели же к в сам своiм\"\n",
1687 | "[ERR:1] \"i ежели на той сторонѣ\" -> \"i еожели на той сторонѣ\"\n",
1688 | "[OK] \"сей двор не толко помѣскою но i помощию\" -> \"сей двор не толко помѣскою но i помощию\"\n",
1689 | "[OK] \"добно к тому i\" -> \"добно к тому i\"\n",
1690 | "[OK] \"кое число как вы пишете от 5 до 6\" -> \"кое число как вы пишете от 5 до 6\"\n",
1691 | "[ERR:4] \"ми войны а не у себя також i о персоналной моей ѣздѣ\" -> \"мивойны а не усебят також i оперсоналной моей ѣздѣ\"\n",
1692 | "[ERR:1] \"том же б обнадежили что\" -> \"то же б обнадежили что\"\n",
1693 | "[ERR:1] \"чтоб вы подредили в полше ду\" -> \"чтоб вы подредили в полшеду\"\n",
1694 | "[OK] \"ку а к нашей ползѣ надлежит все то\" -> \"ку а к нашей ползѣ надлежит все то\"\n",
1695 | "[ERR:1] \"дни приѣхал сюды отютантъ\" -> \"дни приѣхал сюды отютаннъ\"\n",
1696 | "[OK] \"5\" -> \"5\"\n",
1697 | "[OK] \"мом готорвъским в котором а i\" -> \"мом готорвъским в котором а i\"\n",
1698 | "[ERR:2] \"i никакова дѣла без оных не дѣлат також лантъ\" -> \"i никакова дѣла без оных недѣла також лантъ\"\n",
1699 | "[ERR:2] \"i гдѣ чрез реки сорть i трен пере\" -> \"i гдѣ чрез реки собртъ i трен пере\"\n",
1700 | "[OK] \"1\" -> \"1\"\n",
1701 | "[ERR:5] \"от воды бог дастъ доброе посылаю при\" -> \"отводы богдасть доброе посыхаею при\"\n",
1702 | "[ERR:1] \"жениi приналежит\" -> \"жениi приналежин\"\n",
1703 | "[OK] \"кой дѣлает iхъ\" -> \"кой дѣлает iхъ\"\n",
1704 | "[ERR:1] \"разрыват i роф наполнит\" -> \"разрыват iроф наполнит\"\n",
1705 | "[OK] \"10\" -> \"10\"\n",
1706 | "[OK] \"трациi что к шведской дипълом прислал\" -> \"трациi что к шведской дипълом прислал\"\n",
1707 | "[ERR:4] \"а снаружи фашинами ж з землею також\" -> \"а с наружи фашинамиж зз емлею також\"\n",
1708 | "[ERR:4] \"обявил мнѣ милость государя нашего\" -> \"обявид мнѣ милостъ госуѣ даря нашего\"\n",
1709 | "[ERR:2] \"к первому и въторому\" -> \"к первому i въ торому\"\n",
1710 | "[ERR:2] \"воритца i опъределит добрым средством о бреме\" -> \"воритца i опъредели добрым средством обреме\"\n",
1711 | "[ERR:1] \"въ 4 iли 5 то учинилос\" -> \"въ 4 iли 8 то учинилос\"\n",
1712 | "[OK] \"2\" -> \"2\"\n",
1713 | "[ERR:6] \"шками болше такъже сверхъ\" -> \"шками болс ткакъ е сдерхч\"\n",
1714 | "[ERR:1] \"можно то б хотя болшую часть\" -> \"можно то б хотя бошую часть\"\n",
1715 | "[ERR:1] \"не iмѣю i дѣлаю толко для них iстин\" -> \"не iмѣю i дѣлаю толко дляних iстин\"\n",
1716 | "[ERR:3] \"шали [как i прежде к вам писано] i проч без позво\" -> \"шали [как i прежде к вам тисано] i прочбе позво\"\n",
1717 | "[OK] \"пъриятеля отнята i кор\" -> \"пъриятеля отнята i кор\"\n",
1718 | "[ERR:3] \"о гварнизонѣ в тонингъ то б не наших i саксоф то б\" -> \"о гварнизонѣ в тонинго тобне наших i саксоф то б\"\n",
1719 | "[ERR:2] \"клоу цыфирю\" -> \"шлоуцыфирю\"\n",
1720 | "[ERR:1] \"30 руских брегантин\" -> \"з0 руских брегантин\"\n",
1721 | "[ERR:4] \"зяты сюды а ты съ тѣм баталионом\" -> \"зя ты беды а ты съ тѣм батали оном\"\n",
1722 | "[ERR:7] \"кѣ присылат i i о том поговори з дру (+\" -> \"кѣ при сылат н i о том поговоризду в\"\n",
1723 | "[ERR:2] \"iз кипиной мызы въ 15 д июля 1713 петръ\" -> \"iз кипиной мызы въ 13 д iюля 1713 петръ\"\n",
1724 | "[ERR:3] \"держат будут\" -> \"деррву будут\"\n",
1725 | "[ERR:1] \"вначалѣ\" -> \"в началѣ\"\n",
1726 | "[ERR:7] \"в i его союзникоф не слу\" -> \"в тего соют ниоф неелу\"\n",
1727 | "[ERR:1] \"чрез зунтъ то говорит чтоб\" -> \"чрез зунтъ тоговорит чтоб\"\n",
1728 | "[OK] \"перекопу приближи\" -> \"перекопу приближи\"\n",
1729 | "[OK] \"i негодных не было а губерней питер\" -> \"i негодных не было а губерней питер\"\n",
1730 | "[ERR:1] \"посмо твое я получил на кото\" -> \"посмотвое я получил на кото\"\n",
1731 | "[ERR:6] \"нашей такъ же i то надобно вам писменно iспросит\" -> \"нашой такъже i то надобно вам прменно iспролут\"\n",
1732 | "[ERR:1] \"дѣло о чем обявит вам послан\" -> \"дѣло о чем обявит вам посланм\"\n",
1733 | "[ERR:3] \"шему нѣ ѣхат для ученя на год что я с пе\" -> \"шему нѣѣхат для учен я на год чтто я с пе\"\n",
1734 | "[ERR:5] \"i поднят обыкновенное свое\" -> \"i понят обы к новенноевое\"\n",
1735 | "[ERR:2] \"твердили но когда оттол к вышепи\" -> \"твердили но когда от толк вышепи\"\n",
1736 | "[ERR:1] \"во не буду дѣлат что къ его предосуж\" -> \"во не буду дѣлат что къ его пред осуж\"\n",
1737 | "[ERR:3] \"от статоф учиненной i оным мы зело благо\" -> \"отстатоф учиненной i оным мы зелобла го\"\n",
1738 | "[ERR:2] \"писмо ваше я у господина\" -> \"писма ваше я у посподина\"\n",
1739 | "Character error rate: 8.180347%. Word error rate: 37.879226%. String accuracy: 26.645768%.\n"
1740 | ]
1741 | }
1742 | ],
1743 | "source": [
1744 | "numCharErr = 0\n",
1745 | "numCharTotal = 0\n",
1746 | "numStringOK = 0\n",
1747 | "numStringTotal = 0\n",
1748 | "\n",
1749 | "word_eds, word_true_lens = [], []\n",
1750 | "\n",
1751 | "print('Ground truth -> Recognized')\t\n",
1752 | "for i in range(len(out)):\n",
1753 | " pred = ''\n",
1754 | " for p in out[i]:\n",
1755 | " if int(p) != -1:\n",
1756 | " pred+=letters[int(p)]\n",
1757 | " true = val_original_text[i]\n",
1758 | " \n",
1759 | " numStringOK += 1 if true == pred else 0\n",
1760 | " numStringTotal += 1\n",
1761 | " dist = editdistance.eval(pred, true)\n",
1762 | " numCharErr += dist\n",
1763 | " numCharTotal += len(true)\n",
1764 | " \n",
1765 | " pred_words = pred.split()\n",
1766 | " true_words = true.split()\n",
1767 | " word_eds.append(editdistance.eval(pred_words, true_words))\n",
1768 | " word_true_lens.append(len(true_words))\n",
1769 | " \n",
1770 | " print('[OK]' if dist==0 else '[ERR:%d]' % dist,'\"' + true + '\"', '->', '\"' + pred + '\"')\n",
1771 | "\n",
1772 | "charErrorRate = numCharErr / numCharTotal\n",
1773 | "wordErrorRate = sum(word_eds) / sum(word_true_lens) \n",
1774 | "stringAccuracy = numStringOK / numStringTotal\n",
1775 | "print('Character error rate: %f%%. Word error rate: %f%%. String accuracy: %f%%.' % \\\n",
1776 | " (charErrorRate*100.0,wordErrorRate*100.0, stringAccuracy*100.0))"
1777 | ]
1778 | }
1779 | ],
1780 | "metadata": {
1781 | "accelerator": "GPU",
1782 | "colab": {
1783 | "name": "HTR_USING_CRNN.ipynb",
1784 | "provenance": []
1785 | },
1786 | "kernelspec": {
1787 | "display_name": "Python 3",
1788 | "language": "python",
1789 | "name": "python3"
1790 | },
1791 | "language_info": {
1792 | "codemirror_mode": {
1793 | "name": "ipython",
1794 | "version": 3
1795 | },
1796 | "file_extension": ".py",
1797 | "mimetype": "text/x-python",
1798 | "name": "python",
1799 | "nbconvert_exporter": "python",
1800 | "pygments_lexer": "ipython3",
1801 | "version": "3.7.8"
1802 | }
1803 | },
1804 | "nbformat": 4,
1805 | "nbformat_minor": 4
1806 | }
1807 |
--------------------------------------------------------------------------------
/DigitalPeter/pics/counts_hor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/DigitalPeter/pics/counts_hor.png
--------------------------------------------------------------------------------
/DigitalPeter/pics/leaderboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/DigitalPeter/pics/leaderboard.png
--------------------------------------------------------------------------------
/DigitalPeter/pics/line_label.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/DigitalPeter/pics/line_label.png
--------------------------------------------------------------------------------
/DigitalPeter/pics/one_line.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/DigitalPeter/pics/one_line.jpg
--------------------------------------------------------------------------------
/IDP-forms/README.md:
--------------------------------------------------------------------------------
1 | # Forms
2 |
3 | This dataset containts words and phrases written in special forms, like one on the picture. The final dataset contains cropped blocks of text from these forms and text annotations.
4 |
5 | 
6 |
7 |
8 | Example image from the dataset.
9 |
10 | 
11 |
12 | Here is the [**link**](https://drive.google.com/file/d/1XdDlbuOGaxodhFU_Bo9-zoZBguJE8oZD/view?usp=sharing).
13 |
14 | It contains `images` folder and `data.csv`. There are **5203** images in this dataset. Text corresponding to each image is in `text` column in `data.csv`.
15 |
--------------------------------------------------------------------------------
/IDP-forms/august.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/IDP-forms/august.png
--------------------------------------------------------------------------------
/IDP-forms/form.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/IDP-forms/form.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # htr_datasets
2 | В данном репозитории находятся собранные нами и размеченные датасеты для обучения
3 | моделей HTR. Датасеты являются открытыми, и мы будем рады, если они окажутся полезными
4 | для сообщества.
5 |
6 | ## Структура
7 |
8 | В данном репозитории находится несколько папок, каждая из которых относится к своему
9 | датасету. В каждой из папок находится свой ```README.md``` файл с подробным описанием данных,
10 | формата, структуры, а так же ссылки для скачивания. Для некоторых задач мы так же предоставляет бейзлайн
11 | решения (код модели). Итак, в репозитории на данный момент содержатся следующие датасеты:
12 |
13 | * DigitalPeter - датасет архивных рукописей Петра Первого. Содержит описание, ссылки на данные,
14 | а так же ноутбуки с нашим подходом к построению модели для решения данной задачи.
15 | * IDP-forms - содержит датасет рукописных слов, написанных людьми при заполненнии специальных форм. Язык - русский.
16 | * school_notebooks - датасет размеченных школьных тетрадей. Включает в себя информацию по двум задачам -
17 | локализация и перевод текста на картинке. Для задачи локализации на тетради были выделены полигонами все
18 | рукописные слова, для задачи распознавания - они же переведены.
19 |
20 | В каждой из папок содержатся примеры данных.
--------------------------------------------------------------------------------
/school_notebooks/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/school_notebooks/.DS_Store
--------------------------------------------------------------------------------
/school_notebooks/README.md:
--------------------------------------------------------------------------------
1 | # school_notebooks
2 |
3 | В данном репозитории содержится информация о датасете школьных тетрадей, который мы собрали
4 | и разметили для задачи распознавания рукописного текста.
5 |
6 | Скачать датасет можно с huggingface [link](https://huggingface.co/datasets/sberbank-ai/school_notebooks_RU)
7 |
8 | # Распознавание текста
9 |
10 | На следующей картинке приведен пример одного сэмпла из датасета. Соответствующий перевод - "последовал".
11 |
12 | 
13 |
14 | На следующей картинке представлен пример изначальной разметки школьной тетради с помощью полигонов.
15 |
16 | 
17 |
18 | Затем каждое слово транскрибировалось отдельно.
19 |
20 | 
21 |
--------------------------------------------------------------------------------
/school_notebooks/pics/460.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/school_notebooks/pics/460.png
--------------------------------------------------------------------------------
/school_notebooks/pics/razmetka_list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/school_notebooks/pics/razmetka_list.png
--------------------------------------------------------------------------------
/school_notebooks/pics/razmetka_word.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ai-forever/htr_datasets/d7aaa9704060b546ad5602f71b3c943b30c0f48e/school_notebooks/pics/razmetka_word.png
--------------------------------------------------------------------------------