Skip to content

Commit 9be4655

Browse files
committed
Add a story for "Recipes generation".
1 parent 6da015a commit 9be4655

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

assets/recipes_generation.ru.md

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -597,9 +597,10 @@ _<small>➔ вывод:</small>_
597597
> Number of eliminated recipes: 22726
598598
> ```
599599
600-
We lost `22726` recipes during this filtering but now recipes' data is more dense.
600+
Мы потеряли `22726` рецептов после фильтрации, но зато теперь список рецептов стал более однородным (плотным)
601+
с точки зрения количества символов. Позже, каждый рецепт будет "подогнан" по длине к `MAX_RECIPE_LENGTH` путем добавления стоп-символа в конец строки. Фильтрация, которую мы только что сделали, по сути, снизит общее количество стоп-символов и увеличит "полезность" данных при тренировке. Например, `10` стоп-символов в наборе данных из `100` символов (`90%` полезных для тренировки сети данных) может быть лучше для обучения, чем `50` стоп-символов в наборе данных из `100` символов (`50%` полезных для тренировки сети данных).
601602
602-
### Summarizing dataset parameters
603+
### Подытоживаем параметры набора данных
603604
604605
```python
605606
TOTAL_RECIPES_NUM = len(dataset_filtered)
@@ -615,19 +616,19 @@ _<small>➔ вывод:</small>_
615616
> TOTAL_RECIPES_NUM: 100212
616617
> ```
617618
618-
Finally, we ended up with `~100k` recipes. Each recipe has `2000` characters length.
619+
В итоге мы имеем `~100000` рецептов, каждый из которых будет иметь длину в `2000` символов.
619620
620-
## Creating vocabulary
621+
## Создаем словарь
621622
622-
Recurrent neural network doesn't understand characters or words. It understands numbers instead. Therefore, we need to convert recipe texts to numbers.
623+
Рекуррентные нейронные сети не понимают ни символов, ни слов. Вместо этого они понимают числа. Поэтому нам необходимо преобразовать текст рецептов (последовательность символов) в последовательность чисел.
623624
624-
In this experiment we're going to use a **character-level** language model based on multi-layer LSTM (Long Short-Term Memory) network (as opposed to **word-level** language model). It means that instead of creating unique indices for words we will create unique indices for characters. By doing that we let the network predict the next _character_ instead of the next _word_ in a sequence.
625+
В этом эксперименте мы будем использовать модель **символьного уровня** (не словарного уровня), с архитектурой LSTM (Long Short-Term Memory). Это означает, что вместо создания уникальных индексов для слов мы будем создавать уникальные индексы для символов. Таким образом, мы позволяем сети предсказывать индекс следующего _символа_ вместо индекса следующего _слова_ в последовательности.
625626
626-
ℹ️ You may find more details about character-level RNNs explanation in the [Unreasonable Effectiveness of Recurrent Neural Networks](http://karpathy.github.io/2015/05/21/rnn-effectiveness/) article by _Andrej Karpathy_:
627+
ℹ️ Более детально про языковую модель символьного уровня вы можете прочитать в статье [Unreasonable Effectiveness of Recurrent Neural Networks](http://karpathy.github.io/2015/05/21/rnn-effectiveness/).
627628
628-
To create a vocabulary out of recipes texts we will use [tf.keras.preprocessing.text.Tokenizer](https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/text/Tokenizer).
629+
Для создания словаря из текста рецептов мы будем использовать [tf.keras.preprocessing.text.Tokenizer](https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/text/Tokenizer).
629630
630-
We also need to come with some unique character that will be treated as a _stop-character_ and will indicate the end of a recipe. We need it for recipe generation afterwards since without this stop-character we won't know where the end of a recipe that we're generating is.
631+
Нам также необходимо выбрать уникальный символ, который мы будем использовать в качестве _стоп-символа_. Этот стоп-символ будет означать конец текста рецепта. Он нам понадобится во время генерации новых текстов.
631632
632633
```python
633634
STOP_SIGN = '␣'
@@ -639,7 +640,7 @@ tokenizer = tf.keras.preprocessing.text.Tokenizer(
639640
split=''
640641
)
641642
642-
# Stop word is not a part of recipes, but tokenizer must know about it as well.
643+
# Стоп-символ не является частью рецептов, но токенайзер должен знать о нем.
643644
tokenizer.fit_on_texts([STOP_SIGN])
644645
645646
tokenizer.fit_on_texts(dataset_filtered)
@@ -669,7 +670,7 @@ _<small>➔ вывод:</small>_
669670
> 'word_index': '{" ": 1, "e": 2, "a": 3, "t": 4, "o": 5, "n": 6, "i": 7, "r": 8, "s": 9, "l": 10, "d": 11, "h": 12, "c": 13, "u": 14, "p": 15, "\\n": 16, "m": 17, "g": 18, "b": 19, ",": 20, ".": 21, "f": 22, "w": 23, "\\u2022": 24, "k": 25, "1": 26, "v": 27, "y": 28, "2": 29, "/": 30, "\\u25aa": 31, "\\ufe0e": 32, "S": 33, "4": 34, "C": 35, "-": 36, "3": 37, "x": 38, "P": 39, "5": 40, "0": 41, "(": 42, ")": 43, "A": 44, "B": 45, "z": 46, "j": 47, "F": 48, "T": 49, "R": 50, "\\ud83d\\udcd7": 51, "\\ud83e\\udd55": 52, "\\ud83d\\udcdd": 53, "I": 54, "M": 55, ";": 56, "q": 57, "D": 58, "W": 59, "8": 60, "G": 61, "6": 62, "L": 63, "H": 64, ":": 65, "7": 66, "O": 67, "\'": 68, "E": 69, "K": 70, "9": 71, "U": 72, "N": 73, "V": 74, "J": 75, "\\u00ae": 76, "\\u00b0": 77, "\\u00e9": 78, "\\"": 79, "Y": 80, "Q": 81, "*": 82, "!": 83, "Z": 84, "\\u2013": 85, "&": 86, "%": 87, "\\u00f1": 88, "\\u00e8": 89, "\\u2122": 90, "\\u00ee": 91, "X": 92, "?": 93, "\\u00bf": 94, "\\u2014": 95, "\\u00e7": 96, "#": 97, "\\u00bd": 98, "\\u00ed": 99, "=": 100, "\\u2019": 101, "\\u00e2": 102, "\\u00a9": 103, "\\u00bc": 104, "+": 105, ">": 106, "$": 107, "<": 108, "\\u00e1": 109, "\\u00f3": 110, "\\u00fa": 111, "\\u00ef": 112, "\\u00c9": 113, "\\u00fb": 114, "]": 115, "[": 116, "\\u00fc": 117, "\\u00ea": 118, "\\u00e0": 119, "_": 120, "\\u00ad": 121, "\\u00be": 122, "\\u201a": 123, "\\ufffd": 124, "\\u00ba": 125, "\\u2044": 126, "\\u00e4": 127, "\\u00da": 128, "\\u00f9": 129, "\\u0301": 130, "}": 131, "\\u00f6": 132, "{": 133, "\\u00ec": 134, "\\u00f4": 135, "\\u0096": 136, "\\u201d": 137, "\\u00d7": 138, "\\u02da": 139, "\\u00bb": 140, "@": 141, "\\u00a7": 142, "\\\\": 143, "\\u25ca": 144, "\\u2031": 145, "\\u201c": 146, "\\u2027": 147, "\\u202d": 148, "\\u215b": 149, "\\u00e5": 150, "\\ufb02": 151, "`": 152, "\\u00c1": 153, "\\u00eb": 154, "\\u0097": 155, "\\u001a": 156, "\\u00f8": 157, "\\u2153": 158, "|": 159, "\\u01b0": 160, "\\u0092": 161, "\\u00b4": 162, "\\u2012": 163, "\\u00c2": 164, "\\u2423": 165, "\\u00a4": 166, "\\u201f": 167, "\\u00a0": 168, "\\u01a1": 169, "\\u0103": 170, "\\u0300": 171, "\\u215e": 172, "\\u20ac": 173, "~": 174, "\\u0095": 175}'}
670671
> ```
671672
672-
To get a full size of a vocabulary we need to add `+1` to the number of already registered characters because [index `0` is a reserved index that won't be assigned to any word](https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/text/Tokenizer).
673+
Для того, чтобы узнать окончательный размер словаря, нам необходимо добавить `+1` к числу ранее зарегистрированных символов потому что [нулевой индекс зарезервирован токенайзером и не будет присвоен ни одному из символов](https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/text/Tokenizer).
673674
674675
```python
675676
VOCABULARY_SIZE = len(tokenizer.word_counts) + 1
@@ -683,7 +684,7 @@ _<small>➔ вывод:</small>_
683684
> VOCABULARY_SIZE: 176
684685
> ```
685686
686-
Let's play around with tokenizer dictionaries to see how we may convert characters to indices and vice-versa:
687+
Давайте посмотрим, как теперь мы можем конвертировать символы в индексы и индексы в символы с помощью созданного словаря:
687688
688689
```python
689690
print(tokenizer.index_word[5])
@@ -697,7 +698,7 @@ _<small>➔ вывод:</small>_
697698
> ,
698699
> ```
699700
700-
Let's try to convert character to index:
701+
Конвертируем символ в индекс:
701702
702703
```python
703704
tokenizer.word_index['r']
@@ -709,7 +710,7 @@ _<small>➔ вывод:</small>_
709710
> 8
710711
> ```
711712
712-
To illustrate what kind of characters form all the recipes in our dataset we may print all of them as an array:
713+
Список всех символов, образующих весь набор данных с рецептами выглядит так:
713714
714715
```python
715716
array_vocabulary = tokenizer.sequences_to_texts([[word_index] for word_index in range(VOCABULARY_SIZE)])
@@ -722,9 +723,9 @@ _<small>➔ вывод:</small>_
722723
> ['', ' ', 'e', 'a', 't', 'o', 'n', 'i', 'r', 's', 'l', 'd', 'h', 'c', 'u', 'p', '\n', 'm', 'g', 'b', ',', '.', 'f', 'w', '•', 'k', '1', 'v', 'y', '2', '/', '▪', '︎', 'S', '4', 'C', '-', '3', 'x', 'P', '5', '0', '(', ')', 'A', 'B', 'z', 'j', 'F', 'T', 'R', '📗', '🥕', '📝', 'I', 'M', ';', 'q', 'D', 'W', '8', 'G', '6', 'L', 'H', ':', '7', 'O', "'", 'E', 'K', '9', 'U', 'N', 'V', 'J', '®', '°', 'é', '"', 'Y', 'Q', '*', '!', 'Z', '–', '&', '%', 'ñ', 'è', '™', 'î', 'X', '?', '¿', '—', 'ç', '#', '½', 'í', '=', '’', 'â', '©', '¼', '+', '>', '$', '<', 'á', 'ó', 'ú', 'ï', 'É', 'û', ']', '[', 'ü', 'ê', 'à', '_', '\xad', '¾', '‚', '�', 'º', '⁄', 'ä', 'Ú', 'ù', '́', '}', 'ö', '{', 'ì', 'ô', '\x96', '”', '×', '˚', '»', '@', '§', '\\', '◊', '‱', '“', '‧', '\u202d', '⅛', 'å', 'fl', '`', 'Á', 'ë', '\x97', '\x1a', 'ø', '⅓', '|', 'ư', '\x92', '´', '‒', 'Â', '␣', '¤', '‟', '\xa0', 'ơ', 'ă', '̀', '⅞', '€', '~', '\x95']
723724
> ```
724725
725-
These are all the characters our RNN model will work with. It will try to learn how to assemble these characters into sequences that will look like recipes.
726+
Это весь набор символов с которым будет работать нейронная сеть. Она будет учиться собирать эти символы в последовательности, которые в итоге должны быть читабельными и похожи на кулинарные рецепты.
726727
727-
Let's see how we may use `tokenizer` functions to convert text to indices:
728+
Попробуем теперь конвертировать не один символ, а строку в последовательность индексов, используя `tokenizer`:
728729
729730
```python
730731
tokenizer.texts_to_sequences(['📗 yes'])

0 commit comments

Comments
 (0)