From 10761e96bb28b756c9efe75fe13414ef95dafca4 Mon Sep 17 00:00:00 2001 From: Kate Date: Wed, 1 Nov 2023 16:49:59 +0400 Subject: [PATCH] belyaeva lab 7 ready --- belyaeva_ekaterina_lab_7/README.md | 54 ++++++++++++++++ belyaeva_ekaterina_lab_7/eng.txt | 5 ++ belyaeva_ekaterina_lab_7/main.py | 97 +++++++++++++++++++++++++++++ belyaeva_ekaterina_lab_7/res.png | Bin 0 -> 13560 bytes belyaeva_ekaterina_lab_7/rus.txt | 1 + 5 files changed, 157 insertions(+) create mode 100644 belyaeva_ekaterina_lab_7/README.md create mode 100644 belyaeva_ekaterina_lab_7/eng.txt create mode 100644 belyaeva_ekaterina_lab_7/main.py create mode 100644 belyaeva_ekaterina_lab_7/res.png create mode 100644 belyaeva_ekaterina_lab_7/rus.txt diff --git a/belyaeva_ekaterina_lab_7/README.md b/belyaeva_ekaterina_lab_7/README.md new file mode 100644 index 0000000..6d80b67 --- /dev/null +++ b/belyaeva_ekaterina_lab_7/README.md @@ -0,0 +1,54 @@ +## Задание + +Выбрать художественный текст (четные варианты – русскоязычный, нечетные – англоязычный) и обучить на нем рекуррентную +нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.Далее разбиться на пары четный-нечетный вариант, обменяться разработанными сетями и проверить, как архитектура товарища справляется с вашим текстом. + +## Как запустить лабораторную +Запустить файл main.py +## Используемые технологии +Библиотеки tensorflow, numpy, их компоненты +## Описание лабораторной (программы) + +Данная лабораторная работа обучает модели для обработки русского и английского текста и решает задачу генерации. +Ниже будет описан алгоритм работы одной из моделей (вторая работает аналогично): +1. Читается текст из файла +2. Создается экземпляр Tokenizer для токенизации текста +3. С помощью метода fit_on_texts токенизатор анализирует текст и строит словарь уникальных слов +4. rus_vocab_size - длина словаря +5. C помощью метода text_to_sequences текст преобразуется в последовательность чисел +6. Создаются последовательности для обучения модели +7. Рассчитывается максимальная длина последовательности +8. Входные последовательности выравниваются до максимальной длины +9. С помощью функции to_categorical последовательности преобразуются в one-hot представление +10. Переменные x_rus_train, y_rus_train инициализируются соответствующими значениями +11. Такая же обработка текста происходит и для текста на английском языке +12. Происходит создание модели на русском языке: + - создается экземпляр модели Sequential + - добавляется слой Embedding, отображающий слова в векторы фиксированной длины + - добавляется слой LSTM с 512 нейронами + - добавляется слой Dense с функцией softmax для получения вероятности каждого слова в словаре + - модель компилируется +13. Происходит обучение модели через model.fit() +14. Все то же самое происходит для модели с английским языком +15. Определяется функция generate_text для генерации текста на основе всех заданных параметров +16. Выводятся результаты работы моделей и сгенерированные тексты + +## Результат + +Результат сгенерированного текста на русском языке: Помню просторный грязный двор и низкие домики обнесённые забором двор стоял у самой реки и по вёснам когда спадала полая вода он был усеян щепой и ракушками а иногда и другими куда более интересными вещами так однажды мы нашли туго набитую письмами сумку а потом вода принесла и осторожно положила на берег и самого почтальона он лежал на спине закинув руки как будто заслонясь от солнца ещё совсем молодой белокурый в форменной тужурке с блестящими пуговицами должно быть отправляясь в свой последний рейс почтальон начистил их мелом мелом мелом спадала щепой мелом мелом мелом мелом мелом спадала полая вода он ракушками а + +Результат сгенерированного текста на английском языке: The old man was thin and gaunt with deep wrinkles in the back of his neck the brown blotches of the benevolent skin cancer the sun brings from its reflection on the tropic sea were on his cheeks the blotches ran well down the sides of his face and his hands had the deep creased scars from handling heavy fish on the cords but none of these scars were fresh they were as old as erosions in a fishless desert fishless desert desert desert desert desert desert desert desert desert desert desert desert desert desert desert desert desert desert desert desert desert fishless + +Результат потерь на тренировочных данных: + +![res.png](res.png) + +Вывод: можно заметить, что в сгенерированных текстах в конце слова повторяются. Это происходит потому, что в параметрах модели +указано сгенерировать 100 слов, хотя в тексте, по которому модель обучается, меньше слов. Поэтому сгенерированный текст сначала +соответствует тексту для обучения, а затем начинает выдавать рандомные слова. Но нужно отметить, что это слова, а не просто +набор букв и пробелы, которые получались при иных настройках моделей. + +Так как у английской модели меньше потерь на тренировочных данных, чем у русской, то получается, что выполненная модель +обрабатывает английский текст чуть лучше, чем русский, но в результате обе модели выдали осмысленный текст, что связано с большим +числом нейронов и эпох, при помощи которых обучалась модель. Ведь когда было 20 эпох, а не 200, модель выдавала очень слабо осмысленный результат. + diff --git a/belyaeva_ekaterina_lab_7/eng.txt b/belyaeva_ekaterina_lab_7/eng.txt new file mode 100644 index 0000000..7518545 --- /dev/null +++ b/belyaeva_ekaterina_lab_7/eng.txt @@ -0,0 +1,5 @@ +The old man was thin and gaunt with deep wrinkles in the back of his neck. The +brown blotches of the benevolent skin cancer the sun brings from its reflection on the +tropic sea were on his cheeks. The blotches ran well down the sides of his face and his +hands had the deep-creased scars from handling heavy fish on the cords. But none of +these scars were fresh. They were as old as erosions in a fishless desert. \ No newline at end of file diff --git a/belyaeva_ekaterina_lab_7/main.py b/belyaeva_ekaterina_lab_7/main.py new file mode 100644 index 0000000..742fa90 --- /dev/null +++ b/belyaeva_ekaterina_lab_7/main.py @@ -0,0 +1,97 @@ +import tensorflow as tf +import numpy as np +from keras.models import Sequential +from keras.layers import LSTM, Dense, Embedding +from keras.preprocessing.text import Tokenizer +from keras.preprocessing.sequence import pad_sequences + +# Загрузка и предобработка данных на русском языке +with open("rus.txt", "r", encoding="utf-8") as f: + rus_text = f.read() + +tokenizer_rus = Tokenizer() +tokenizer_rus.fit_on_texts([rus_text]) + +rus_vocab_size = len(tokenizer_rus.word_index) + 1 +rus_sequences = tokenizer_rus.texts_to_sequences([rus_text])[0] +rus_input_sequences = [] +rus_output_sequences = [] + +for i in range(1, len(rus_sequences)): + rus_input_sequences.append(rus_sequences[:i]) + rus_output_sequences.append(rus_sequences[i]) + +rus_max_sequence_len = max([len(seq) for seq in rus_input_sequences]) +rus_input_sequences = pad_sequences(rus_input_sequences, maxlen=rus_max_sequence_len) + +x_rus_train = rus_input_sequences +y_rus_train = tf.keras.utils.to_categorical(rus_output_sequences, num_classes=rus_vocab_size) + +# Загрузка и предобработка данных на английском языке +with open("eng.txt", "r", encoding="utf-8") as f: + eng_text = f.read() + +tokenizer_eng = Tokenizer() +tokenizer_eng.fit_on_texts([eng_text]) + +eng_vocab_size = len(tokenizer_eng.word_index) + 1 +eng_sequences = tokenizer_eng.texts_to_sequences([eng_text])[0] +eng_input_sequences = [] +eng_output_sequences = [] + +for i in range(1, len(eng_sequences)): + eng_input_sequences.append(eng_sequences[:i]) + eng_output_sequences.append(eng_sequences[i]) + +eng_max_sequence_len = max([len(seq) for seq in eng_input_sequences]) +eng_input_sequences = pad_sequences(eng_input_sequences, maxlen=eng_max_sequence_len) + +x_eng_train = eng_input_sequences +y_eng_train = tf.keras.utils.to_categorical(eng_output_sequences, num_classes=eng_vocab_size) + +# Построение модели для русского языка +rus_model = Sequential() +rus_model.add(Embedding(rus_vocab_size, 256, input_length=rus_max_sequence_len)) +rus_model.add(LSTM(512)) +rus_model.add(Dense(rus_vocab_size, activation='softmax')) + +rus_model.compile(loss='categorical_crossentropy', optimizer='adam') + +# Обучение модели для русского языка +rus_history = rus_model.fit(x_rus_train, y_rus_train, batch_size=128, epochs=200) + +# Построение модели для английского языка +eng_model = Sequential() +eng_model.add(Embedding(eng_vocab_size, 256, input_length=eng_max_sequence_len)) +eng_model.add(LSTM(512)) +eng_model.add(Dense(eng_vocab_size, activation='softmax')) + +eng_model.compile(loss='categorical_crossentropy', optimizer='adam') + +# Обучение модели для английского языка +eng_history = eng_model.fit(x_eng_train, y_eng_train, batch_size=128, epochs=200) + +def generate_text(model, tokenizer, max_sequence_len, seed_text): + output_text = seed_text + for _ in range(100): # Генерируем 100 слов + encoded_text = tokenizer.texts_to_sequences([output_text])[0] + pad_encoded = pad_sequences([encoded_text], maxlen=max_sequence_len, truncating='pre') + pred_word_index = np.argmax(model.predict(pad_encoded), axis=-1) + pred_word = tokenizer.index_word[pred_word_index[0]] + output_text += " " + pred_word + return output_text + +# Генерация текста для русской и английской моделей +rus_output_text = generate_text(rus_model, tokenizer_rus, rus_max_sequence_len, "Помню просторный") +eng_output_text = generate_text(eng_model, tokenizer_eng, eng_max_sequence_len, "The old man") + +# Вывод результатов +print("Русская модель:") +print("Потери на тренировочных данных:", rus_history.history['loss'][-1]) +print("Сгенерированный текст:") +print(rus_output_text) + +print("Английская модель:") +print("Потери на тренировочных данных:", eng_history.history['loss'][-1]) +print("Сгенерированный текст:") +print(eng_output_text) diff --git a/belyaeva_ekaterina_lab_7/res.png b/belyaeva_ekaterina_lab_7/res.png new file mode 100644 index 0000000000000000000000000000000000000000..51cc401e914413d38aff60b41886210909f634ac GIT binary patch literal 13560 zcmbumXIN8R*Di_(f*?&qM5-bkLFott0TDqUlq`xM*yv3_dJ|L-X@d0L%L+w$Cn8`d z0!j-#^b%@lfdFCWd3@e|zIT7;yY_po^Cv6oN;21&V~#oI825cAR7YElhUz*M2?+^} z`lAPWBqZmM#P@ZSq{LU2w6CfpBoYYq2TCwcvyHS<=_^}jNW@uZ`1}$*UpGTnX!Qbp zeG$y@9@Eq#j|ZP}-+!gbvKRE2;H@%VufQ>6D6Y$)ey&HPtw~xY-QM?4+daI2GCfX4 z?I+i#%ZbZ9?LT|TolQ@sL|=WVXu}x9MOk5`12B*&4Uqv%O7su3{^y%3MS^YliiuP1 zXD6H?QmYn17!Msu<3< zD~fXlV0}xqKE9GDd5HVj`>L$zs{85J2-A-@0>qrh?Gy%guhzN^ON^L#3G1z^I9QFw z;=4AmCTd3kNNbMks22By2fHbksT^^=eI-<)E&2&t_rY`?F$gP6QVt}A}wq*d3E=@&hFT)Ekknsp_d0A6PDQ+ zJqFtk>LyuF&0ETxicK`Rp(1S9rMB4B;&Z1Te6LAmx%*Dw#%79XpRS12_u_qQ4o}~6 zozeT~4G;aW>HpcA`zW~AR?N|_kQw0K8Ux+7H6#j5?e~ff^4wmUTll+M&fcE#=nuia zfzS?Z8V>V2tQGr}%Ss13MJbfI3I}+4ufEZ?Y>gnO;vPk0HnHHWq?YhbsogTIPa)mAQ07 zBA_5++S%wzl1*P&?nN!75R3X_;ZROp$r&@pE{5YP^0n)wU^=#7BkX)!h*-+W%S0SUQ|6{dxet1)l_fYL@So_==)hnVX{Ok`;S0WVYR^be3C0KaKT+P2wX2+PjdV_LDlpzR=RP5}MNph3txx1|#^L%hq z+rh8N=j7Gkcl@tvBc&Jj_ur3)g8sH5KYvZL7`v{B@PuyYF8c`gVMCTBlaj-~BzHsL znIN0`vd^V86Kzy}W(^f=-_=3ygX8ZVzx+kdq`rm}@S#COgJp`o0Ek&ZJd9ybmlgJv zs=%l99Ll8SgW@Gt;*#T<4$f}4Y`+$TFn5+nu1-Z2N)Y2ydi}vp8p|@08EWO`0h>!V! z*Pm{?OiTHlj?yx{n*oMjPaKz$dR-6%ZQl^YcN?;fvvDX81uUSzmGn#8@DG(ls*TXmxRSBc-y_`k8T8j-W#1x(08X}BP|4iSJ6R=+$? zQ3P%~Ck#3y`}qi=&P?M%5u*++qELDIbXG3P9jDAkz~b}K)cB*`S@>M@wjxOZ7^pZY zZm+rDS(6D8bNo(W7MNTkTR?F6j&N;tYjB%&D>=L=_!uVH&}3Cz$#(WdB#5gqCkV8C zqFLi1O*iWx9K`ie5d6eN8FY9bP^Bl+WrP95gGW;7KfBS*1y62*{`$O;d3~2{q{)s9 zpVKlAt+fcp0G^uMCCvIwaB`(ioYf1Bds>?eWeRjQp>jY$iul+^&hf@bp`z&z6QV8C zl&K#63EW(eABkMk?`-@%wU z5Zzg(_aKZL#d%FM1*SYV>R)QC`EtW>;ME!zqq(M$*fg5Baqw9;Ld;o2o4vmUf}c)2 zo{g$l_}Rr5F*8GLB=hK|MNY4rjBqU+i`&Bt25a5gau^{(>QY6vqxC0Q`=+#8AvIrR zCkh#)fJ=@na(z_0kt*Bs(V@@{x-Fdbz6o;RFh|V6{on}c9Y)N$Gt|r(6L&1kQnq}v z%xMgO$5!>%+;iQ1H&Gm**B1e=OSj9gyZvznr_IiMh4cEB z6E_*a-Y6pS+kDaiS0p%`6PpMjzZSW95}EB8OC>}TDTT&J6&s^a`EG73L9K!|XTt%} zXC9b$(8kguglot5Z%m{&$_xZ`2s-Ht+}m}zNB8Gr!k{JMX!Firt6y2rwP{#?-SekH zZjQU$C8Gr{o)g=Tgc6p!uD$~d*Hd7ty%#3d#H3oCadW)Hby|!#$dW+#dp$%FaBKsH3Pqi8{uG z<7&%Afe-Q;Nr~LZ&RVsH&HfXkBED_8?W!N)kjDxdAI4s!uNKLc497}@m)cXom5zr( zj>o%f#BV3No2W4*yS+6OB1=__EtsscKKg|uM^a#f3t#(PILd|qzafp!?Yp8k$|6CR zvq+)Aq!C3^*~=`zuli>hElGk0fh6*FtN+C>M|L*{RmyDJ%?2BJIoSdgc?L5Wan$G6 zgxU-3@ zw)mkM(ZBT~0UI3W2MVs}e0SpMiMh`42`A=DJ(UAXyv^B+60LWzoLI9Z$o0Y@cbSh9 zc%R%`I>-l=4x64VW-Zb!3P_9CKz`ND9PZttKK<~)oO`Zv6Z6!JDHw0KlDc%2m@1z~ z!Dz>{raU;beezi={g^4~Vg2J=Cmanr5S?SQUD%5A8c?2Nh<;*~LVX1;n5W3#QIJKb zJET!?>9x~{)p?C;wy?3Bo2Ns<)ar3&d`sOcHLk0t8*?X-Oj#iuM6+3|pfS=!INY}anKC!G2d zV$HLy8v-!B8Jw@x075r)uS>XGwpzD*^A_ZtI<&?#CQiJ_24CIxy{xt!MB{QX*Soq~ zrH8Xy-_dlyH`BT6N5PQnotCN7-NqL6o|G4@r(O6t&J^m)hh=y!Aa9|oD9)#?qRHM9 z{WOVzvC!bv+TBfByPo=ANvt!W)Jprs7J>7mOXsWM34BcG>gTVNU6kMCz5r-8`yaf5 zB#x!piN>byUhL@SWu|$GbDZ|PcUM|bFYV#g-NjNCI;$(TdL0n24fr&k1e-dawf*QeATq3RBVTa zD&mhDdbbRLPig|iyr#zw(I1L=b5^6JGlyM49Y$7J93 zFUI@>Tx_0Q7TK83ng8vSJh4+Hw1@>c zI8YiT=tugk9qql$24VKJVvioaGoR!j*m!SFVn3cba#8G;g595W-jan{aMTW%hnUX0 z1&TN-xYdN8U74{jc~I{CRa3=AjiR1|G%siaW zOvSK8#2Hf~4D!;1TX54Y;{lgUFXZlSI}&5u9ymf)yi0w#p*!`xYuznIGs( zfB7Ies1x_lS5`ohCsZ-u#pS_6lTtesczl+ii`D0)*X%hZtD3y^DA`zM)>CG z_glkTc%(cfd}4FM5e?QC+HaK4$5B#A6XiNuP4S?8NBm>z}I`3HZr+o6~nXxnR0O zLRekf^sgVsXrp^ihrRXib%`M z!CP$Ou*&pjJ6XOHkeiVc1D$f3IpUs4cIv+cf?kJ`E4|;b8e6J<>v^>XJ@;+C%?8ii zKQ;DjdLN!|Q?Qz4X*IrGSBO33oHSlWzq<+0NY8cJouH*CzPw&$**pxO+ACHi=(F7d zPMgtuK3tPt!E%HQQU$x{vnz$*4f;*_Hg-;>&**P~I>buwbHIiFPX(b8a4LSs-haLz zIwdLeuKIGiFI&A!ECG?oKz6jI1A;%Z^iju_%eNiZDr~AYVw$!XD}*kw=G5GvF?daf+Pi*k;F=Hnu z>5eZ?%8J|LqKrun1dq&G$3N%=WnS2z*;*1Wj_s9c9P*H9;nm!il26T#7|5P8!7)XA zVcAqf5QlduPZ-7 zhFhu}*WnABvQ$p1Ek0zNUi>X}9vx=H=IJY@5c5Lq7x94pGtv-TV;0L#qwKZ?U+eF64+KP8qgQdf%G|7r6Rtz1-*aQvYE*&B6VPO87HY|96;yd%5!aV6ok zaGc;|#%3gQA~aJ?fYtKv;c`I=R74>-*da-9F+T0dr5JvWI;0F*58N)YeUzT#a%v-( z#9YBq_@idiR%(IAJZ^cEwDlwb}P?nkJPmuA0=x#MXpABhAT(UXcf z3m4xii|Uan8Fhf&2;==lKsEiLXQjrLUnP~!u#SS-B7RU_ZLn=k_xk^1{p}g{x1*I) zOBvr&UYnjZxmRi(R)Z@CBpz%|#~Iv@=fgJsSuap91lM~jYCAuA`ys7OL6M*hU56{I z1u^6bv!;Wq*?2Z92A(WtfgC#02+-vg`mnC$p3zmL)2E)IjWjHW8n#z3=`dH}%3lV? zf*4LEn0iNgPS$}Mu}MlpC;?23^B=}JiEy0TA2@E|K3p(}tJ9nUBwjuyXM#5=g9^@eCibs}|r_FZJ$G@9ZdI=L(e)fGiDr+|BGU;RkBq zL?RmQEf6eN5ozBZiZSFpUD7&Eh@YQk+U6HpTJ%UhTqK*P;%GK`^W=8^>@j)ycIqY5 zRw&nNRmdU-JXhgCzpgEtHDbooW4H2V1XYuvx^yz~b}XIRo00v^t~g-X;MtT+jE0F? zxSati-mh0|A8#hLC9x~FBZ|38v7p#mCd1+B`>xqZrAYBXp;wUG+j)}xTpx6IdzSY~ z_x%z+n}QK7$8^1&F%<&+p6_TIYTBXCVNG*r)wr8op5ZCd!0ABm7vL)%8?b+ah&Tx3+M=YIkWigxOV0 zJ9l{qqiMp4(LW;0_9OlV{fuLLwc8flGr@r-Cl&ag`H;+g+kfBW6e#mHr1a8#g}{cc zUVU2#u?9c4)V5Uh(}@<+Ah+GoP|>hAyI3u81ZT{I%rsp%R>20kZ=W#FZ|MW)mM?Ew zd;Q3$5v7H3bla!1`VugWH-TQiro# zqc$I})e0vqRcwa*Y6|{0;}aBIs(4G|aD6xwIwiG5ckCst4)BRtpa7gq`{+72OYoKk zRxTuuV2{Zk_SA;VUAUGk$MI(&_L~eXU~%zKvo%~qSNtIMghux>Xv>-6S!UdS(s;q) zo20VmuIN87ASvPWf;T$&Nx5&5jLDFq-Z>5fu{iC#LS2$ zs^|fm=zjr%mNUjT>C<9cd6IzFC3cRxCU$|M+D5xk#n;_>r3x;`b{XzKxJR^x$)bKBPwON^8{(5{ zM);!g;0u>kCrFH6s0nI4e%egY4;j|wS9abM&WM+F5@0D+3 z6C$D_$WNdS3#hoF`0s7bb6(2W7MgMbeb&;&k#irr|qN0PpKSdX3 zx6e+*`4q<-&?~4FIcJ^*d8Na8eSn96z|n&Y+q;fGr4}hs&Mm$&k+Ibg*HOir4#y2{ zmW6jkXFV3oN7nY5&o8`de84p4i7pxlwrZ*|0@DnhF!Y+;6S!GbgwX!(1?cdTt%R z!2u7jMbJ~+=A_gn_Z5Xz+;Z5FTx!G`_Mye5U*{MoMEmWCf*2={^C$YpA7reL?x#9F z^?bS(aPCWEpx~DAhHzB;LF}>2WCQ4riw?)_c9% z)u%y_^ly5SZF`w%~yZ=X!svjR_i zLJGK>(@xZPb>7Q!b!A*6uO*hD1|JAa0@F-wT>ZL&pZR#k9_)tS+W5T8)4LX3HMsUg zM^2>lzVHXxH(5OkQfphMeLj?AN?fs^pz)KFw*J6w71@%d4)+Q&Q8Ygsyu1Y+@b`Z< zRV)X^K3tq?4^m*ya_>}O*m)cN|3)Ic>DQ$k{Svduq7G5UHRbv!#Axl|J3-qQ8y_7e z?n32fa!rVn>*Y5XUIEV?|Lo(UY^sFK$-eioD$a``dyNRHNY~*%9T`Zp`NXBdOnO+yx+;Zm3PDb87^##%8zz z$E=oe26?Z z0G04}t(PvAsvTY`Z=6zC?$oOb`t!8=05=?6A09RM4&YA1{HCn!DH7~BFNX1r>X0RD zH}QU1FdnmFg2lxV3rtcUy&#av$4sw@Lp{LT?<3e(mEJpKEneL*JQa3ubRewmz(6KT zN$ef88Ep3vdo=aPL8uGtpzLs;9}G{7N8KCNqRtiq>W z@-{+&qVyd4uY5dH;(9-JV=()asE|U;-WNR=04`AMTmQ^t+Z-+yYB+6FE91xfHw9p& zn-3nPmg@WUJiNze1g%luj3zofqMAc5jMX3n=YwH(!^kPvGOA?5Ck8 zJE|ml^OaNPGEdM6g%Uu+z2X(hb*A(`Q_%n6Cx0{5Q)xRX0?xv2@sApBbRwu+>oU!7 z7SYA&FR$A)Cw?zm;yyo=@%-hWAfD#H0i^*AbQ-=}a}wu(JaO^Lcf5u7Xl;*ulRU|7 z#>x>HRwhk)d~6^Sgr~k`=3gtucdtJ5R-DA8z9f4^lyH9efsoC#){wlqkKWx?r+p)T zU!Or3uP2AN{p4^t`_Y==AO!=HLEvx{?x7TRNd!|F7o>e*U~zwJ81EZC5l?(v)t64$~v>! zud=8o^hyRb?|0;%oQ{-B5DGO@()o(I0EuiHT42n8SG$}oc^#X}_(JjtEBu_8J^#oI2+q5HsaO{JsmIC=WpTQl}gZvOPrjO0}9$F9?(f}$< zKf9yB;rM8gm>eWUM-FpGv2Xu_M$?_IEn>dF*N|~ ztxk{X^Y~jcG_9R8ot5?{8TbkvtFWI^Zh3)yf1&ADXKP~?AJEWAp1b|VN%wh;@17ZA zp(e?p41TmmU4~!ZGy3q>@+mze3h=T%Qt|4Jc$`cpAtD25CW2|tTSq<~7B_k)7=Fki zFx@MtSEV6#wcK$k?)td2kiqoTANFW+QnFz?DM|#6*dh+KpyZjn2feNKf5V+hDtpO? zjM?=9SmI>$q!;f%WM`)yv|LIJ#?Q}5<2xlQp2&Jwnz2l|i!>vire>H-i#cM$M{f1( zEqB^KxwFQ(#Ho<_*(=Wji#n;i>0+k(-*|(lp&tT0;x|tT?c>ThKhWQ;F>YHBKe2j) ze3RW59=;Ervss%qj(mw5inwQXmqi9zJz4+;iFlqE6bb%rR(;n;@(;Uk!K+xA(z!6b z4EFCn7(0x;NAaV!F~A=sZQ~^_R2QJ#bFze7BAqq4_XrU1ag)J3EXMKEh(w>G_9PE_Gwa7WWVM~bJIsYB)EUE*bX)8(5I1+5 z3a)-{_$8C_NA7*!IIK}zVEo@48vhZ=d`twisPfm@RI~kMbDtL7t;8+ha6GJr-vJ(uI5-yoM@~^E? zYL*U*oeT^f;)JniO{Ci4@eEs+ZuTn>IfaG(OjmAt7hm+q=Xu&at4M{z_1}g*8{A3X zMRt=*+ohp7Ut+#QEmbGmf1y!|N-Xjc`#t8t%SPQGSV%gl(2jw#@4j(zKA9h{PFHgK z!d^yalWtoM1@h1~-ikZ`PeX0t>kI2myCpl2bD5rhEib>v$FE56Qq@V8{NfMQE{bc+ zY#C-&S&04$9z3Sb4*#5L()?|xd~9N}v;6H1eBl5eiRMX(N8hY#pvMS>rGQJgLl&&R@&qb`B+fPs>J?J~KBx}1duXC$Wb=2`#Zi^f|}-kT*m z5go+{kDD{!GeS%JEt2ba2%DV1$l4u*@YG{sWLNCx4$)lOD)j<8AVA#aZOmybEN*2w z`@8*Js2l2vb*0AjhY9BcO0tR5e_Kg=@b4=f3N5MpWqw#KxbX_xj5`=6JU)>WZVsUD zPKVRRcJSD3`5H;dYtZSyhbHvx^3zE-UAUTOE89-0o*~m-(r2QCUz>jO%{)+8ESgM_ zn(5^zO{WVEu=j6DVW2N?AJX>U-)WpCJ*^iPyc>attCy;>WdUy*PTKgpeOxM?oN9QC zC3Nbl+gx|Z?>ssvBP@ef4aGuuWZu|y!eK+ZId>}oxd!nr4o(M8*f#3(%PlrfE_G%o zzy@BHM^4GF_h+Q@p~Sbkz9-uhYH+vwj7^Sd&v4?~)OHl1oe~|eb`f#&t&sKZ>5x|m zKOatA$Y&(|tVt&wtP}-!h#f}uG?W~E*(TSEcsN)r%3`5`6jdSxJ@Q@~1l#90K7ihksPwx8c zb}eU3MD_5NlS#M7UcYs+y9*8#n31>4;@J|qvAglzL+`?C85Ja70B#E`SZ5_MlvM-AsO-%LKSu1%k{rTp6L^pdnbbwkRq)OO}WD=L;rWP*#GvgOExc2vSUFA})THcXjeh6t`hy@ZuRa zamZuc|KB77b+@`3bxt6*aK! zO@!uEzNMGxOr3z&^BmHuMWvQwEO2#%g7Jir2*0>V1+~BAj8Q9a+ID7K>1fy$C3*vP z;ORPLvQw51ksKfn$^S=KIrRAR`F1; z`a#43KBM0%15;SLVQd4gvcLNjVW10>g!Svz6D0b7?`?a>29FUb7ITgwOsm^2H-Am1#EDlfbBIBTXQB`A<;7Wk2AAC7f-b24yDuei%tul z-IKwX|4lM|IQUAmkw^n|nsb1db8fqELA9NTs5SUI3+I#ky43M$mM!Ni=;D}A=(q}& zXyAh)kihUD4z@0P-8O)zyc#}Yg#qPqW`(CjWiE{3kKmWK>Mu6o#O*&O75;D!7)5F# zJt^t?3x{HBJ42LRFoFgm@@NC@KvhAiqwC})g4y>hnzgq!_lBqUbMweb2X^S%Vh@ao zN-I)rh9kVVz3&km*!`JPjP^IU$o6^uX350#TZ}-2Xn?8v;@cq_Qt(}DCgAVOpNcwu z;FZ3!K6@yr4}3#eqgIY@-NVX^8R~}U*5D~lgkfO{Y*UIo=VV0&8j8Xs2#~0rb43$` zKo~IF1mXJYcY46NRSjq5y;`kWe1z0m@}mA$wFH_fP+|+pQpiy_m%nHEE*JkZx)Qqg zSV(Gl(x`1?^J$+lFJf>n@2qQd{8LuRwkfX3%`dzBew9m5GpuMnJ7!u2S0b75{EJh- zxS6j(Cllz>NvOCI4jpIgNk*r{Zy-`>j}1?E#kQ#4!}xJjU+5w|4X@-b8JAAb`}o_) zZr;w<44||nh&e0Y6UhzmB{bLailY&wCVLd`aB#1~VMMp5*|F^mRRmEv(x5&_|5-M2 z&zlsR<@@R_=0Y#GZR1yS5P63w347JO^fpehLD8{hoDIF#|2T4Uu_*?N=ea%PrNzo@ zLub+Q^~Tc0@{oC!MZ2HFeAwbWUEUqa+3+Zf|eAg>T4O zn=4vh->G5vqT+vW8K~ACT4bvISx3_kuPCEUDrvZ^$1W=h>@M`c$)9MAaW{LI(nrT} zuQ`cS+Up|Ucgg6nsunZ0Oly(PyIPwhjPPb$wX(>y>sR!3O0yG<58iKW&&$midNmYo zbXx@o`l4Zb**WMOrk|nBoHn)YSl!z|fRi~^@e1F<{P%}88HsGWWunW=3o!S{v)7(a znX^v2iv)Q%GaUys$uj3VmG{Z!df1o+b*3`C$ZB_w<2)~^bcQGB4_D`f=I?qX)dLRV zn-))1g%xeR*)#Fy%@A`1{JY5z5vlg0??lA@K_L>AfS>~J&ALeltU3!Lgy$z#r!(k3 zpZ`=Br{|}&n>w12lC+GUYW!)Y4IJfF*ZaVu?JjC6Pt`5^G#9RYM9GvPAzB8u!xX1Fh-A{DX`(usX#Z9 zsl9an;!)jK8;|@NQJFO4szG1DkL8aFgR;weiI+0oJcT-?_kIctn@3Z>eq*tdn+}Mb=IQK) z%)R$D9i2p;6Zv8qkO7h&$LSOC|2eZ;ZtsXOOnRe8FgEH+q2n+4pouR3JjcWVg-^#H zkdMB5 z-h9xr(YfUwJlrrCZ3exEQuJEZL!N8{F7fBFmRK7+c0*xyt)hwwplIDINxvnA z_g&f#Z$(wT!{%hu@^pA38U|UHiCUiTu0kw{F)e__A8TX+yi-3%QFB^V8R)z(bV*Z# z0k07Y9!!2uD}MRcpsPpCR>HV@)h5Go9qE5L?b^(5x%b`PEip`L9|-MVi{I3} zZ`mXWfN7BK*)&$VKEpN5Q^pT7ml1z~x6%E2lSRPF9_j zAtLr~em`Erzp~q$O_b?<*UIUr3k06Jyn>|G`V9h$c9s3L0jB0_g4`mLI)4Ytmq35E zKyPL2;%+qQFio-=k!$hvob{zH?0hjpwMO@vU@(Pi6zBD{?#zhmq@ z*1rH!fOVk}!;{w~jigeE`kG~*dG(6W0LG4{7aq666&rSKYvr`=1I89+pauwSQQUaf zt|+;6wL6iYnGk-H-FY34HYI;&_-R;M&4ace% zPrPn^p+iX4Ig05-al@eeExr&~W`ol1$8nMM1kBw_O6;Q4pkOoYFHegm|D%$sztTAC zobN?RsF(7+7G=VXLcyT-=Xq~RVMojB3LiQ0iV{&yIW8&&fJq_vOo9k0X0&@$#=Gy> zr##mWkkcBc(EV5lt^^+y5UU`kH=~zS=ql(=&dlXIGeHje{}5dL^EIN* z@5hfH+>|cc(b{GUxEvx1pVqBLzrghl^uB)>@O;$BST!LqoA{3=5_MJW2c^o-g8mn? CR)OgN literal 0 HcmV?d00001 diff --git a/belyaeva_ekaterina_lab_7/rus.txt b/belyaeva_ekaterina_lab_7/rus.txt new file mode 100644 index 0000000..abec729 --- /dev/null +++ b/belyaeva_ekaterina_lab_7/rus.txt @@ -0,0 +1 @@ +Помню просторный грязный двор и низкие домики, обнесённые забором. Двор стоял у самой реки, и по вёснам, когда спадала полая вода, он был усеян щепой и ракушками, а иногда и другими, куда более интересными вещами. Так, однажды мы нашли туго набитую письмами сумку, а потом вода принесла и осторожно положила на берег и самого почтальона. Он лежал на спине, закинув руки, как будто заслонясь от солнца, ещё совсем молодой, белокурый, в форменной тужурке с блестящими пуговицами: должно быть, отправляясь в свой последний рейс, почтальон начистил их мелом. \ No newline at end of file