diff --git a/data/text/tz_01.docx b/data/text/tz_01.docx new file mode 100644 index 0000000..5d4350b Binary files /dev/null and b/data/text/tz_01.docx differ diff --git a/data/text/tz_02.docx b/data/text/tz_02.docx new file mode 100644 index 0000000..814423e Binary files /dev/null and b/data/text/tz_02.docx differ diff --git a/data/text/tz_03.docx b/data/text/tz_03.docx new file mode 100644 index 0000000..405a457 Binary files /dev/null and b/data/text/tz_03.docx differ diff --git a/data/text/tz_04.docx b/data/text/tz_04.docx new file mode 100644 index 0000000..8c3ce8e Binary files /dev/null and b/data/text/tz_04.docx differ diff --git a/data/text/tz_05.docx b/data/text/tz_05.docx new file mode 100644 index 0000000..b1883a9 Binary files /dev/null and b/data/text/tz_05.docx differ diff --git a/data/text/tz_06.docx b/data/text/tz_06.docx new file mode 100644 index 0000000..084cc18 Binary files /dev/null and b/data/text/tz_06.docx differ diff --git a/data/text/tz_07.docx b/data/text/tz_07.docx new file mode 100644 index 0000000..1fe727c Binary files /dev/null and b/data/text/tz_07.docx differ diff --git a/data/text/tz_08.docx b/data/text/tz_08.docx new file mode 100644 index 0000000..916363f Binary files /dev/null and b/data/text/tz_08.docx differ diff --git a/data/text/tz_09.docx b/data/text/tz_09.docx new file mode 100644 index 0000000..4e8ef8f Binary files /dev/null and b/data/text/tz_09.docx differ diff --git a/data/text/tz_10.docx b/data/text/tz_10.docx new file mode 100644 index 0000000..a848c3b Binary files /dev/null and b/data/text/tz_10.docx differ diff --git a/data/text/tz_11.docx b/data/text/tz_11.docx new file mode 100644 index 0000000..3183371 Binary files /dev/null and b/data/text/tz_11.docx differ diff --git a/data/text/tz_12.docx b/data/text/tz_12.docx new file mode 100644 index 0000000..6b89070 Binary files /dev/null and b/data/text/tz_12.docx differ diff --git a/data/text/tz_13.docx b/data/text/tz_13.docx new file mode 100644 index 0000000..ce9cfa0 Binary files /dev/null and b/data/text/tz_13.docx differ diff --git a/data/text/tz_14.docx b/data/text/tz_14.docx new file mode 100644 index 0000000..39218f3 Binary files /dev/null and b/data/text/tz_14.docx differ diff --git a/data/text/tz_15.docx b/data/text/tz_15.docx new file mode 100644 index 0000000..9cda9f7 Binary files /dev/null and b/data/text/tz_15.docx differ diff --git a/data/text/tz_16.docx b/data/text/tz_16.docx new file mode 100644 index 0000000..8c6d63b Binary files /dev/null and b/data/text/tz_16.docx differ diff --git a/data/text/tz_17.docx b/data/text/tz_17.docx new file mode 100644 index 0000000..93239f9 Binary files /dev/null and b/data/text/tz_17.docx differ diff --git a/data/text/tz_18.docx b/data/text/tz_18.docx new file mode 100644 index 0000000..6f69a2b Binary files /dev/null and b/data/text/tz_18.docx differ diff --git a/data/text/tz_19.docx b/data/text/tz_19.docx new file mode 100644 index 0000000..ea6e0ce Binary files /dev/null and b/data/text/tz_19.docx differ diff --git a/data/text/tz_20.docx b/data/text/tz_20.docx new file mode 100644 index 0000000..2332fff Binary files /dev/null and b/data/text/tz_20.docx differ diff --git a/data/text/Архитектура, управляемая модель.docx b/data/text/Архитектура, управляемая модель.docx new file mode 100644 index 0000000..067ff84 Binary files /dev/null and b/data/text/Архитектура, управляемая модель.docx differ diff --git a/data/text/Введение в проектирование ИС.docx b/data/text/Введение в проектирование ИС.docx new file mode 100644 index 0000000..c7809e8 Binary files /dev/null and b/data/text/Введение в проектирование ИС.docx differ diff --git a/data/text/Встроенные операторы SQL.docx b/data/text/Встроенные операторы SQL.docx new file mode 100644 index 0000000..fc41152 Binary files /dev/null and b/data/text/Встроенные операторы SQL.docx differ diff --git a/data/text/Методологии разработки программного обеспечения 2.docx b/data/text/Методологии разработки программного обеспечения 2.docx new file mode 100644 index 0000000..aed6814 Binary files /dev/null and b/data/text/Методологии разработки программного обеспечения 2.docx differ diff --git a/data/text/Методологии разработки программного обеспечения.docx b/data/text/Методологии разработки программного обеспечения.docx new file mode 100644 index 0000000..46334b9 Binary files /dev/null and b/data/text/Методологии разработки программного обеспечения.docx differ diff --git a/data/text/Методы композиции и декомпозиции.docx b/data/text/Методы композиции и декомпозиции.docx new file mode 100644 index 0000000..ffde52b Binary files /dev/null and b/data/text/Методы композиции и декомпозиции.docx differ diff --git a/data/text/Модели представления данных в СУБД.docx b/data/text/Модели представления данных в СУБД.docx new file mode 100644 index 0000000..05e88f6 Binary files /dev/null and b/data/text/Модели представления данных в СУБД.docx differ diff --git a/data/text/Некоторые особенности проектирования.docx b/data/text/Некоторые особенности проектирования.docx new file mode 100644 index 0000000..801052f Binary files /dev/null and b/data/text/Некоторые особенности проектирования.docx differ diff --git a/data/text/Непроцедурный доступ к данным.docx b/data/text/Непроцедурный доступ к данным.docx new file mode 100644 index 0000000..6637741 Binary files /dev/null and b/data/text/Непроцедурный доступ к данным.docx differ diff --git a/data/text/Процедурное расширение языка SQL.docx b/data/text/Процедурное расширение языка SQL.docx new file mode 100644 index 0000000..7f112fc Binary files /dev/null and b/data/text/Процедурное расширение языка SQL.docx differ diff --git a/data/text/Системные объекты базы данных.docx b/data/text/Системные объекты базы данных.docx new file mode 100644 index 0000000..2fa2bb6 Binary files /dev/null and b/data/text/Системные объекты базы данных.docx differ diff --git a/data/text/Технология создания распр ИС.docx b/data/text/Технология создания распр ИС.docx new file mode 100644 index 0000000..1d877b8 Binary files /dev/null and b/data/text/Технология создания распр ИС.docx differ diff --git a/data/text/Требования к проекту.docx b/data/text/Требования к проекту.docx new file mode 100644 index 0000000..46db0fa Binary files /dev/null and b/data/text/Требования к проекту.docx differ diff --git a/data/text/Условия целостности БД.docx b/data/text/Условия целостности БД.docx new file mode 100644 index 0000000..12fc26e Binary files /dev/null and b/data/text/Условия целостности БД.docx differ diff --git a/data/text/Характеристики СУБД.docx b/data/text/Характеристики СУБД.docx new file mode 100644 index 0000000..79d84cb Binary files /dev/null and b/data/text/Характеристики СУБД.docx differ diff --git a/data/text/Этапы разработки проекта1.docx b/data/text/Этапы разработки проекта1.docx new file mode 100644 index 0000000..3037fc7 Binary files /dev/null and b/data/text/Этапы разработки проекта1.docx differ diff --git a/data/text/Этапы разработки проекта2.docx b/data/text/Этапы разработки проекта2.docx new file mode 100644 index 0000000..562cd2e Binary files /dev/null and b/data/text/Этапы разработки проекта2.docx differ diff --git a/data/text/Этапы разработки проекта3.docx b/data/text/Этапы разработки проекта3.docx new file mode 100644 index 0000000..5040183 Binary files /dev/null and b/data/text/Этапы разработки проекта3.docx differ diff --git a/data/text/Этапы разработки проекта4.docx b/data/text/Этапы разработки проекта4.docx new file mode 100644 index 0000000..10c1548 Binary files /dev/null and b/data/text/Этапы разработки проекта4.docx differ diff --git a/data/text/Этапы разработки проекта5.docx b/data/text/Этапы разработки проекта5.docx new file mode 100644 index 0000000..ef67763 Binary files /dev/null and b/data/text/Этапы разработки проекта5.docx differ diff --git a/data/text/Язык манипуляции данными.docx b/data/text/Язык манипуляции данными.docx new file mode 100644 index 0000000..d58c7e0 Binary files /dev/null and b/data/text/Язык манипуляции данными.docx differ diff --git a/lec4-1-preprocessing.ipynb b/lec4-1-preprocessing.ipynb new file mode 100644 index 0000000..bbbcc42 --- /dev/null +++ b/lec4-1-preprocessing.ipynb @@ -0,0 +1,2243 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "b41133f5", + "metadata": {}, + "outputs": [], + "source": [ + "import spacy\n", + "\n", + "sp = spacy.load(\"ru_core_news_lg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e13d53ef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Index: 41 entries, 0 to 40\n", + "Data columns (total 3 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 doc 41 non-null object\n", + " 1 text 41 non-null object\n", + " 2 type 41 non-null int64 \n", + "dtypes: int64(1), object(2)\n", + "memory usage: 1.3+ KB\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
doctexttype
16tz_01.docx2.2 Техническое задание\\n2.2.1 Общие сведения\\...0
19tz_02.docx2.2 Техническое задание\\n2.2.1 Общие сведения\\...0
28tz_03.docx2.2. Техническое задание\\nОбщие сведения:\\nВ д...0
35tz_04.docxТехническое задание\\n2.2.1 Общие сведения\\nИнт...0
38tz_05.docx2.2 Техническое задание\\n2.2.1 Общие сведения....0
\n", + "
" + ], + "text/plain": [ + " doc text type\n", + "16 tz_01.docx 2.2 Техническое задание\\n2.2.1 Общие сведения\\... 0\n", + "19 tz_02.docx 2.2 Техническое задание\\n2.2.1 Общие сведения\\... 0\n", + "28 tz_03.docx 2.2. Техническое задание\\nОбщие сведения:\\nВ д... 0\n", + "35 tz_04.docx Техническое задание\\n2.2.1 Общие сведения\\nИнт... 0\n", + "38 tz_05.docx 2.2 Техническое задание\\n2.2.1 Общие сведения.... 0" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
doctexttype
25Этапы разработки проекта2.docxЭтапы разработки проекта: заключительные стади...1
21Этапы разработки проекта3.docxЭтапы разработки проекта: определение стратеги...1
40Этапы разработки проекта4.docxЭтапы разработки проекта: реализация, тестиров...1
30Этапы разработки проекта5.docxЭтапы разработки проекта: стратегия и анализ\\n...1
22Язык манипуляции данными.docx2.1.3. Язык манипуляции данными (ЯМД)\\nЯзык ма...1
\n", + "
" + ], + "text/plain": [ + " doc \\\n", + "25 Этапы разработки проекта2.docx \n", + "21 Этапы разработки проекта3.docx \n", + "40 Этапы разработки проекта4.docx \n", + "30 Этапы разработки проекта5.docx \n", + "22 Язык манипуляции данными.docx \n", + "\n", + " text type \n", + "25 Этапы разработки проекта: заключительные стади... 1 \n", + "21 Этапы разработки проекта: определение стратеги... 1 \n", + "40 Этапы разработки проекта: реализация, тестиров... 1 \n", + "30 Этапы разработки проекта: стратегия и анализ\\n... 1 \n", + "22 2.1.3. Язык манипуляции данными (ЯМД)\\nЯзык ма... 1 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "from docx import Document\n", + "import os\n", + "\n", + "\n", + "def read_docx(file_path):\n", + " doc = Document(file_path)\n", + " full_text = []\n", + " for paragraph in doc.paragraphs:\n", + " full_text.append(paragraph.text)\n", + " return \"\\n\".join(full_text)\n", + "\n", + "\n", + "def load_docs(dataset_path):\n", + " df = pd.DataFrame(columns=[\"doc\", \"text\"])\n", + " for file_path in os.listdir(dataset_path):\n", + " if file_path.startswith(\"~$\"):\n", + " continue\n", + " text = read_docx(dataset_path + file_path)\n", + " df.loc[len(df.index)] = [file_path, text]\n", + " return df\n", + "\n", + "\n", + "df = load_docs(\"data/text/\")\n", + "df[\"type\"] = df.apply(lambda row: 0 if str(row[\"doc\"]).startswith(\"tz_\") else 1, axis=1)\n", + "df.info()\n", + "df.sort_values(by=[\"doc\"], inplace=True)\n", + "\n", + "display(df.head(), df.tail())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e1f47641", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
doctexttypeprep_text
16tz_01.docx2.2 Техническое задание\\n2.2.1 Общие сведения\\...0[[2.2, технический, задание, 2.2.1, общий, све...
19tz_02.docx2.2 Техническое задание\\n2.2.1 Общие сведения\\...0[[2.2, технический, задание, 2.2.1, общий, све...
28tz_03.docx2.2. Техническое задание\\nОбщие сведения:\\nВ д...0[[2.2], [технический, задание, общий, сведение...
35tz_04.docxТехническое задание\\n2.2.1 Общие сведения\\nИнт...0[[технический, задание, 2.2.1, общий, сведение...
38tz_05.docx2.2 Техническое задание\\n2.2.1 Общие сведения....0[[2.2, технический, задание, 2.2.1, общий, све...
2tz_06.docx2.2 Техническое задание\\t\\n1.Общие сведения\\nП...0[[2.2, технический, задание, 1.общие, сведение...
4tz_07.docxТехническое задание\\nОбщие сведения\\nВ данном ...0[[технический, задание, общий, сведение, разде...
33tz_08.docxТехническое задание\\n1 Общие сведения\\n1.1 Пол...0[[технический, задание, 1, общий, сведение, 1....
39tz_09.docx2.2. Техническое задание\\n2.2.1.\\n\\nОбщие свед...0[[2.2], [технический, задание, 2.2.1, общий, с...
1tz_10.docx2.2. Техническое задание\\n2.2.1. Общие сведени...0[[2.2], [технический, задание, 2.2.1], [общий,...
5tz_11.docx2.2.\\tТехническое задание\\n2.2.1.\\tОбщие сведе...0[[2.2], [технический, задание, 2.2.1, общий, с...
36tz_12.docx2.2\\tТехническое задание\\n2.2.1\\tОбщие сведени...0[[2.2, технический, задание, 2.2.1, общий, све...
37tz_13.docx2.2. Техническое задание\\n2.2.1. Общие сведени...0[[2.2], [технический, задание, 2.2.1], [общий,...
20tz_14.docxТехническое задание\\nРассмотрев общие требован...0[[технический, задание, рассмотрев, общий, тре...
27tz_15.docxТехническое задание\\n2.2.1. Общие сведения\\nПо...0[[технический, задание, 2.2.1], [общий, сведен...
9tz_16.docx2.2\\tТехническое задание\\n2.2.1\\tОбщие сведени...0[[2.2, технический, задание, 2.2.1, общий, све...
18tz_17.docx2.2 Техническое задание.\\n2.2.1 Общие сведения...0[[2.2, технический, задание], [2.2.1, общий, с...
23tz_18.docx2.2. Техническое задание\\nОбщие сведения:\\nПол...0[[2.2], [технический, задание, общий, сведение...
24tz_19.docx2.2. Техническое задание\\n2.2.1. Наименование ...0[[2.2], [технический, задание, 2.2.1], [наимен...
10tz_20.docx2.2. Техническое задание\\n2.2.1. Общие сведени...0[[2.2], [технический, задание, 2.2.1], [общий,...
32Архитектура, управляемая модель.docxАрхитектура, управляемая модель\\nАббревиатура ...1[[архитектура, управляемая, модель, аббревиату...
15Введение в проектирование ИС.docx1. ВВЕДЕНИЕ В ПРОЕКТИРОВАНИЕ ИНФОРМАЦИОННЫХ СИ...1[[1], [введение, проектирование, информационны...
0Встроенные операторы SQL.docxВстроенные операторы SQL. \\nКак было отмечено ...1[[встроенные, оператор, sql], [отметить, sql, ...
8Методологии разработки программного обеспечени...Методологии разработки программного обеспечени...1[[методология, разработка, программный_обеспеч...
26Методологии разработки программного обеспечени...Методологии разработки программного обеспечени...1[[методология, разработка, программный, обеспе...
14Методы композиции и декомпозиции.docxМетоды композиции и декомпозиции исполняемых U...1[[метод, композиция_декомпозиция, исполнять, u...
29Модели представления данных в СУБД.docx2.3.1. Исследование моделей информационного пр...1[[2.3.1], [исследование, модель, информационны...
3Некоторые особенности проектирования.docxНекоторые особенности проектирования под конкр...1[[особенность, проектирование, конкретный, арх...
31Непроцедурный доступ к данным.docx2.3.2.3 Непроцедурный доступ к данным (SQL).\\n...1[[2.3.2.3, непроцедурный, доступ, данным, sql]...
34Процедурное расширение языка SQL.docxПроцедурное расширение языка SQL - PL/SQL.\\nOr...1[[процедурный, расширение, язык, sql, pl_sql, ...
12Системные объекты базы данных.docxСистемные объекты базы данных.\\nСловарь данных...1[[системный, объект, база], [словарь], [первый...
7Технология создания распр ИС.docx2. ТЕХНОЛОГИИ СОЗДАНИЯ РАСПРЕДЕЛЕННЫХ ИНФОРМАЦ...1[[2], [технологии, создания, распределенных, и...
13Требования к проекту.docxТребования к проекту\\nВведение\\nОтносительно с...1[[требование, проект, введение, относительно, ...
17Условия целостности БД.docx2.1.1.3.1. Ограничительные условия, поддержива...1[[2.1.1.3.1], [ограничительный, условие, подде...
6Характеристики СУБД.docx2.2.2 Сравнительные характеристики SQL СУБД.\\n...1[[2.2.2, сравнительные, характеристика, sql, с...
11Этапы разработки проекта1.docxЭтапы разработки проекта: заключительные стади...1[[этап, разработка, проект, заключительный, ст...
25Этапы разработки проекта2.docxЭтапы разработки проекта: заключительные стади...1[[этап, разработка, проект, заключительный, ст...
21Этапы разработки проекта3.docxЭтапы разработки проекта: определение стратеги...1[[этап, разработка, проект, определение, страт...
40Этапы разработки проекта4.docxЭтапы разработки проекта: реализация, тестиров...1[[этап_разработка, проект, реализация, тестиро...
30Этапы разработки проекта5.docxЭтапы разработки проекта: стратегия и анализ\\n...1[[этап, разработка_проект, стратегия, анализ, ...
22Язык манипуляции данными.docx2.1.3. Язык манипуляции данными (ЯМД)\\nЯзык ма...1[[2.1.3], [язык, манипуляция, данными, ямд, яз...
\n", + "
" + ], + "text/plain": [ + " doc \\\n", + "16 tz_01.docx \n", + "19 tz_02.docx \n", + "28 tz_03.docx \n", + "35 tz_04.docx \n", + "38 tz_05.docx \n", + "2 tz_06.docx \n", + "4 tz_07.docx \n", + "33 tz_08.docx \n", + "39 tz_09.docx \n", + "1 tz_10.docx \n", + "5 tz_11.docx \n", + "36 tz_12.docx \n", + "37 tz_13.docx \n", + "20 tz_14.docx \n", + "27 tz_15.docx \n", + "9 tz_16.docx \n", + "18 tz_17.docx \n", + "23 tz_18.docx \n", + "24 tz_19.docx \n", + "10 tz_20.docx \n", + "32 Архитектура, управляемая модель.docx \n", + "15 Введение в проектирование ИС.docx \n", + "0 Встроенные операторы SQL.docx \n", + "8 Методологии разработки программного обеспечени... \n", + "26 Методологии разработки программного обеспечени... \n", + "14 Методы композиции и декомпозиции.docx \n", + "29 Модели представления данных в СУБД.docx \n", + "3 Некоторые особенности проектирования.docx \n", + "31 Непроцедурный доступ к данным.docx \n", + "34 Процедурное расширение языка SQL.docx \n", + "12 Системные объекты базы данных.docx \n", + "7 Технология создания распр ИС.docx \n", + "13 Требования к проекту.docx \n", + "17 Условия целостности БД.docx \n", + "6 Характеристики СУБД.docx \n", + "11 Этапы разработки проекта1.docx \n", + "25 Этапы разработки проекта2.docx \n", + "21 Этапы разработки проекта3.docx \n", + "40 Этапы разработки проекта4.docx \n", + "30 Этапы разработки проекта5.docx \n", + "22 Язык манипуляции данными.docx \n", + "\n", + " text type \\\n", + "16 2.2 Техническое задание\\n2.2.1 Общие сведения\\... 0 \n", + "19 2.2 Техническое задание\\n2.2.1 Общие сведения\\... 0 \n", + "28 2.2. Техническое задание\\nОбщие сведения:\\nВ д... 0 \n", + "35 Техническое задание\\n2.2.1 Общие сведения\\nИнт... 0 \n", + "38 2.2 Техническое задание\\n2.2.1 Общие сведения.... 0 \n", + "2 2.2 Техническое задание\\t\\n1.Общие сведения\\nП... 0 \n", + "4 Техническое задание\\nОбщие сведения\\nВ данном ... 0 \n", + "33 Техническое задание\\n1 Общие сведения\\n1.1 Пол... 0 \n", + "39 2.2. Техническое задание\\n2.2.1.\\n\\nОбщие свед... 0 \n", + "1 2.2. Техническое задание\\n2.2.1. Общие сведени... 0 \n", + "5 2.2.\\tТехническое задание\\n2.2.1.\\tОбщие сведе... 0 \n", + "36 2.2\\tТехническое задание\\n2.2.1\\tОбщие сведени... 0 \n", + "37 2.2. Техническое задание\\n2.2.1. Общие сведени... 0 \n", + "20 Техническое задание\\nРассмотрев общие требован... 0 \n", + "27 Техническое задание\\n2.2.1. Общие сведения\\nПо... 0 \n", + "9 2.2\\tТехническое задание\\n2.2.1\\tОбщие сведени... 0 \n", + "18 2.2 Техническое задание.\\n2.2.1 Общие сведения... 0 \n", + "23 2.2. Техническое задание\\nОбщие сведения:\\nПол... 0 \n", + "24 2.2. Техническое задание\\n2.2.1. Наименование ... 0 \n", + "10 2.2. Техническое задание\\n2.2.1. Общие сведени... 0 \n", + "32 Архитектура, управляемая модель\\nАббревиатура ... 1 \n", + "15 1. ВВЕДЕНИЕ В ПРОЕКТИРОВАНИЕ ИНФОРМАЦИОННЫХ СИ... 1 \n", + "0 Встроенные операторы SQL. \\nКак было отмечено ... 1 \n", + "8 Методологии разработки программного обеспечени... 1 \n", + "26 Методологии разработки программного обеспечени... 1 \n", + "14 Методы композиции и декомпозиции исполняемых U... 1 \n", + "29 2.3.1. Исследование моделей информационного пр... 1 \n", + "3 Некоторые особенности проектирования под конкр... 1 \n", + "31 2.3.2.3 Непроцедурный доступ к данным (SQL).\\n... 1 \n", + "34 Процедурное расширение языка SQL - PL/SQL.\\nOr... 1 \n", + "12 Системные объекты базы данных.\\nСловарь данных... 1 \n", + "7 2. ТЕХНОЛОГИИ СОЗДАНИЯ РАСПРЕДЕЛЕННЫХ ИНФОРМАЦ... 1 \n", + "13 Требования к проекту\\nВведение\\nОтносительно с... 1 \n", + "17 2.1.1.3.1. Ограничительные условия, поддержива... 1 \n", + "6 2.2.2 Сравнительные характеристики SQL СУБД.\\n... 1 \n", + "11 Этапы разработки проекта: заключительные стади... 1 \n", + "25 Этапы разработки проекта: заключительные стади... 1 \n", + "21 Этапы разработки проекта: определение стратеги... 1 \n", + "40 Этапы разработки проекта: реализация, тестиров... 1 \n", + "30 Этапы разработки проекта: стратегия и анализ\\n... 1 \n", + "22 2.1.3. Язык манипуляции данными (ЯМД)\\nЯзык ма... 1 \n", + "\n", + " prep_text \n", + "16 [[2.2, технический, задание, 2.2.1, общий, све... \n", + "19 [[2.2, технический, задание, 2.2.1, общий, све... \n", + "28 [[2.2], [технический, задание, общий, сведение... \n", + "35 [[технический, задание, 2.2.1, общий, сведение... \n", + "38 [[2.2, технический, задание, 2.2.1, общий, све... \n", + "2 [[2.2, технический, задание, 1.общие, сведение... \n", + "4 [[технический, задание, общий, сведение, разде... \n", + "33 [[технический, задание, 1, общий, сведение, 1.... \n", + "39 [[2.2], [технический, задание, 2.2.1, общий, с... \n", + "1 [[2.2], [технический, задание, 2.2.1], [общий,... \n", + "5 [[2.2], [технический, задание, 2.2.1, общий, с... \n", + "36 [[2.2, технический, задание, 2.2.1, общий, све... \n", + "37 [[2.2], [технический, задание, 2.2.1], [общий,... \n", + "20 [[технический, задание, рассмотрев, общий, тре... \n", + "27 [[технический, задание, 2.2.1], [общий, сведен... \n", + "9 [[2.2, технический, задание, 2.2.1, общий, све... \n", + "18 [[2.2, технический, задание], [2.2.1, общий, с... \n", + "23 [[2.2], [технический, задание, общий, сведение... \n", + "24 [[2.2], [технический, задание, 2.2.1], [наимен... \n", + "10 [[2.2], [технический, задание, 2.2.1], [общий,... \n", + "32 [[архитектура, управляемая, модель, аббревиату... \n", + "15 [[1], [введение, проектирование, информационны... \n", + "0 [[встроенные, оператор, sql], [отметить, sql, ... \n", + "8 [[методология, разработка, программный_обеспеч... \n", + "26 [[методология, разработка, программный, обеспе... \n", + "14 [[метод, композиция_декомпозиция, исполнять, u... \n", + "29 [[2.3.1], [исследование, модель, информационны... \n", + "3 [[особенность, проектирование, конкретный, арх... \n", + "31 [[2.3.2.3, непроцедурный, доступ, данным, sql]... \n", + "34 [[процедурный, расширение, язык, sql, pl_sql, ... \n", + "12 [[системный, объект, база], [словарь], [первый... \n", + "7 [[2], [технологии, создания, распределенных, и... \n", + "13 [[требование, проект, введение, относительно, ... \n", + "17 [[2.1.1.3.1], [ограничительный, условие, подде... \n", + "6 [[2.2.2, сравнительные, характеристика, sql, с... \n", + "11 [[этап, разработка, проект, заключительный, ст... \n", + "25 [[этап, разработка, проект, заключительный, ст... \n", + "21 [[этап, разработка, проект, определение, страт... \n", + "40 [[этап_разработка, проект, реализация, тестиро... \n", + "30 [[этап, разработка_проект, стратегия, анализ, ... \n", + "22 [[2.1.3], [язык, манипуляция, данными, ямд, яз... " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from gensim.models.phrases import Phraser, Phrases\n", + "\n", + "def prep_text(text):\n", + " doc = sp(text)\n", + " lower_sents = []\n", + " for sent in doc.sents:\n", + " lower_sents.append([word.lemma_.lower() for word in sent if not word.is_punct and not word.is_stop and not word.is_space])\n", + " lower_bigram = Phraser(Phrases(lower_sents))\n", + " clean_sents = []\n", + " for sent in lower_sents:\n", + " clean_sents.append(lower_bigram[sent])\n", + " return clean_sents\n", + "\n", + "df[\"prep_text\"] = df.apply(lambda row: prep_text(row[\"text\"]), axis=1)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "763e9011", + "metadata": {}, + "outputs": [], + "source": [ + "from gensim.models.word2vec import Word2Vec\n", + "\n", + "word2vec = Word2Vec(\n", + " sentences=df[\"prep_text\"].explode().tolist(),\n", + " vector_size=64,\n", + " sg=1,\n", + " window=10,\n", + " epochs=5,\n", + " min_count=10,\n", + " workers=4,\n", + " seed=9,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "aa8f0e50", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'система': 0,\n", + " 'работа': 1,\n", + " 'требование': 2,\n", + " 'база': 3,\n", + " 'пользователь': 4,\n", + " 'разработка': 5,\n", + " 'модель': 6,\n", + " 'информация': 7,\n", + " 'субд': 8,\n", + " 'этап': 9,\n", + " 'ошибка': 10,\n", + " 'функция': 11,\n", + " 'являться': 12,\n", + " 'таблица': 13,\n", + " 'средство': 14,\n", + " 'проект': 15,\n", + " 'сервер': 16,\n", + " 'процесс': 17,\n", + " 'документ': 18,\n", + " 'программа': 19,\n", + " 'использовать': 20,\n", + " 'состояние': 21,\n", + " 'проектирование': 22,\n", + " 'программный': 23,\n", + " 'случай': 24,\n", + " 'создание': 25,\n", + " 'модуль': 26,\n", + " 'время': 27,\n", + " 'объект': 28,\n", + " 'заказчик': 29,\n", + " 'приложение': 30,\n", + " 'реализация': 31,\n", + " 'правило': 32,\n", + " 'результат': 33,\n", + " 'вид': 34,\n", + " 'разработчик': 35,\n", + " 'возможность': 36,\n", + " 'технический': 37,\n", + " 'метод': 38,\n", + " 'тестирование': 39,\n", + " 'следующий': 40,\n", + " 'задача': 41,\n", + " 'использование': 42,\n", + " 'обработка': 43,\n", + " 'часть': 44,\n", + " 'позволять': 45,\n", + " 'клиент': 46,\n", + " 'интерфейс': 47,\n", + " 'переход': 48,\n", + " 'выполнение': 49,\n", + " 'обеспечение': 50,\n", + " 'информационный_система': 51,\n", + " 'новый': 52,\n", + " 'изменение': 53,\n", + " 'атрибут': 54,\n", + " 'основный': 55,\n", + " 'код': 56,\n", + " 'решение': 57,\n", + " 'запрос': 58,\n", + " 'операция': 59,\n", + " 'автоматизация': 60,\n", + " 'предприятие': 61,\n", + " 'доступ': 62,\n", + " 'язык': 63,\n", + " 'уровень': 64,\n", + " 'управление': 65,\n", + " 'платформа': 66,\n", + " 'информационный': 67,\n", + " 'группа': 68,\n", + " 'анализ': 69,\n", + " 'каждый': 70,\n", + " 'компонент': 71,\n", + " 'структура': 72,\n", + " 'автомат': 73,\n", + " 'использоваться': 74,\n", + " 'два': 75,\n", + " 'продукт': 76,\n", + " 'элемент': 77,\n", + " 'связь': 78,\n", + " 'работать': 79,\n", + " 'необходимый': 80,\n", + " 'тест': 81,\n", + " 'реализовать': 82,\n", + " 'отношение': 83,\n", + " 'существовать': 84,\n", + " 'общий': 85,\n", + " 'область': 86,\n", + " 'тип': 87,\n", + " 'цель': 88,\n", + " 'oracle': 89,\n", + " 'организация': 90,\n", + " 'сущность': 91,\n", + " 'форма': 92,\n", + " 'описание': 93,\n", + " 'действие': 94,\n", + " 'содержать': 95,\n", + " 'набор': 96,\n", + " 'диаграмма': 97,\n", + " 'бизнес': 98,\n", + " 'значение': 99,\n", + " 'срок': 100,\n", + " 'состав': 101,\n", + " 'операционный': 102,\n", + " 'подсистема': 103,\n", + " '1': 104,\n", + " 'вопрос': 105,\n", + " 'качество': 106,\n", + " 'архитектура': 107,\n", + " 'системный': 108,\n", + " 'обеспечивать': 109,\n", + " 'перечень': 110,\n", + " 'проектировщик': 111,\n", + " 'ввод': 112,\n", + " 'условие': 113,\n", + " 'сложный': 114,\n", + " 'функционирование': 115,\n", + " 'выполнять': 116,\n", + " 'эксплуатация': 117,\n", + " 'иметь': 118,\n", + " 'sql': 119,\n", + " 'файл': 120,\n", + " 'версия': 121,\n", + " 'различный': 122,\n", + " 'количество': 123,\n", + " 'определение': 124,\n", + " 'учёт': 125,\n", + " 'схема': 126,\n", + " 'отдельный': 127,\n", + " 'документация': 128,\n", + " 'заказ': 129,\n", + " 'деятельность': 130,\n", + " 'порядок': 131,\n", + " 'инструкция': 132,\n", + " 'web': 133,\n", + " 'windows': 134,\n", + " 'получить': 135,\n", + " 'отчёт': 136,\n", + " 'функциональный': 137,\n", + " 'число': 138,\n", + " 'характеристика': 139,\n", + " 'ограничение': 140,\n", + " 'образ': 141,\n", + " 'наличие': 142,\n", + " 'бд': 143,\n", + " 'проблема': 144,\n", + " 'основа': 145,\n", + " 'администратор': 146,\n", + " 'конфигурация': 147,\n", + " 'server': 148,\n", + " 'индекс': 149,\n", + " 'контроль': 150,\n", + " 'объём': 151,\n", + " 'руководство': 152,\n", + " 'преобразование': 153,\n", + " 'сеть': 154,\n", + " 'хранение': 155,\n", + " 'больший': 156,\n", + " 'исходный': 157,\n", + " 'поиск': 158,\n", + " 'пример': 159,\n", + " 'представление': 160,\n", + " 'задание': 161,\n", + " 'представить': 162,\n", + " 'реляционный': 163,\n", + " 'первый': 164,\n", + " 'программирование': 165,\n", + " 'рис': 166,\n", + " 'транзакция': 167,\n", + " 'место': 168,\n", + " 'проверка': 169,\n", + " 'состоять': 170,\n", + " 'счёт': 171,\n", + " 'представлять': 172,\n", + " 'взаимодействие': 173,\n", + " 'простой': 174,\n", + " 'спецификация': 175,\n", + " 'создать': 176,\n", + " 'память': 177,\n", + " 'точка': 178,\n", + " 'среда': 179,\n", + " 'обмен': 180,\n", + " 'компьютер': 181,\n", + " 'наименование': 182,\n", + " 'аис': 183,\n", + " 'важный': 184,\n", + " 'конечный_автомат': 185,\n", + " 'описать': 186,\n", + " 'запись': 187,\n", + " 'список': 188,\n", + " 'программист': 189,\n", + " 'технология': 190,\n", + " 'выделить': 191,\n", + " 'команда': 192,\n", + " '2': 193,\n", + " 'связать': 194,\n", + " 'создавать': 195,\n", + " 'принцип': 196,\n", + " 'имя': 197,\n", + " 'производительность': 198,\n", + " 'хранилище': 199,\n", + " 'выбрать': 200,\n", + " 'хороший': 201,\n", + " 'рабочий': 202,\n", + " 'несколько': 203,\n", + " 'иметься': 204,\n", + " 'режим': 205,\n", + " 'поддержка': 206,\n", + " 'защита': 207,\n", + " 'достаточно': 208,\n", + " 'требоваться': 209,\n", + " 'определить': 210,\n", + " 'полный': 211,\n", + " 'разный': 212,\n", + " 'данными': 213,\n", + " 'java': 214,\n", + " 'оперативный': 215,\n", + " 'сведение': 216,\n", + " 'соответствующий': 217,\n", + " 'помощь': 218,\n", + " 'относиться': 219,\n", + " 'формирование': 220,\n", + " 'документооборот': 221,\n", + " 'выбор': 222,\n", + " 'момент': 223,\n", + " 'оператор': 224,\n", + " 'выполнить': 225,\n", + " 'пакет': 226,\n", + " 'вызов': 227,\n", + " 'описывать': 228,\n", + " 'осуществляться': 229,\n", + " 'отказ': 230,\n", + " 'конкретный': 231,\n", + " '1с': 232,\n", + " 'аналитик': 233,\n", + " 'особенность': 234,\n", + " 'второй': 235,\n", + " 'сторона': 236,\n", + " 'поток': 237,\n", + " 'привести': 238,\n", + " 'разработать': 239,\n", + " 'множество': 240,\n", + " 'обладать': 241,\n", + " 'персонал': 242,\n", + " 'большинство': 243,\n", + " 'определять': 244,\n", + " 'надёжность': 245,\n", + " 'соответствовать': 246,\n", + " 'зависимость': 247,\n", + " 'серверный': 248,\n", + " 'способ': 249,\n", + " 'товар': 250,\n", + " 'построение': 251,\n", + " 'входить': 252,\n", + " 'подход': 253,\n", + " 'создаваться': 254,\n", + " '3': 255,\n", + " 'назначение': 256,\n", + " 'источник': 257,\n", + " 'автоматизировать': 258,\n", + " 'механизм': 259,\n", + " 'исполнение': 260,\n", + " 'возникать': 261,\n", + " 'внедрение': 262,\n", + " 'процедура': 263,\n", + " 'высокий': 264,\n", + " 'ключ': 265,\n", + " 'клиентский': 266,\n", + " 'сотрудник': 267,\n", + " 'окончание': 268,\n", + " 'раздел': 269,\n", + " 'соответствие': 270,\n", + " 'отметить': 271,\n", + " 'сбой': 272,\n", + " 'удобный': 273,\n", + " 'большой': 274,\n", + " 'целое': 275,\n", + " 'оценка': 276,\n", + " '4': 277,\n", + " 'рассмотреть': 278,\n", + " 'стандарт': 279,\n", + " 'интернет': 280,\n", + " 'узел': 281,\n", + " 'методология': 282,\n", + " 'процессор': 283,\n", + " 'основной': 284,\n", + " 'класс': 285,\n", + " 'определённый': 286,\n", + " 'мбайт': 287,\n", + " 'включать': 288,\n", + " 'загрузка': 289,\n", + " 'ситуация': 290,\n", + " 'параметр': 291,\n", + " 'стратегия': 292,\n", + " '8.1': 293,\n", + " 'xp': 294,\n", + " 'реальный': 295,\n", + " 'т.п.': 296,\n", + " 'сделать': 297,\n", + " 'ресурс': 298,\n", + " 'известный': 299,\n", + " 'обрабатывать': 300,\n", + " 'три': 301,\n", + " 'определяться': 302,\n", + " 'настройка': 303,\n", + " 'проводиться': 304,\n", + " 'содержание': 305,\n", + " 'аппаратный': 306,\n", + " 'ms': 307,\n", + " 'физический': 308,\n", + " 'выполняться': 309,\n", + " 'внутренний': 310,\n", + " 'данным': 311,\n", + " 'внешний': 312,\n", + " 'формат': 313,\n", + " 'оформление': 314,\n", + " 'рамка': 315,\n", + " 'материал': 316,\n", + " 'фирма': 317,\n", + " 'стадия': 318,\n", + " 'человек': 319,\n", + " 'делать': 320,\n", + " 'обслуживание': 321,\n", + " 'год': 322,\n", + " 'компания': 323,\n", + " 'uml': 324,\n", + " 'intel': 325,\n", + " 'pentium': 326,\n", + " 'хранить': 327,\n", + " 'привилегия': 328,\n", + " 'храниться': 329,\n", + " 'требовать': 330,\n", + " 'ос': 331,\n", + " 'входной': 332,\n", + " 'применение': 333,\n", + " 'предоставлять': 334,\n", + " 'расчёт': 335,\n", + " 'jdbc': 336,\n", + " 'microsoft': 337,\n", + " 'внимание': 338,\n", + " 'дата': 339,\n", + " 'a': 340,\n", + " 'дело': 341,\n", + " 'степень': 342,\n", + " 'основание': 343,\n", + " 'возможный': 344,\n", + " 'безопасность': 345,\n", + " 'договор': 346,\n", + " 'поддерживать': 347,\n", + " 'зависеть': 348,\n", + " 'развитие': 349,\n", + " 'принять': 350,\n", + " 'сложность': 351,\n", + " 'программный_обеспечение': 352,\n", + " 'происходить': 353,\n", + " 'вывод': 354,\n", + " 'становиться': 355,\n", + " 'исполнитель': 356,\n", + " 'текст': 357,\n", + " 'указать': 358,\n", + " 'предполагать': 359,\n", + " 'linux': 360,\n", + " 'дипломный': 361,\n", + " 'эффективный': 362,\n", + " 'получение': 363,\n", + " 'мгц': 364,\n", + " 'информационный_модель': 365,\n", + " 'период': 366,\n", + " 'главный': 367,\n", + " 'машина': 368,\n", + " 'последовательность': 369,\n", + " 'какой': 370,\n", + " 'соединение': 371,\n", + " 'собственный': 372,\n", + " 'оказаться': 373,\n", + " 'строка': 374,\n", + " 'предусмотреть': 375,\n", + " 'предназначить': 376,\n", + " 'проведение': 377,\n", + " 'словарь': 378,\n", + " 'ооо': 379,\n", + " 'услуга': 380,\n", + " 'пространство': 381,\n", + " 'b': 382,\n", + " 'ответ': 383,\n", + " 'диск': 384,\n", + " 'триггер': 385,\n", + " 'разрабатывать': 386,\n", + " 'конечный': 387,\n", + " 'размер': 388,\n", + " 'находиться': 389,\n", + " 'обеспечить': 390,\n", + " 'подготовка': 391,\n", + " 'отсутствие': 392,\n", + " 'затрата': 393,\n", + " 'функционал': 394,\n", + " 'отражать': 395,\n", + " 'вариант': 396,\n", + " 'сообщение': 397,\n", + " 'жёсткий': 398,\n", + " 'специальный': 399,\n", + " 'современный': 400,\n", + " 'целостность': 401,\n", + " 'производиться': 402,\n", + " 'символ': 403,\n", + " 'сетевой': 404,\n", + " 'говорить': 405,\n", + " 'этап_анализ': 406,\n", + " 'трансформация': 407,\n", + " 'отдел': 408,\n", + " 'лицо': 409,\n", + " '=': 410,\n", + " 'завершение': 411,\n", + " 'дополнительный': 412,\n", + " 'временной': 413,\n", + " 'справочник': 414,\n", + " 'особый': 415,\n", + " 'зрение': 416,\n", + " 'удовлетворять': 417,\n", + " 'кластер': 418,\n", + " 'хранить_процедура': 419,\n", + " 'показать': 420,\n", + " 'автоматический': 421,\n", + " 'передача': 422,\n", + " 'установка': 423,\n", + " 'практика': 424,\n", + " 'свойство': 425,\n", + " 'течение': 426,\n", + " 'пользовательский': 427,\n", + " 'автоматически': 428,\n", + " 'ряд': 429,\n", + " 'получать': 430,\n", + " 'cgi': 431,\n", + " 'причина': 432,\n", + " 'скорость': 433,\n", + " 'день': 434,\n", + " 'сумма': 435,\n", + " 'прийтись': 436,\n", + " 'автоматизированный': 437,\n", + " 'некоторый': 438,\n", + " 'руководитель': 439,\n", + " 'передать': 440,\n", + " 'позволить': 441,\n", + " 'технологический': 442,\n", + " 'управлять': 443,\n", + " 'иерархический': 444,\n", + " 'резервный': 445,\n", + " 'предыдущий': 446,\n", + " 'существенно': 447,\n", + " 'исправление': 448,\n", + " 'страница': 449,\n", + " 'высоко': 450,\n", + " 'распределить': 451,\n", + " 'поле': 452,\n", + " 'банк': 453,\n", + " 'экранный': 454,\n", + " '2010': 455,\n", + " 'плановый': 456,\n", + " 'ориентировать': 457,\n", + " 'быстрый': 458,\n", + " 'сайт': 459,\n", + " 'задать': 460,\n", + " 'create': 461,\n", + " 'скрипт': 462,\n", + " 'финансовый': 463,\n", + " 'план': 464,\n", + " 'одновременно': 465,\n", + " 'дальнейший': 466,\n", + " 'допустимый': 467,\n", + " 'мощность': 468,\n", + " 'готовый': 469,\n", + " 'означать': 470,\n", + " 'нагрузка': 471,\n", + " 'раз': 472,\n", + " 'знание': 473,\n", + " 'удаление': 474,\n", + " 'осуществлять': 475,\n", + " 'улгту': 476,\n", + " 'программный_продукт': 477,\n", + " 'событие': 478,\n", + " 'преимущество': 479,\n", + " 'роль': 480,\n", + " 'правильный': 481,\n", + " 'оборудование': 482,\n", + " 'бухгалтерский': 483,\n", + " 'шифр': 484,\n", + " 'третий': 485,\n", + " 'серьёзный': 486,\n", + " 'начальный': 487,\n", + " 'составной_состояние': 488,\n", + " 'невозможный': 489,\n", + " 'номер': 490,\n", + " 'непосредственно': 491,\n", + " 'единый': 492,\n", + " 'актуальный': 493,\n", + " 'последний': 494,\n", + " 'недостаток': 495,\n", + " 'редактирование': 496,\n", + " 'эффективность': 497,\n", + " 'цена': 498,\n", + " 'предполагаться': 499,\n", + " 'найти': 500,\n", + " 'инструмент': 501,\n", + " 'слово': 502,\n", + " 'обновление': 503,\n", + " 'логика': 504,\n", + " 'обязательный': 505,\n", + " 'небольшой': 506,\n", + " '5': 507,\n", + " 'электронный': 508,\n", + " 'патентный': 509,\n", + " '7': 510,\n", + " 'график': 511,\n", + " 'моделирование': 512,\n", + " 'весьма': 513,\n", + " 'давать': 514,\n", + " 'комментарий': 515,\n", + " 'применяться': 516,\n", + " 'on': 517,\n", + " 'ось': 518,\n", + " 'повышение': 519,\n", + " 'каскадный': 520,\n", + " 'гост': 521,\n", + " 'чтение': 522,\n", + " '2003': 523,\n", + " 'провести': 524,\n", + " 'специалист': 525,\n", + " 'многим': 526,\n", + " 'критерий': 527,\n", + " 'iii': 528,\n", + " 'прикладной': 529,\n", + " 'odbc': 530,\n", + " 'db2': 531,\n", + " 'полностью': 532,\n", + " 'построить': 533,\n", + " 'право': 534,\n", + " 'рекомендоваться': 535,\n", + " 'стандартный': 536,\n", + " 'практически': 537,\n", + " 'комплекс': 538,\n", + " 'модификация': 539,\n", + " 'абс': 540,\n", + " 'достаточный': 541,\n", + " 'восстановление': 542,\n", + " 'классификация': 543,\n", + " 'факт': 544,\n", + " 'показатель': 545,\n", + " 'копия': 546,\n", + " 'распределение': 547,\n", + " 'разрабатываться': 548,\n", + " 'достигнуть': 549,\n", + " 'графический': 550,\n", + " 'фактор': 551,\n", + " 'станция': 552,\n", + " 'подлежать': 553,\n", + " 'жизненный_цикл': 554,\n", + " 'исследование': 555,\n", + " 'обнаружить': 556,\n", + " 'учитывать': 557,\n", + " 'понятный': 558,\n", + " 'изменяться': 559,\n", + " 'отсутствовать': 560,\n", + " 'называть': 561,\n", + " 'т.д.': 562,\n", + " 'ориентированный': 563,\n", + " 'содержаться': 564,\n", + " 'выходной': 565,\n", + " 'приводить': 566,\n", + " '256': 567,\n", + " 'драйвер': 568,\n", + " 'объектный': 569,\n", + " 'ключевой': 570,\n", + " 'конец': 571,\n", + " 'приёмка': 572,\n", + " 'заключаться': 573,\n", + " 'первичный': 574,\n", + " 'регистрация': 575,\n", + " 'ни': 576,\n", + " 'полнота': 577,\n", + " 'столбец': 578,\n", + " 'c': 579,\n", + " 'единственный': 580,\n", + " 'носитель': 581,\n", + " 'способность': 582,\n", + " 'отображение': 583,\n", + " 'единица': 584,\n", + " 'предметный': 585,\n", + " 'проектный': 586,\n", + " 'прототип': 587,\n", + " 'текстовый': 588,\n", + " 'ведение': 589,\n", + " '2000': 590,\n", + " 'реакция': 591,\n", + " '2.2': 592,\n", + " 'изменить': 593,\n", + " 'принятие': 594,\n", + " 'касаться': 595,\n", + " 'испытание': 596,\n", + " 'постоянный': 597,\n", + " 'мощный': 598,\n", + " 'понимание': 599,\n", + " 'очередь': 600,\n", + " 'формализация': 601,\n", + " 'psm': 602,\n", + " 'производитель': 603,\n", + " 'частность': 604,\n", + " 'необходимость': 605,\n", + " 'мера': 606,\n", + " 'блок': 607,\n", + " 'работник': 608,\n", + " 'типовой': 609,\n", + " 'сегодня': 610,\n", + " 'решать': 611,\n", + " 'отвечать': 612,\n", + " 'идти': 613,\n", + " 'ядро': 614,\n", + " 'выделение_метод': 615,\n", + " 'оценить': 616,\n", + " 'расширение': 617,\n", + " 'логический': 618,\n", + " 'предъявлять': 619,\n", + " 'инициировать': 620,\n", + " 'любой': 621,\n", + " 'работоспособность': 622,\n", + " 'промышленный': 623,\n", + " 'часть_конечный': 624,\n", + " 'администрирование': 625,\n", + " 'локальный': 626,\n", + " 'принимать': 627,\n", + " '+': 628,\n", + " 'поставщик': 629,\n", + " 'solaris': 630,\n", + " 'крупный': 631,\n", + " 'последующий': 632,\n", + " 'иерархия': 633,\n", + " 'обязательно': 634,\n", + " 'понятие': 635,\n", + " 'служить': 636,\n", + " 'навык': 637,\n", + " 'процессов': 638,\n", + " 'pim': 639,\n", + " 'иных': 640,\n", + " 'присутствовать': 641,\n", + " 'меню': 642,\n", + " 'вероятность': 643,\n", + " 'сравнение': 644,\n", + " '6': 645,\n", + " 'четко': 646,\n", + " 'регламент': 647,\n", + " 'apache': 648,\n", + " 'доступный': 649,\n", + " 'php': 650,\n", + " 'категория': 651,\n", + " 'г.': 652,\n", + " 'ис': 653,\n", + " 'перечислить': 654,\n", + " '1с_предприятие': 655,\n", + " 'обучение': 656,\n", + " 'добавление': 657,\n", + " 'запуск': 658,\n", + " 'предлагать': 659,\n", + " 'возникновение': 660,\n", + " 'начинать': 661,\n", + " 'планирование': 662,\n", + " 'дублирование': 663,\n", + " 'относительно': 664,\n", + " 'внешний_ключ': 665,\n", + " 'передавать': 666,\n", + " 'потребность': 667,\n", + " 'этап_проектирование': 668,\n", + " 'rdbms': 669,\n", + " 'тема': 670,\n", + " 'документирование': 671,\n", + " 'параллельный': 672,\n", + " 'деталь': 673,\n", + " 'старый': 674,\n", + " 'корпоративный': 675,\n", + " 'обратный': 676,\n", + " 'вести': 677,\n", + " 'аналитический': 678,\n", + " 'отчётность': 679,\n", + " 'предоставление': 680,\n", + " 'подробный': 681,\n", + " 'т.е.': 682,\n", + " 'магазин': 683,\n", + " 'независимость': 684,\n", + " 'функциональность': 685,\n", + " 'критический': 686,\n", + " 'появление': 687,\n", + " 'организационный': 688,\n", + " 'методический': 689,\n", + " 'математический': 690,\n", + " 'редко': 691,\n", + " 'встречаться': 692,\n", + " 'виток_спираль': 693,\n", + " 'внутри': 694,\n", + " 'предъявление': 695,\n", + " 'легко': 696,\n", + " 'финансирование': 697,\n", + " 'независимый': 698,\n", + " 'распределить_база': 699,\n", + " 'mysql': 700,\n", + " 'отношение_многим': 701,\n", + " 'id': 702,\n", + " 'нарушение': 703,\n", + " 'язык_java': 704,\n", + " '2.2.1': 705,\n", + " 'размещение': 706,\n", + " 'оплата': 707,\n", + " 'потеря': 708,\n", + " 'накопление': 709,\n", + " 'некорректный': 710,\n", + " 'табличный': 711,\n", + " 'выгрузка': 712,\n", + " 'конфликт': 713,\n", + " 'приём': 714,\n", + " 'расход': 715,\n", + " 'приходиться': 716,\n", + " 'банковский': 717,\n", + " 'установить': 718,\n", + " 'вестись': 719,\n", + " 'увеличение': 720,\n", + " 'ограничить': 721,\n", + " 'производственный': 722,\n", + " 'интеграция': 723,\n", + " 'написание': 724,\n", + " 'заполнение': 725,\n", + " 'сервис': 726,\n", + " 'лингвистический': 727,\n", + " 'iv': 728,\n", + " 'путем': 729,\n", + " 'обозначение': 730,\n", + " '866': 731,\n", + " 'предъявляться': 732,\n", + " 'текущий': 733,\n", + " 'изменять': 734,\n", + " 'базовый': 735,\n", + " 'объектный_множество': 736,\n", + " 'максимальный': 737,\n", + " 'гибкий': 738,\n", + " 'надёжный': 739,\n", + " 'сторонний': 740,\n", + " 'менеджер': 741,\n", + " 'протокол': 742,\n", + " 'перенести': 743,\n", + " 'отчётный': 744,\n", + " 'вызывать': 745,\n", + " 'совокупность': 746,\n", + " 'фактически': 747,\n", + " 'сдача': 748,\n", + " 'смысл': 749,\n", + " 'статья': 750,\n", + " 'ранний': 751,\n", + " 'написать': 752,\n", + " 'составлять': 753,\n", + " 'конструкция': 754,\n", + " 'er': 755,\n", + " '10': 756,\n", + " 'стоить': 757,\n", + " 'идея': 758,\n", + " 'целый': 759,\n", + " 'решить': 760,\n", + " 'генерация': 761,\n", + " 'понимать': 762,\n", + " 'корпорация': 763,\n", + " 'нормальный_форма': 764,\n", + " 'проверить': 765,\n", + " '2.2.2': 766,\n", + " 'экономический': 767,\n", + " 'выступать': 768,\n", + " 'май': 769,\n", + " 'нормативный': 770,\n", + " 'компьютерный': 771,\n", + " 'влиять': 772,\n", + " 'устройство': 773,\n", + " 'считать': 774,\n", + " 'месяц': 775,\n", + " 'уникальный': 776,\n", + " 'тестер': 777,\n", + " 'применить': 778,\n", + " 'начало': 779,\n", + " 'корректность': 780,\n", + " '2.2.4': 781,\n", + " 'значительно': 782,\n", + " 'выборка': 783,\n", + " 'функционировать': 784,\n", + " 'int': 785,\n", + " 'введение': 786,\n", + " 'знать': 787,\n", + " 'корректный': 788,\n", + " 'правильно': 789,\n", + " 'поставить': 790,\n", + " 'термин': 791,\n", + " 'цикл': 792,\n", + " 'последовательный': 793,\n", + " 'отличаться': 794,\n", + " 'проходить': 795,\n", + " 'doctors': 796,\n", + " 'приоритет': 797,\n", + " 'поведение': 798,\n", + " 'предел': 799,\n", + " 'предложение': 800,\n", + " 'схема_база': 801,\n", + " 'многих': 802,\n", + " 'неверный': 803,\n", + " 'проводить': 804,\n", + " 'простота': 805,\n", + " 'возвратный': 806,\n", + " 'учётный': 807,\n", + " 'informix': 808,\n", + " 'зачастую': 809,\n", + " 'сценарий': 810,\n", + " 'рекурсивный': 811,\n", + " 'пояснительный': 812,\n", + " 'направление': 813,\n", + " 'бухгалтерия': 814,\n", + " 'дать': 815,\n", + " '8': 816,\n", + " 'рост': 817,\n", + " 'избежать': 818,\n", + " 'точность': 819,\n", + " 'обращаться': 820,\n", + " 'коммерческий': 821,\n", + " 'ссылочный_целостность': 822,\n", + " 'данную': 823,\n", + " 'консультант': 824,\n", + " 'записка': 825,\n", + " 'пользоваться': 826,\n", + " 'разрешение': 827,\n", + " 'mda': 828,\n", + " '2.2.3': 829,\n", + " 'эвм': 830,\n", + " 'показывать': 831,\n", + " 'лёгкий': 832,\n", + " 'апрель': 833,\n", + " 'сопровождение': 834,\n", + " 'широкий': 835,\n", + " '15': 836,\n", + " 'стоимость': 837,\n", + " 'переменный': 838,\n", + " 'сегмент': 839,\n", + " 'постоянно': 840,\n", + " 'сокращение': 841,\n", + " 'смена': 842,\n", + " 'малый': 843,\n", + " 'название': 844,\n", + " 'разработанная': 845,\n", + " 'экземпляр': 846,\n", + " 'рисунок': 847,\n", + " 'составить': 848,\n", + " 'появляться': 849,\n", + " 'одинаковый': 850,\n", + " 'подходить': 851,\n", + " 'null': 852,\n", + " 'слой': 853,\n", + " 'обслуживать': 854,\n", + " 'вызвать': 855,\n", + " 'фаза': 856,\n", + " 'друг': 857,\n", + " 'исходный_код': 858,\n", + " 'характер': 859,\n", + " 'дистрибутив': 860,\n", + " 'занимать': 861,\n", + " '2.2.5': 862,\n", + " 'возврат': 863,\n", + " 'попытка': 864,\n", + " 'измерение': 865,\n", + " 'движение': 866,\n", + " 'пациент': 867,\n", + " '2.2.6': 868,\n", + " 'n': 869,\n", + " '>': 870,\n", + " 'контекст': 871,\n", + " 'windows_nt': 872,\n", + " 'каталог': 873,\n", + " 'видеть': 874,\n", + " 'эквивалентный': 875,\n", + " 'поддерживаться': 876,\n", + " 'unix': 877,\n", + " 'рекомендовать': 878,\n", + " 'кэш': 879,\n", + " 'полноценный': 880,\n", + " 'и др.': 881,\n", + " 'склад': 882,\n", + " 'традиционный': 883,\n", + " 'меняться': 884,\n", + " 'водопад': 885,\n", + " '512': 886,\n", + " 'интерактивный': 887,\n", + " 'ibm': 888,\n", + " 'условный': 889,\n", + " 'опытный': 890,\n", + " 'выявить': 891,\n", + " 'монитор': 892,\n", + " 'журнал': 893,\n", + " 'следствие': 894,\n", + " 'потенциальный': 895,\n", + " 'пройти': 896,\n", + " 'промежуточный': 897,\n", + " 'тестовый': 898,\n", + " 'реквизит': 899,\n", + " 'пользовательский_процесс': 900,\n", + " 'пара': 901,\n", + " 'фоновый': 902,\n", + " 'броузер': 903,\n", + " 'идентификатор': 904,\n", + " 'профессиональный_субд': 905,\n", + " 'специально': 906,\n", + " 'case': 907,\n", + " 'sun': 908,\n", + " 'иной': 909,\n", + " 'неделя': 910,\n", + " 'равный': 911,\n", + " 'привлекаться': 912,\n", + " 'шаг': 913,\n", + " 'риск': 914,\n", + " 'итог': 915,\n", + " 'трансформация_выделение': 916,\n", + " 'обойтись': 917,\n", + " 'участок': 918,\n", + " 'строго': 919,\n", + " 'алгоритм': 920,\n", + " 'схема_преобразование': 921,\n", + " 'предоставить': 922,\n", + " 'другому': 923,\n", + " 'моделировать': 924,\n", + " 'вычислительный': 925,\n", + " 'техника': 926,\n", + " 'существенный': 927,\n", + " 'положение': 928,\n", + " 'кнопка': 929,\n", + " 'называться': 930,\n", + " 'ввести': 931,\n", + " 'печать': 932,\n", + " 'применять': 933,\n", + " 'nt': 934,\n", + " 'внести': 935,\n", + " 'производство': 936,\n", + " 'очевидный': 937,\n", + " 'internet': 938,\n", + " 'формировать': 939,\n", + " 'недопустимый': 940,\n", + " 'обработать': 941,\n", + " 'кафедра': 942,\n", + " 'отслеживать': 943,\n", + " 'аутентификация': 944,\n", + " 'подразделение': 945,\n", + " 'производить': 946,\n", + " '2.2.7': 947,\n", + " 'упростить': 948,\n", + " 'популярный': 949,\n", + " 'структурный': 950,\n", + " 'удалённый': 951,\n", + " '2000/': 952,\n", + " '2.1': 953,\n", + " 'покупатель': 954,\n", + " 'успешный': 955,\n", + " 'намного': 956,\n", + " 'восприятие': 957,\n", + " 'stronghold': 958,\n", + " 'писать': 959,\n", + " 'составной': 960,\n", + " 'преобразовать': 961,\n", + " 'никакой': 962,\n", + " 'cim': 963,\n", + " 'добавляться': 964,\n", + " 'другом': 965,\n", + " 'мониторинг': 966,\n", + " 'логики': 967,\n", + " 'выход': 968,\n", + " 'предусматривать': 969,\n", + " 'реализоваться': 970,\n", + " 'начинаться': 971,\n", + " 'длина': 972,\n", + " 'возвращать': 973,\n", + " 'т.к.': 974,\n", + " 'зависимый': 975,\n", + " 'триггеры': 976,\n", + " 'обозначать': 977,\n", + " 'удалить': 978,\n", + " 'окружение': 979,\n", + " 'sdl': 980,\n", + " 'согласно': 981,\n", + " 'celeron': 982,\n", + " 'data': 983,\n", + " 'следовательно': 984,\n", + " 'предъявить': 985,\n", + " 'подтип': 986,\n", + " 'описываться': 987,\n", + " 'операционный_система': 988,\n", + " 'разделение': 989,\n", + " 'обмен_данными': 990,\n", + " 'насколько': 991,\n", + " 'подобный': 992,\n", + " 'сбор': 993,\n", + " 'низкий': 994,\n", + " 'правило_процесс': 995,\n", + " 'четвёртый': 996,\n", + " 'текущий_счёт': 997,\n", + " 'включить': 998,\n", + " '<': 999,\n", + " ...}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.key_to_index" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "671b1312", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('8.1', 0.9879903197288513),\n", + " ('бухгалтерия', 0.980316698551178),\n", + " ('навык', 0.9310787320137024)]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.most_similar(\"1с\", topn=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5c0507dc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-5.72758615e-01, -4.64142323e-01, -1.41238064e-01, -6.03196502e-01,\n", + " -3.06068182e-01, 1.47344675e-02, -8.86413306e-02, 6.53996249e-05,\n", + " 2.22017527e-01, -1.03922300e-01, 4.06073749e-01, -5.07203415e-02,\n", + " 1.23037435e-01, -1.68328971e-01, -8.36593136e-02, 2.31885687e-01,\n", + " -1.16688296e-01, 1.43522806e-02, -5.78690231e-01, 3.08529168e-01,\n", + " 3.75707522e-02, 1.13559164e-01, 3.83746147e-01, 2.44788274e-01,\n", + " -5.16302809e-02, -8.68294463e-02, 7.44756520e-01, 2.69289196e-01,\n", + " -1.38882861e-01, 3.19430903e-02, 2.82276541e-01, -1.97692990e-01,\n", + " -1.43509433e-01, -1.92271873e-01, -1.49369061e-01, 6.34338081e-01,\n", + " 1.60252139e-01, 6.62923336e-01, 9.45296362e-02, -1.62105456e-01,\n", + " -2.70663768e-01, 2.80816615e-01, 4.22135949e-01, -1.53156146e-01,\n", + " 1.51129171e-01, 3.92942369e-01, -5.38962841e-01, -1.52189329e-01,\n", + " -7.02899694e-01, -4.62726772e-01, -8.09689939e-01, 2.60302156e-01,\n", + " 2.99924672e-01, 2.37710088e-01, 2.08470032e-01, 6.07197583e-01,\n", + " 1.30898044e-01, 9.39554572e-01, 4.40701753e-01, -4.94057983e-01,\n", + " 3.68286878e-01, -1.29404917e-01, 6.02491438e-01, -3.94566447e-01],\n", + " dtype=float32)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv[\"1с\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "d7c3f2f4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'заказчик'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.doesnt_match(\"java php 1с oracle заказчик\".split())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a2123dc9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.83737653" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.similarity(\"java\", \"javascript\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ff2b8e71", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.7350806" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.similarity(\"java\", \"1с\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "528f1ce1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('лингвистический', 0.9782435297966003),\n", + " ('php', 0.9754980802536011),\n", + " ('mysql', 0.9643309712409973),\n", + " ('java', 0.963462769985199),\n", + " ('знание', 0.950555682182312),\n", + " ('apache', 0.9452742338180542),\n", + " ('1с_предприятие', 0.943841278553009),\n", + " ('windows_nt', 0.9398906826972961),\n", + " ('работать', 0.9393702745437622),\n", + " ('базовый', 0.9373704791069031)]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.most_similar(positive=[\"1с\", \"машина\"], negative=[\"бухгалтерия\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "12eb6d41", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('программирование', 0.8422903418540955),\n", + " ('java', 0.7840348482131958),\n", + " ('использовать', 0.7770466804504395),\n", + " ('php', 0.7726089954376221),\n", + " ('sql', 0.7726024389266968),\n", + " ('лингвистический', 0.7516488432884216),\n", + " ('производитель', 0.7262539267539978),\n", + " ('написание', 0.7253801226615906),\n", + " ('использование', 0.7136848568916321),\n", + " ('мощный', 0.7123106718063354)]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.most_similar(positive=[\"субд\", \"язык\"], negative=[\"база\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "9e0c2e87", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('1с', 0.9639856815338135),\n", + " ('среда', 0.942729651927948),\n", + " ('8.1', 0.9425337910652161),\n", + " ('ориентировать', 0.9270872473716736),\n", + " ('web', 0.915542483329773),\n", + " ('платформа', 0.9038816094398499),\n", + " ('навык', 0.8979926705360413),\n", + " ('программный', 0.8968376517295837),\n", + " ('компания', 0.8852423429489136),\n", + " ('лингвистический', 0.8833838105201721)]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.most_similar(positive=[\"java\", \"бухгалтерия\"], negative=[\"машина\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "68688549", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('256', 0.9967159628868103),\n", + " ('512', 0.9953411221504211),\n", + " ('pentium', 0.9951350688934326),\n", + " ('iii', 0.9946882724761963),\n", + " ('celeron', 0.9945207834243774),\n", + " ('iv', 0.9916473031044006),\n", + " ('intel', 0.9878745079040527),\n", + " ('2003', 0.9863777756690979),\n", + " ('процессор', 0.9855839610099792),\n", + " ('c', 0.9850897192955017)]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.most_similar(positive=[\"866\", \"мбайт\"], negative=[\"мгц\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "1170e940", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('256', 0.9890534281730652),\n", + " ('мбайт', 0.9886034727096558),\n", + " ('мгц', 0.9871484637260437),\n", + " ('pentium', 0.9858012199401855),\n", + " ('celeron', 0.9855312705039978),\n", + " ('c', 0.9849308133125305),\n", + " ('512', 0.9843060970306396),\n", + " ('iii', 0.9841062426567078),\n", + " ('iv', 0.9838903546333313),\n", + " ('высоко', 0.9828835129737854)]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word2vec.wv.most_similar(positive=[\"866\", \"память\"], negative=[\"процессор\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "999e1c23", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xytoken
0-24.734394-7.651334система
1-30.030426-18.815897работа
2-26.8211312.513596требование
3-8.13346024.581547база
4-20.1580373.450009пользователь
............
10386.665592-2.917084некий
103918.3088099.314460самым
104012.663247-1.679625похожий
10417.7626401.464980целесообразный
1042-0.540131-15.037376обследование
\n", + "

1043 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " x y token\n", + "0 -24.734394 -7.651334 система\n", + "1 -30.030426 -18.815897 работа\n", + "2 -26.821131 2.513596 требование\n", + "3 -8.133460 24.581547 база\n", + "4 -20.158037 3.450009 пользователь\n", + "... ... ... ...\n", + "1038 6.665592 -2.917084 некий\n", + "1039 18.308809 9.314460 самым\n", + "1040 12.663247 -1.679625 похожий\n", + "1041 7.762640 1.464980 целесообразный\n", + "1042 -0.540131 -15.037376 обследование\n", + "\n", + "[1043 rows x 3 columns]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.manifold import TSNE\n", + "\n", + "tsne = TSNE(n_components=2, max_iter=1000, random_state=9)\n", + "coords_df = pd.DataFrame(\n", + " tsne.fit_transform(word2vec.wv[word2vec.wv.key_to_index]), columns=[\"x\", \"y\"]\n", + ")\n", + "coords_df[\"token\"] = word2vec.wv.key_to_index.keys()\n", + "coords_df" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "1fa73292", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"f9d60e72-a6cb-410b-b150-ddf9839bbe52\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.2.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"f9d60e72-a6cb-410b-b150-ddf9839bbe52\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"681b38e1-4bb7-437b-a4e7-5f18a8a9fdb7\":{\"version\":\"3.7.2\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1046\",\"attributes\":{\"width\":800,\"height\":800,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1047\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1048\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1055\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1056\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1053\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1086\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1080\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1081\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1082\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[1043],\"dtype\":\"float32\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"u9f0wPWGlsHA3iBAAqfEQfHMXEAlUqXBR53qwP+DrcGIordB7+KmwRztDUBXBrNBBE6DwYpWoUExhKxA7SSkwfYBo0FMxnPBxRu8wUSQWEH2MalBaNkswKKqosGWobtA3Qv1QL1zg8GkU6HBZbLJwVjVo8ElN5bBfymoQUxLxMC9iEVAD8vDwR0FN8EOwqLBeQNhQfDU3MA1OPu/zaejwWaaosAisFXBUxzvQLXIsEGm57jBPA9hQdHBDsFauNtBoD4gwKsdz8GgnWVA2HEPwTeLC8F24iFAzYedQVO5KsEDvGRBNgKBP7ZqxEHV2oNBbcikwbr8PcEGy+BBJuCUQTGiukFJfydBmzMQQXcrR8AgRp7BqY6dwYsOq8ByY6bBf21LQRhADMBqmPhAZ/mdQcYya8HjmIrAGxxRwd9Gg0EFIG7Ap9OrwZkKskH0zppBuq4gQc1RN8GJdivA+jCeQY84isFJjMVB4yuSweAwlUEjn71Bat4ZwJUarkB8pMW/uctfwOyr3r4GlIHBtHKTQS90p8EjTjrBfVZmQZ3r0cHriarBaplcwQpthcBRCKFBtlAlQN593UFqAVjBGSpOwft8ssEYWa2/OyHqQDO868AUf45BrG/5wEV4S0FKgMFBfDrHQVvDpEGUAkfBQBHhwePgjkGg3+LBQ+MlQa1kwMGqIAfBZmTtwRZdnMH4NsLBj+f/wBQUDEHJD3RB8Z+7wfcCysG2+03B4kiPQTanj0AQ7aZBXXqOQZBEVUF3XcdB+EeRwJ8AtsH9FsLAlylGQfuDgEHD+qdBsoCNwVRnmkFKtSfBmebKwCp0mUEXHt1BzH1AQf3UOz+dFppBYZRZQYLRpEHLGEvBWLzFwWkPqEGm+1hA7vSRQVWOF72serpBW9UmQRt91cHPBU3B7obZweOAKEHZiybBwh4zQR7x9cBvyjFB53SUQTJK20BEuQFBb9/QQTbcbUH3bGHBlcMzQODaIEFiXKm/K/NBwEuZm0HAUsXB3UoEwVF2EEF1kRPAxvD1PzamnkDOWIBBtKhrQeAR0MBgv4hBj/fyQAD5WEG4a17BJxuIQd7xy0AoTjZBC6Z5QUM5JUE1At5AXS9EQb7yKb++PwDBoleeQGfbQsHPvq9BSW/IQWoyjEG6KZpBX/powVr6ysBNp6dBsitLQLia3sE/9pnBXNOWQHmlrECXllZBsivewXlqsUF39a9BtIivwLKaV0HKdaXB9O8gwWESFUEWRmbBDVANQCgrfEDB/lXBqISPQZCOyMEKwetAsusrQSRjS0E8YQHBK6aSQRTdgUG96d7AeeV/QUtAhkH2pJ1BFpU7QU4M28HrgU5Ab0JgwYpJ28CO863B//2pQLqggsFEYazBZCSKweVWeUGvcaXBon5AwYyIYsHd16RBVf9/QTKnlkEWg5lBaMh9wSqLt8Gl0IPB9UMEwfkuL0He7vxAdtLRwNB2F0H8f/XAH/CswV/5qkAAFrJAAwRJQFpjoD9xuIpB2qyiwZh6jEH3PcjBwq5SQQaXtkAFDplBtUxFwXq0kkHYtzVAzVm6QQ/Eo8FqnBdBHfCCQVzzHkHBypVB51bRQDtwzECQNytBDCikQeKbIUAuAvvAJvm5QD3/r8FoVT/BQpUHQfNUfUG7eI/BUlOcwNSMI8Fr28BBg34oQR/WpkGF47zBcIxvweMbg8Fmd0DBD2mewS+uosC2vHpBPep5wSbvssH9Rji/fa1dwEEJjkG5yo1BFvSmQa+itkGC4pFBZ30YwWspfkG+xa5AUH01QaTdWEHQr9rBPv+xQaNvXEFNY0i+j6fhwZlGo0HFw1zBB7TcwPnPhsEfbA9AEMFIQXRpV8Gu741B+9E1QaeANMFlbb3BfxhKwTMOoMHhCV3BpM61weu3/b8nrJXBVgXUwcYW4UBNUvvAIbN3QTlGjMFTS15Bz1WTwWiFlUFeG71AxJi9wQIY67+EX4RBtjg/QLlQm78KYbNBT8OPQQvmyj+dO5RBtgYzwLq5hME4NJXB2MunQTwpe8F0bOTBwbGIQR9YpEG9I4RBch1OQBgOq0FAeHzArRNcQV46rUHLtYBBE3T+wCpIr8Hk7ufAOat6wQKiEsHJT2tA9Vo2QY+askF/C4xBS1ppQZcTBEGsUZxBGqyKwQFG/D+EjpZBftsuwfEqn8EKhLu/GueQwedyk8HJJWJBSMsKwWZtrUADpXpBV9mFwTgSdMCndPTAhY6Vv8ajqEGz/LJBWR1EQY2mKcHDAbXB4l02QdoVtMDpzuS/NQudwd4ax0GpleRAYuKmQGH1cL9PPXtBnoGXwNfW/sDOO4TBSQ7mwdbpOUGleFfB0zq5wfmScMFrPofBfsxrv4YDUsEBELdBAP64vuaGyUHTDnjBrf87QWYcmMGzUZy/IM+KQQ7NnEEMjI5BfodowehwtkFMqbDBQ2mpwWY/6ECabC3BZi0jwfhHNEBZoJRBo5OZQYqoccE+BVLBIIqlQTYV+MAIQdBAln+gQX9ehcEhyGg/9D31QECoNMHCqUpBwsb1QKPyGMGXTJXBaNxIwZ2zzUCcCfY/d2l9QYIcb0D7ABlBYjnTwbYkWME5ixDBBHDFwP+Na8B3DSu/UN3VwFvNdMGP+mhBuAEywXKsP8H0F2bAqS0fwc1SN0FRgQDBDsvYwWhHScAv+WBASasmQbVMp0EiLJtAGaB6QZOJyj9ODWNAmWiqwWwd38B+hDjB72N4QA1zosGmFLa9WumjwHOd+r+l5M7BMrpeQbZaaEFXSRXAWgs/wc7XFMH7GCjBK/ynQZkXiUFogGDBiNe6QE2rhEEngojBYqCRQURhREG8vbBBgESsQQUpeT8dcljB/5+DQEETiUETaXJBC/1qQHlx60CsjyJBiNgmwfV/wL/hRS5BcXpBQaa7lsGZL6rBEHeRQTdH+8BOUWzBbk+2wXh6nUHzoSZAKqxVwVymNMFEFrzAbjDzwD8hmMHLs71A9DQ/QfxcL0DykcXA1ar3vooj/z6n5jhBqfu4wXmLr0Ce56fAJ+iWQbVFikG3t55BAi2MQSWkLcHJU5DB73N8wVi2Q0DPYcXBc49iQVQeT8ECdYVB/9GKQYCu6z9UF1lBSbr0QAdsgEFc9NXBzcgwwBPuYMEfGGvBHWJlQR8nzcGaQ4RBEbltQCZ/VcExRYhBcj9HwdxjdsAw5pvBpXgIwWmzmEEZKYbAy+h+QcQVosD4GCnBh3ajQehDTkGXDi7BjwWwwANp8EDwcMTBiqmsvyiLk0CIcULBO9czQSBXIsDtvZ5BwXSQv3Q1hMGS02hB4bJsQTDDW0B7JnRAT9OWvuvACMAVhPfAhR9+v4bFLEHXApBBalI8QaH4wEG2E7rBJPRvQS2XbcFbogTBM6LIPiw7ZcAzXElAn27QwKN2IkF/Dn/Bt+0owfskJcGbzntBHRnUwaFjccBv0h1BcBytwf3DLcEgjT/BTKVMQfeOX0H8hIZBJ7EcQB6GnsGPf3nBri7XQEGoTUGtoRzBbMDUQIqMH0FmkpRA0rN7Pw2ip8Cu+j3BIDWVP+c3qcBgD5FBJNyHQSWwT8G9f2nAoiKdQadWXsE0DB/BJL2iQTp1k8AN5By/1QUxQA/CVsHg8Kw/j0ZjwUqixMHFyFHB/xaQwQwNvUAX53PBNaB4QW0KfcE8Ul3BouIvwZrTNUFKOO/AKkltQHhL40DcyYA/Z954wfnbhEGEcLvBgDk/QYa+tsG0yIY/5tLxQAn4bUFxzXtBlEGNQa4xn0C9WIhBGm5NwRK7H8FOruDB6CYcwMiJUMFOlK5AurqtQe82jEHiVnxBDVLAwd+c3MEqpaq/1/cowV5bJkEP6VnBKYqTweNaGcFn/2TBrX60P2ehNUFAovjAjd1rQJc7hUGR7o5Bm6foP9LeUMHnepJBi3GEQMf3E8EDNkhBDA0wQTswikF89UhAhASaPxH1HkGT4qC/BEcwwWZGlUG+cPO+mGu8wQkSIsFm6PPA/x9JwVGFmcG2sY+/W/uJwSsln8GHeCxB7UO5PlmMVECshn1AL6iIQCcDlMF1S9/A/o0CQEiwez99mjbBog9FP7/BYT+np3lBANc6weYLRsE+3X/BtAVpwSovrcHDuQPBdmObvyliTkCZCVNBjtAAQbGWxMGB9W1AevuTwQW1uT4+MKTBr6P9wBuBN8HwFy1BqwGXQZc0DkEjb1VBAW31wJ3vJb8WIYZA2A+5wCPgYcGbwTbAlv9+wSZGkb7gzs3Auf99wZq1c0H0g3JBGvZMP+639MDFYxK/qAw1wZrEDsEbCcBAQsV9wSoyBkGXwLy9ARmxwDaTnUFGaBTBchzTQH6lhEEChYPBbq0owW7g90Bvxb7A4sA8wbQBpkAY1gDBlDa/P7bfkkE8Pg0+j+JyQW9XdMEUIGjB2paEweBWZ0AcOJdBkExdPzH0mcFyGPlA8q8owEzkcEFJnKbBG3Y8waF+F0Eem6nBqp7OwWQ9MUGLDZJBYdBcwLMJhsFks/u+dR6gwIJshMEpxX/BsIZrQd0RIT8FfZvBULckwdouDkEFRCdARC9oQVzIhEGsTk5ALLSLQTqIqsAtbu+/JTnJQGPkfMESpoTByrOrQC2eLsHfOho/TeS+ve4L10DSVrjBFzHHQN+yQ8FxGF0+h2VQQZUewj/trU9BPrduQa0dd8CoKTA+wMZlQcwUfUEAW1hBP+WJQTP2EcFF9UBBSArewWILFEHY/J6/2PUywWqCjUEa9jrA17VRQfcjUcEOw1PBYNI0wdT5ikHkjxRBFplpwYWGKcDB623BaZVWQEpVbMEObYbBhhCYQfHiTr/3KplBMys/QWcgCkFoQaJAvYuFQauz/sCjMVlBePEAwcRPmb9FDlpBDLCZwaJNisD+LTTBfVeLwHJ4aL8WKWLB/3l7wHRNE8ExTR9B0QEswKW99cB5zyHBOzvnwL1gEEDm6HW+chQUQcMcD8GZBvBA1MiWQdPpR0GtgM/BMeUQwPK3bUHa7MTB9tP7wPwz7MCmUFNBrFWHwXDOu0Cyfoc/4LKJwTyMlsEKxTtB0rM+wSBia0Bm5E/Bf2gzwO8rHkFekL7AzjYYQfexhkEF/qLB1X7AwXWlf8G4SjjAX9r6v83iRkFF/4HBCwmnQNO3V0FcGxnBr0siwbISLj+ZCF6/egdDwOIUZkH/PFW/W3DywACvVUF4yC3Bo6prQc7CAEG5RExAyYnUPspwaEHQgzpBAZQUQZLsAEA8ag1BjZ9Bwb6ejkEuRJBBCOkmQUN0jcG6yLtAiZvEQAzaNkA+M4c/KLATQfIrb8FqcZpAZRgMwS+HicDZv4xAw5MhQPhy40C+GhhA3w1dQdHIqD/I86bBEHyVPkbOSEHa+dI/H7+AQQYI1ECUMrNAFPjrvyKXF0HWigZB+EtfQRF9AMBM9Kg+wkHvvvS1VEGkOEZBCfWvQMckFsAIwJo8PW2JQMol/UBEZgLBYvEzPWUDH0H3+3PA+De0vkbGjUAbbIhA9oOkQPrRBEEYMbo+gTePwCnXLsD2zajA8YluQIh+ij/efpxAgrE6wAcIFUHz/da/dYS7PxiZcME=\"},\"shape\":[1043],\"dtype\":\"float32\",\"order\":\"little\"}],[\"text\",{\"type\":\"ndarray\",\"array\":[\"\\u0441\\u0438\\u0441\\u0442\\u0435\\u043c\\u0430\",\"\\u0440\\u0430\\u0431\\u043e\\u0442\\u0430\",\"\\u0442\\u0440\\u0435\\u0431\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0431\\u0430\\u0437\\u0430\",\"\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044c\",\"\\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0430\",\"\\u043c\\u043e\\u0434\\u0435\\u043b\\u044c\",\"\\u0438\\u043d\\u0444\\u043e\\u0440\\u043c\\u0430\\u0446\\u0438\\u044f\",\"\\u0441\\u0443\\u0431\\u0434\",\"\\u044d\\u0442\\u0430\\u043f\",\"\\u043e\\u0448\\u0438\\u0431\\u043a\\u0430\",\"\\u0444\\u0443\\u043d\\u043a\\u0446\\u0438\\u044f\",\"\\u044f\\u0432\\u043b\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u0442\\u0430\\u0431\\u043b\\u0438\\u0446\\u0430\",\"\\u0441\\u0440\\u0435\\u0434\\u0441\\u0442\\u0432\\u043e\",\"\\u043f\\u0440\\u043e\\u0435\\u043a\\u0442\",\"\\u0441\\u0435\\u0440\\u0432\\u0435\\u0440\",\"\\u043f\\u0440\\u043e\\u0446\\u0435\\u0441\\u0441\",\"\\u0434\\u043e\\u043a\\u0443\\u043c\\u0435\\u043d\\u0442\",\"\\u043f\\u0440\\u043e\\u0433\\u0440\\u0430\\u043c\\u043c\\u0430\",\"\\u0438\\u0441\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u0441\\u043e\\u0441\\u0442\\u043e\\u044f\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u043e\\u0435\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u043e\\u0433\\u0440\\u0430\\u043c\\u043c\\u043d\\u044b\\u0439\",\"\\u0441\\u043b\\u0443\\u0447\\u0430\\u0439\",\"\\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u0435\",\"\\u043c\\u043e\\u0434\\u0443\\u043b\\u044c\",\"\\u0432\\u0440\\u0435\\u043c\\u044f\",\"\\u043e\\u0431\\u044a\\u0435\\u043a\\u0442\",\"\\u0437\\u0430\\u043a\\u0430\\u0437\\u0447\\u0438\\u043a\",\"\\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435\",\"\\u0440\\u0435\\u0430\\u043b\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f\",\"\\u043f\\u0440\\u0430\\u0432\\u0438\\u043b\\u043e\",\"\\u0440\\u0435\\u0437\\u0443\\u043b\\u044c\\u0442\\u0430\\u0442\",\"\\u0432\\u0438\\u0434\",\"\\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u0447\\u0438\\u043a\",\"\\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0442\\u0435\\u0445\\u043d\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u043c\\u0435\\u0442\\u043e\\u0434\",\"\\u0442\\u0435\\u0441\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0441\\u043b\\u0435\\u0434\\u0443\\u044e\\u0449\\u0438\\u0439\",\"\\u0437\\u0430\\u0434\\u0430\\u0447\\u0430\",\"\\u0438\\u0441\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043e\\u0431\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0430\",\"\\u0447\\u0430\\u0441\\u0442\\u044c\",\"\\u043f\\u043e\\u0437\\u0432\\u043e\\u043b\\u044f\\u0442\\u044c\",\"\\u043a\\u043b\\u0438\\u0435\\u043d\\u0442\",\"\\u0438\\u043d\\u0442\\u0435\\u0440\\u0444\\u0435\\u0439\\u0441\",\"\\u043f\\u0435\\u0440\\u0435\\u0445\\u043e\\u0434\",\"\\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u0435\",\"\\u043e\\u0431\\u0435\\u0441\\u043f\\u0435\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u0438\\u043d\\u0444\\u043e\\u0440\\u043c\\u0430\\u0446\\u0438\\u043e\\u043d\\u043d\\u044b\\u0439_\\u0441\\u0438\\u0441\\u0442\\u0435\\u043c\\u0430\",\"\\u043d\\u043e\\u0432\\u044b\\u0439\",\"\\u0438\\u0437\\u043c\\u0435\\u043d\\u0435\\u043d\\u0438\\u0435\",\"\\u0430\\u0442\\u0440\\u0438\\u0431\\u0443\\u0442\",\"\\u043e\\u0441\\u043d\\u043e\\u0432\\u043d\\u044b\\u0439\",\"\\u043a\\u043e\\u0434\",\"\\u0440\\u0435\\u0448\\u0435\\u043d\\u0438\\u0435\",\"\\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\",\"\\u043e\\u043f\\u0435\\u0440\\u0430\\u0446\\u0438\\u044f\",\"\\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f\",\"\\u043f\\u0440\\u0435\\u0434\\u043f\\u0440\\u0438\\u044f\\u0442\\u0438\\u0435\",\"\\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\",\"\\u044f\\u0437\\u044b\\u043a\",\"\\u0443\\u0440\\u043e\\u0432\\u0435\\u043d\\u044c\",\"\\u0443\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u043b\\u0430\\u0442\\u0444\\u043e\\u0440\\u043c\\u0430\",\"\\u0438\\u043d\\u0444\\u043e\\u0440\\u043c\\u0430\\u0446\\u0438\\u043e\\u043d\\u043d\\u044b\\u0439\",\"\\u0433\\u0440\\u0443\\u043f\\u043f\\u0430\",\"\\u0430\\u043d\\u0430\\u043b\\u0438\\u0437\",\"\\u043a\\u0430\\u0436\\u0434\\u044b\\u0439\",\"\\u043a\\u043e\\u043c\\u043f\\u043e\\u043d\\u0435\\u043d\\u0442\",\"\\u0441\\u0442\\u0440\\u0443\\u043a\\u0442\\u0443\\u0440\\u0430\",\"\\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\",\"\\u0438\\u0441\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0434\\u0432\\u0430\",\"\\u043f\\u0440\\u043e\\u0434\\u0443\\u043a\\u0442\",\"\\u044d\\u043b\\u0435\\u043c\\u0435\\u043d\\u0442\",\"\\u0441\\u0432\\u044f\\u0437\\u044c\",\"\\u0440\\u0430\\u0431\\u043e\\u0442\\u0430\\u0442\\u044c\",\"\\u043d\\u0435\\u043e\\u0431\\u0445\\u043e\\u0434\\u0438\\u043c\\u044b\\u0439\",\"\\u0442\\u0435\\u0441\\u0442\",\"\\u0440\\u0435\\u0430\\u043b\\u0438\\u0437\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043e\\u0442\\u043d\\u043e\\u0448\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043e\\u0431\\u0449\\u0438\\u0439\",\"\\u043e\\u0431\\u043b\\u0430\\u0441\\u0442\\u044c\",\"\\u0442\\u0438\\u043f\",\"\\u0446\\u0435\\u043b\\u044c\",\"oracle\",\"\\u043e\\u0440\\u0433\\u0430\\u043d\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f\",\"\\u0441\\u0443\\u0449\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0444\\u043e\\u0440\\u043c\\u0430\",\"\\u043e\\u043f\\u0438\\u0441\\u0430\\u043d\\u0438\\u0435\",\"\\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u0435\",\"\\u0441\\u043e\\u0434\\u0435\\u0440\\u0436\\u0430\\u0442\\u044c\",\"\\u043d\\u0430\\u0431\\u043e\\u0440\",\"\\u0434\\u0438\\u0430\\u0433\\u0440\\u0430\\u043c\\u043c\\u0430\",\"\\u0431\\u0438\\u0437\\u043d\\u0435\\u0441\",\"\\u0437\\u043d\\u0430\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u0440\\u043e\\u043a\",\"\\u0441\\u043e\\u0441\\u0442\\u0430\\u0432\",\"\\u043e\\u043f\\u0435\\u0440\\u0430\\u0446\\u0438\\u043e\\u043d\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u0434\\u0441\\u0438\\u0441\\u0442\\u0435\\u043c\\u0430\",\"1\",\"\\u0432\\u043e\\u043f\\u0440\\u043e\\u0441\",\"\\u043a\\u0430\\u0447\\u0435\\u0441\\u0442\\u0432\\u043e\",\"\\u0430\\u0440\\u0445\\u0438\\u0442\\u0435\\u043a\\u0442\\u0443\\u0440\\u0430\",\"\\u0441\\u0438\\u0441\\u0442\\u0435\\u043c\\u043d\\u044b\\u0439\",\"\\u043e\\u0431\\u0435\\u0441\\u043f\\u0435\\u0447\\u0438\\u0432\\u0430\\u0442\\u044c\",\"\\u043f\\u0435\\u0440\\u0435\\u0447\\u0435\\u043d\\u044c\",\"\\u043f\\u0440\\u043e\\u0435\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0449\\u0438\\u043a\",\"\\u0432\\u0432\\u043e\\u0434\",\"\\u0443\\u0441\\u043b\\u043e\\u0432\\u0438\\u0435\",\"\\u0441\\u043b\\u043e\\u0436\\u043d\\u044b\\u0439\",\"\\u0444\\u0443\\u043d\\u043a\\u0446\\u0438\\u043e\\u043d\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u044f\\u0442\\u044c\",\"\\u044d\\u043a\\u0441\\u043f\\u043b\\u0443\\u0430\\u0442\\u0430\\u0446\\u0438\\u044f\",\"\\u0438\\u043c\\u0435\\u0442\\u044c\",\"sql\",\"\\u0444\\u0430\\u0439\\u043b\",\"\\u0432\\u0435\\u0440\\u0441\\u0438\\u044f\",\"\\u0440\\u0430\\u0437\\u043b\\u0438\\u0447\\u043d\\u044b\\u0439\",\"\\u043a\\u043e\\u043b\\u0438\\u0447\\u0435\\u0441\\u0442\\u0432\\u043e\",\"\\u043e\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u0443\\u0447\\u0451\\u0442\",\"\\u0441\\u0445\\u0435\\u043c\\u0430\",\"\\u043e\\u0442\\u0434\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0434\\u043e\\u043a\\u0443\\u043c\\u0435\\u043d\\u0442\\u0430\\u0446\\u0438\\u044f\",\"\\u0437\\u0430\\u043a\\u0430\\u0437\",\"\\u0434\\u0435\\u044f\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043f\\u043e\\u0440\\u044f\\u0434\\u043e\\u043a\",\"\\u0438\\u043d\\u0441\\u0442\\u0440\\u0443\\u043a\\u0446\\u0438\\u044f\",\"web\",\"windows\",\"\\u043f\\u043e\\u043b\\u0443\\u0447\\u0438\\u0442\\u044c\",\"\\u043e\\u0442\\u0447\\u0451\\u0442\",\"\\u0444\\u0443\\u043d\\u043a\\u0446\\u0438\\u043e\\u043d\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0447\\u0438\\u0441\\u043b\\u043e\",\"\\u0445\\u0430\\u0440\\u0430\\u043a\\u0442\\u0435\\u0440\\u0438\\u0441\\u0442\\u0438\\u043a\\u0430\",\"\\u043e\\u0433\\u0440\\u0430\\u043d\\u0438\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u043e\\u0431\\u0440\\u0430\\u0437\",\"\\u043d\\u0430\\u043b\\u0438\\u0447\\u0438\\u0435\",\"\\u0431\\u0434\",\"\\u043f\\u0440\\u043e\\u0431\\u043b\\u0435\\u043c\\u0430\",\"\\u043e\\u0441\\u043d\\u043e\\u0432\\u0430\",\"\\u0430\\u0434\\u043c\\u0438\\u043d\\u0438\\u0441\\u0442\\u0440\\u0430\\u0442\\u043e\\u0440\",\"\\u043a\\u043e\\u043d\\u0444\\u0438\\u0433\\u0443\\u0440\\u0430\\u0446\\u0438\\u044f\",\"server\",\"\\u0438\\u043d\\u0434\\u0435\\u043a\\u0441\",\"\\u043a\\u043e\\u043d\\u0442\\u0440\\u043e\\u043b\\u044c\",\"\\u043e\\u0431\\u044a\\u0451\\u043c\",\"\\u0440\\u0443\\u043a\\u043e\\u0432\\u043e\\u0434\\u0441\\u0442\\u0432\\u043e\",\"\\u043f\\u0440\\u0435\\u043e\\u0431\\u0440\\u0430\\u0437\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0441\\u0435\\u0442\\u044c\",\"\\u0445\\u0440\\u0430\\u043d\\u0435\\u043d\\u0438\\u0435\",\"\\u0431\\u043e\\u043b\\u044c\\u0448\\u0438\\u0439\",\"\\u0438\\u0441\\u0445\\u043e\\u0434\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u0438\\u0441\\u043a\",\"\\u043f\\u0440\\u0438\\u043c\\u0435\\u0440\",\"\\u043f\\u0440\\u0435\\u0434\\u0441\\u0442\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u0437\\u0430\\u0434\\u0430\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u0435\\u0434\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c\",\"\\u0440\\u0435\\u043b\\u044f\\u0446\\u0438\\u043e\\u043d\\u043d\\u044b\\u0439\",\"\\u043f\\u0435\\u0440\\u0432\\u044b\\u0439\",\"\\u043f\\u0440\\u043e\\u0433\\u0440\\u0430\\u043c\\u043c\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0440\\u0438\\u0441\",\"\\u0442\\u0440\\u0430\\u043d\\u0437\\u0430\\u043a\\u0446\\u0438\\u044f\",\"\\u043c\\u0435\\u0441\\u0442\\u043e\",\"\\u043f\\u0440\\u043e\\u0432\\u0435\\u0440\\u043a\\u0430\",\"\\u0441\\u043e\\u0441\\u0442\\u043e\\u044f\\u0442\\u044c\",\"\\u0441\\u0447\\u0451\\u0442\",\"\\u043f\\u0440\\u0435\\u0434\\u0441\\u0442\\u0430\\u0432\\u043b\\u044f\\u0442\\u044c\",\"\\u0432\\u0437\\u0430\\u0438\\u043c\\u043e\\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u0435\",\"\\u043f\\u0440\\u043e\\u0441\\u0442\\u043e\\u0439\",\"\\u0441\\u043f\\u0435\\u0446\\u0438\\u0444\\u0438\\u043a\\u0430\\u0446\\u0438\\u044f\",\"\\u0441\\u043e\\u0437\\u0434\\u0430\\u0442\\u044c\",\"\\u043f\\u0430\\u043c\\u044f\\u0442\\u044c\",\"\\u0442\\u043e\\u0447\\u043a\\u0430\",\"\\u0441\\u0440\\u0435\\u0434\\u0430\",\"\\u043e\\u0431\\u043c\\u0435\\u043d\",\"\\u043a\\u043e\\u043c\\u043f\\u044c\\u044e\\u0442\\u0435\\u0440\",\"\\u043d\\u0430\\u0438\\u043c\\u0435\\u043d\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0430\\u0438\\u0441\",\"\\u0432\\u0430\\u0436\\u043d\\u044b\\u0439\",\"\\u043a\\u043e\\u043d\\u0435\\u0447\\u043d\\u044b\\u0439_\\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\",\"\\u043e\\u043f\\u0438\\u0441\\u0430\\u0442\\u044c\",\"\\u0437\\u0430\\u043f\\u0438\\u0441\\u044c\",\"\\u0441\\u043f\\u0438\\u0441\\u043e\\u043a\",\"\\u043f\\u0440\\u043e\\u0433\\u0440\\u0430\\u043c\\u043c\\u0438\\u0441\\u0442\",\"\\u0442\\u0435\\u0445\\u043d\\u043e\\u043b\\u043e\\u0433\\u0438\\u044f\",\"\\u0432\\u044b\\u0434\\u0435\\u043b\\u0438\\u0442\\u044c\",\"\\u043a\\u043e\\u043c\\u0430\\u043d\\u0434\\u0430\",\"2\",\"\\u0441\\u0432\\u044f\\u0437\\u0430\\u0442\\u044c\",\"\\u0441\\u043e\\u0437\\u0434\\u0430\\u0432\\u0430\\u0442\\u044c\",\"\\u043f\\u0440\\u0438\\u043d\\u0446\\u0438\\u043f\",\"\\u0438\\u043c\\u044f\",\"\\u043f\\u0440\\u043e\\u0438\\u0437\\u0432\\u043e\\u0434\\u0438\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0445\\u0440\\u0430\\u043d\\u0438\\u043b\\u0438\\u0449\\u0435\",\"\\u0432\\u044b\\u0431\\u0440\\u0430\\u0442\\u044c\",\"\\u0445\\u043e\\u0440\\u043e\\u0448\\u0438\\u0439\",\"\\u0440\\u0430\\u0431\\u043e\\u0447\\u0438\\u0439\",\"\\u043d\\u0435\\u0441\\u043a\\u043e\\u043b\\u044c\\u043a\\u043e\",\"\\u0438\\u043c\\u0435\\u0442\\u044c\\u0441\\u044f\",\"\\u0440\\u0435\\u0436\\u0438\\u043c\",\"\\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u043a\\u0430\",\"\\u0437\\u0430\\u0449\\u0438\\u0442\\u0430\",\"\\u0434\\u043e\\u0441\\u0442\\u0430\\u0442\\u043e\\u0447\\u043d\\u043e\",\"\\u0442\\u0440\\u0435\\u0431\\u043e\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u043e\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\\u0438\\u0442\\u044c\",\"\\u043f\\u043e\\u043b\\u043d\\u044b\\u0439\",\"\\u0440\\u0430\\u0437\\u043d\\u044b\\u0439\",\"\\u0434\\u0430\\u043d\\u043d\\u044b\\u043c\\u0438\",\"java\",\"\\u043e\\u043f\\u0435\\u0440\\u0430\\u0442\\u0438\\u0432\\u043d\\u044b\\u0439\",\"\\u0441\\u0432\\u0435\\u0434\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u043e\\u043e\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0443\\u044e\\u0449\\u0438\\u0439\",\"\\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\",\"\\u043e\\u0442\\u043d\\u043e\\u0441\\u0438\\u0442\\u044c\\u0441\\u044f\",\"\\u0444\\u043e\\u0440\\u043c\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0434\\u043e\\u043a\\u0443\\u043c\\u0435\\u043d\\u0442\\u043e\\u043e\\u0431\\u043e\\u0440\\u043e\\u0442\",\"\\u0432\\u044b\\u0431\\u043e\\u0440\",\"\\u043c\\u043e\\u043c\\u0435\\u043d\\u0442\",\"\\u043e\\u043f\\u0435\\u0440\\u0430\\u0442\\u043e\\u0440\",\"\\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0438\\u0442\\u044c\",\"\\u043f\\u0430\\u043a\\u0435\\u0442\",\"\\u0432\\u044b\\u0437\\u043e\\u0432\",\"\\u043e\\u043f\\u0438\\u0441\\u044b\\u0432\\u0430\\u0442\\u044c\",\"\\u043e\\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u043b\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u043e\\u0442\\u043a\\u0430\\u0437\",\"\\u043a\\u043e\\u043d\\u043a\\u0440\\u0435\\u0442\\u043d\\u044b\\u0439\",\"1\\u0441\",\"\\u0430\\u043d\\u0430\\u043b\\u0438\\u0442\\u0438\\u043a\",\"\\u043e\\u0441\\u043e\\u0431\\u0435\\u043d\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0432\\u0442\\u043e\\u0440\\u043e\\u0439\",\"\\u0441\\u0442\\u043e\\u0440\\u043e\\u043d\\u0430\",\"\\u043f\\u043e\\u0442\\u043e\\u043a\",\"\\u043f\\u0440\\u0438\\u0432\\u0435\\u0441\\u0442\\u0438\",\"\\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u0430\\u0442\\u044c\",\"\\u043c\\u043d\\u043e\\u0436\\u0435\\u0441\\u0442\\u0432\\u043e\",\"\\u043e\\u0431\\u043b\\u0430\\u0434\\u0430\\u0442\\u044c\",\"\\u043f\\u0435\\u0440\\u0441\\u043e\\u043d\\u0430\\u043b\",\"\\u0431\\u043e\\u043b\\u044c\\u0448\\u0438\\u043d\\u0441\\u0442\\u0432\\u043e\",\"\\u043e\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\\u044f\\u0442\\u044c\",\"\\u043d\\u0430\\u0434\\u0451\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0441\\u043e\\u043e\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u0437\\u0430\\u0432\\u0438\\u0441\\u0438\\u043c\\u043e\\u0441\\u0442\\u044c\",\"\\u0441\\u0435\\u0440\\u0432\\u0435\\u0440\\u043d\\u044b\\u0439\",\"\\u0441\\u043f\\u043e\\u0441\\u043e\\u0431\",\"\\u0442\\u043e\\u0432\\u0430\\u0440\",\"\\u043f\\u043e\\u0441\\u0442\\u0440\\u043e\\u0435\\u043d\\u0438\\u0435\",\"\\u0432\\u0445\\u043e\\u0434\\u0438\\u0442\\u044c\",\"\\u043f\\u043e\\u0434\\u0445\\u043e\\u0434\",\"\\u0441\\u043e\\u0437\\u0434\\u0430\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"3\",\"\\u043d\\u0430\\u0437\\u043d\\u0430\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u0438\\u0441\\u0442\\u043e\\u0447\\u043d\\u0438\\u043a\",\"\\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\\u0438\\u0437\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043c\\u0435\\u0445\\u0430\\u043d\\u0438\\u0437\\u043c\",\"\\u0438\\u0441\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u0435\",\"\\u0432\\u043e\\u0437\\u043d\\u0438\\u043a\\u0430\\u0442\\u044c\",\"\\u0432\\u043d\\u0435\\u0434\\u0440\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u043e\\u0446\\u0435\\u0434\\u0443\\u0440\\u0430\",\"\\u0432\\u044b\\u0441\\u043e\\u043a\\u0438\\u0439\",\"\\u043a\\u043b\\u044e\\u0447\",\"\\u043a\\u043b\\u0438\\u0435\\u043d\\u0442\\u0441\\u043a\\u0438\\u0439\",\"\\u0441\\u043e\\u0442\\u0440\\u0443\\u0434\\u043d\\u0438\\u043a\",\"\\u043e\\u043a\\u043e\\u043d\\u0447\\u0430\\u043d\\u0438\\u0435\",\"\\u0440\\u0430\\u0437\\u0434\\u0435\\u043b\",\"\\u0441\\u043e\\u043e\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0438\\u0435\",\"\\u043e\\u0442\\u043c\\u0435\\u0442\\u0438\\u0442\\u044c\",\"\\u0441\\u0431\\u043e\\u0439\",\"\\u0443\\u0434\\u043e\\u0431\\u043d\\u044b\\u0439\",\"\\u0431\\u043e\\u043b\\u044c\\u0448\\u043e\\u0439\",\"\\u0446\\u0435\\u043b\\u043e\\u0435\",\"\\u043e\\u0446\\u0435\\u043d\\u043a\\u0430\",\"4\",\"\\u0440\\u0430\\u0441\\u0441\\u043c\\u043e\\u0442\\u0440\\u0435\\u0442\\u044c\",\"\\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\",\"\\u0438\\u043d\\u0442\\u0435\\u0440\\u043d\\u0435\\u0442\",\"\\u0443\\u0437\\u0435\\u043b\",\"\\u043c\\u0435\\u0442\\u043e\\u0434\\u043e\\u043b\\u043e\\u0433\\u0438\\u044f\",\"\\u043f\\u0440\\u043e\\u0446\\u0435\\u0441\\u0441\\u043e\\u0440\",\"\\u043e\\u0441\\u043d\\u043e\\u0432\\u043d\\u043e\\u0439\",\"\\u043a\\u043b\\u0430\\u0441\\u0441\",\"\\u043e\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\\u0451\\u043d\\u043d\\u044b\\u0439\",\"\\u043c\\u0431\\u0430\\u0439\\u0442\",\"\\u0432\\u043a\\u043b\\u044e\\u0447\\u0430\\u0442\\u044c\",\"\\u0437\\u0430\\u0433\\u0440\\u0443\\u0437\\u043a\\u0430\",\"\\u0441\\u0438\\u0442\\u0443\\u0430\\u0446\\u0438\\u044f\",\"\\u043f\\u0430\\u0440\\u0430\\u043c\\u0435\\u0442\\u0440\",\"\\u0441\\u0442\\u0440\\u0430\\u0442\\u0435\\u0433\\u0438\\u044f\",\"8.1\",\"xp\",\"\\u0440\\u0435\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0442.\\u043f.\",\"\\u0441\\u0434\\u0435\\u043b\\u0430\\u0442\\u044c\",\"\\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\",\"\\u0438\\u0437\\u0432\\u0435\\u0441\\u0442\\u043d\\u044b\\u0439\",\"\\u043e\\u0431\\u0440\\u0430\\u0431\\u0430\\u0442\\u044b\\u0432\\u0430\\u0442\\u044c\",\"\\u0442\\u0440\\u0438\",\"\\u043e\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u043d\\u0430\\u0441\\u0442\\u0440\\u043e\\u0439\\u043a\\u0430\",\"\\u043f\\u0440\\u043e\\u0432\\u043e\\u0434\\u0438\\u0442\\u044c\\u0441\\u044f\",\"\\u0441\\u043e\\u0434\\u0435\\u0440\\u0436\\u0430\\u043d\\u0438\\u0435\",\"\\u0430\\u043f\\u043f\\u0430\\u0440\\u0430\\u0442\\u043d\\u044b\\u0439\",\"ms\",\"\\u0444\\u0438\\u0437\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u0432\\u043d\\u0443\\u0442\\u0440\\u0435\\u043d\\u043d\\u0438\\u0439\",\"\\u0434\\u0430\\u043d\\u043d\\u044b\\u043c\",\"\\u0432\\u043d\\u0435\\u0448\\u043d\\u0438\\u0439\",\"\\u0444\\u043e\\u0440\\u043c\\u0430\\u0442\",\"\\u043e\\u0444\\u043e\\u0440\\u043c\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u0440\\u0430\\u043c\\u043a\\u0430\",\"\\u043c\\u0430\\u0442\\u0435\\u0440\\u0438\\u0430\\u043b\",\"\\u0444\\u0438\\u0440\\u043c\\u0430\",\"\\u0441\\u0442\\u0430\\u0434\\u0438\\u044f\",\"\\u0447\\u0435\\u043b\\u043e\\u0432\\u0435\\u043a\",\"\\u0434\\u0435\\u043b\\u0430\\u0442\\u044c\",\"\\u043e\\u0431\\u0441\\u043b\\u0443\\u0436\\u0438\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0433\\u043e\\u0434\",\"\\u043a\\u043e\\u043c\\u043f\\u0430\\u043d\\u0438\\u044f\",\"uml\",\"intel\",\"pentium\",\"\\u0445\\u0440\\u0430\\u043d\\u0438\\u0442\\u044c\",\"\\u043f\\u0440\\u0438\\u0432\\u0438\\u043b\\u0435\\u0433\\u0438\\u044f\",\"\\u0445\\u0440\\u0430\\u043d\\u0438\\u0442\\u044c\\u0441\\u044f\",\"\\u0442\\u0440\\u0435\\u0431\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043e\\u0441\",\"\\u0432\\u0445\\u043e\\u0434\\u043d\\u043e\\u0439\",\"\\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u0435\\u0434\\u043e\\u0441\\u0442\\u0430\\u0432\\u043b\\u044f\\u0442\\u044c\",\"\\u0440\\u0430\\u0441\\u0447\\u0451\\u0442\",\"jdbc\",\"microsoft\",\"\\u0432\\u043d\\u0438\\u043c\\u0430\\u043d\\u0438\\u0435\",\"\\u0434\\u0430\\u0442\\u0430\",\"a\",\"\\u0434\\u0435\\u043b\\u043e\",\"\\u0441\\u0442\\u0435\\u043f\\u0435\\u043d\\u044c\",\"\\u043e\\u0441\\u043d\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u044b\\u0439\",\"\\u0431\\u0435\\u0437\\u043e\\u043f\\u0430\\u0441\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0434\\u043e\\u0433\\u043e\\u0432\\u043e\\u0440\",\"\\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0442\\u044c\",\"\\u0437\\u0430\\u0432\\u0438\\u0441\\u0435\\u0442\\u044c\",\"\\u0440\\u0430\\u0437\\u0432\\u0438\\u0442\\u0438\\u0435\",\"\\u043f\\u0440\\u0438\\u043d\\u044f\\u0442\\u044c\",\"\\u0441\\u043b\\u043e\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043f\\u0440\\u043e\\u0433\\u0440\\u0430\\u043c\\u043c\\u043d\\u044b\\u0439_\\u043e\\u0431\\u0435\\u0441\\u043f\\u0435\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u043e\\u0438\\u0441\\u0445\\u043e\\u0434\\u0438\\u0442\\u044c\",\"\\u0432\\u044b\\u0432\\u043e\\u0434\",\"\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u0438\\u0442\\u044c\\u0441\\u044f\",\"\\u0438\\u0441\\u043f\\u043e\\u043b\\u043d\\u0438\\u0442\\u0435\\u043b\\u044c\",\"\\u0442\\u0435\\u043a\\u0441\\u0442\",\"\\u0443\\u043a\\u0430\\u0437\\u0430\\u0442\\u044c\",\"\\u043f\\u0440\\u0435\\u0434\\u043f\\u043e\\u043b\\u0430\\u0433\\u0430\\u0442\\u044c\",\"linux\",\"\\u0434\\u0438\\u043f\\u043b\\u043e\\u043c\\u043d\\u044b\\u0439\",\"\\u044d\\u0444\\u0444\\u0435\\u043a\\u0442\\u0438\\u0432\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u043b\\u0443\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u043c\\u0433\\u0446\",\"\\u0438\\u043d\\u0444\\u043e\\u0440\\u043c\\u0430\\u0446\\u0438\\u043e\\u043d\\u043d\\u044b\\u0439_\\u043c\\u043e\\u0434\\u0435\\u043b\\u044c\",\"\\u043f\\u0435\\u0440\\u0438\\u043e\\u0434\",\"\\u0433\\u043b\\u0430\\u0432\\u043d\\u044b\\u0439\",\"\\u043c\\u0430\\u0448\\u0438\\u043d\\u0430\",\"\\u043f\\u043e\\u0441\\u043b\\u0435\\u0434\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043a\\u0430\\u043a\\u043e\\u0439\",\"\\u0441\\u043e\\u0435\\u0434\\u0438\\u043d\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u043e\\u0431\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u044b\\u0439\",\"\\u043e\\u043a\\u0430\\u0437\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0441\\u0442\\u0440\\u043e\\u043a\\u0430\",\"\\u043f\\u0440\\u0435\\u0434\\u0443\\u0441\\u043c\\u043e\\u0442\\u0440\\u0435\\u0442\\u044c\",\"\\u043f\\u0440\\u0435\\u0434\\u043d\\u0430\\u0437\\u043d\\u0430\\u0447\\u0438\\u0442\\u044c\",\"\\u043f\\u0440\\u043e\\u0432\\u0435\\u0434\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u043b\\u043e\\u0432\\u0430\\u0440\\u044c\",\"\\u043e\\u043e\\u043e\",\"\\u0443\\u0441\\u043b\\u0443\\u0433\\u0430\",\"\\u043f\\u0440\\u043e\\u0441\\u0442\\u0440\\u0430\\u043d\\u0441\\u0442\\u0432\\u043e\",\"b\",\"\\u043e\\u0442\\u0432\\u0435\\u0442\",\"\\u0434\\u0438\\u0441\\u043a\",\"\\u0442\\u0440\\u0438\\u0433\\u0433\\u0435\\u0440\",\"\\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u0430\\u0442\\u044b\\u0432\\u0430\\u0442\\u044c\",\"\\u043a\\u043e\\u043d\\u0435\\u0447\\u043d\\u044b\\u0439\",\"\\u0440\\u0430\\u0437\\u043c\\u0435\\u0440\",\"\\u043d\\u0430\\u0445\\u043e\\u0434\\u0438\\u0442\\u044c\\u0441\\u044f\",\"\\u043e\\u0431\\u0435\\u0441\\u043f\\u0435\\u0447\\u0438\\u0442\\u044c\",\"\\u043f\\u043e\\u0434\\u0433\\u043e\\u0442\\u043e\\u0432\\u043a\\u0430\",\"\\u043e\\u0442\\u0441\\u0443\\u0442\\u0441\\u0442\\u0432\\u0438\\u0435\",\"\\u0437\\u0430\\u0442\\u0440\\u0430\\u0442\\u0430\",\"\\u0444\\u0443\\u043d\\u043a\\u0446\\u0438\\u043e\\u043d\\u0430\\u043b\",\"\\u043e\\u0442\\u0440\\u0430\\u0436\\u0430\\u0442\\u044c\",\"\\u0432\\u0430\\u0440\\u0438\\u0430\\u043d\\u0442\",\"\\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435\",\"\\u0436\\u0451\\u0441\\u0442\\u043a\\u0438\\u0439\",\"\\u0441\\u043f\\u0435\\u0446\\u0438\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0441\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u044b\\u0439\",\"\\u0446\\u0435\\u043b\\u043e\\u0441\\u0442\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043f\\u0440\\u043e\\u0438\\u0437\\u0432\\u043e\\u0434\\u0438\\u0442\\u044c\\u0441\\u044f\",\"\\u0441\\u0438\\u043c\\u0432\\u043e\\u043b\",\"\\u0441\\u0435\\u0442\\u0435\\u0432\\u043e\\u0439\",\"\\u0433\\u043e\\u0432\\u043e\\u0440\\u0438\\u0442\\u044c\",\"\\u044d\\u0442\\u0430\\u043f_\\u0430\\u043d\\u0430\\u043b\\u0438\\u0437\",\"\\u0442\\u0440\\u0430\\u043d\\u0441\\u0444\\u043e\\u0440\\u043c\\u0430\\u0446\\u0438\\u044f\",\"\\u043e\\u0442\\u0434\\u0435\\u043b\",\"\\u043b\\u0438\\u0446\\u043e\",\"=\",\"\\u0437\\u0430\\u0432\\u0435\\u0440\\u0448\\u0435\\u043d\\u0438\\u0435\",\"\\u0434\\u043e\\u043f\\u043e\\u043b\\u043d\\u0438\\u0442\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u043e\\u0439\",\"\\u0441\\u043f\\u0440\\u0430\\u0432\\u043e\\u0447\\u043d\\u0438\\u043a\",\"\\u043e\\u0441\\u043e\\u0431\\u044b\\u0439\",\"\\u0437\\u0440\\u0435\\u043d\\u0438\\u0435\",\"\\u0443\\u0434\\u043e\\u0432\\u043b\\u0435\\u0442\\u0432\\u043e\\u0440\\u044f\\u0442\\u044c\",\"\\u043a\\u043b\\u0430\\u0441\\u0442\\u0435\\u0440\",\"\\u0445\\u0440\\u0430\\u043d\\u0438\\u0442\\u044c_\\u043f\\u0440\\u043e\\u0446\\u0435\\u0434\\u0443\\u0440\\u0430\",\"\\u043f\\u043e\\u043a\\u0430\\u0437\\u0430\\u0442\\u044c\",\"\\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u043f\\u0435\\u0440\\u0435\\u0434\\u0430\\u0447\\u0430\",\"\\u0443\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043a\\u0430\",\"\\u043f\\u0440\\u0430\\u043a\\u0442\\u0438\\u043a\\u0430\",\"\\u0441\\u0432\\u043e\\u0439\\u0441\\u0442\\u0432\\u043e\",\"\\u0442\\u0435\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044c\\u0441\\u043a\\u0438\\u0439\",\"\\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\",\"\\u0440\\u044f\\u0434\",\"\\u043f\\u043e\\u043b\\u0443\\u0447\\u0430\\u0442\\u044c\",\"cgi\",\"\\u043f\\u0440\\u0438\\u0447\\u0438\\u043d\\u0430\",\"\\u0441\\u043a\\u043e\\u0440\\u043e\\u0441\\u0442\\u044c\",\"\\u0434\\u0435\\u043d\\u044c\",\"\\u0441\\u0443\\u043c\\u043c\\u0430\",\"\\u043f\\u0440\\u0438\\u0439\\u0442\\u0438\\u0441\\u044c\",\"\\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\\u0438\\u0437\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u043d\\u044b\\u0439\",\"\\u043d\\u0435\\u043a\\u043e\\u0442\\u043e\\u0440\\u044b\\u0439\",\"\\u0440\\u0443\\u043a\\u043e\\u0432\\u043e\\u0434\\u0438\\u0442\\u0435\\u043b\\u044c\",\"\\u043f\\u0435\\u0440\\u0435\\u0434\\u0430\\u0442\\u044c\",\"\\u043f\\u043e\\u0437\\u0432\\u043e\\u043b\\u0438\\u0442\\u044c\",\"\\u0442\\u0435\\u0445\\u043d\\u043e\\u043b\\u043e\\u0433\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u0443\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0442\\u044c\",\"\\u0438\\u0435\\u0440\\u0430\\u0440\\u0445\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u0440\\u0435\\u0437\\u0435\\u0440\\u0432\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u0435\\u0434\\u044b\\u0434\\u0443\\u0449\\u0438\\u0439\",\"\\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u043e\",\"\\u0438\\u0441\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u0442\\u0440\\u0430\\u043d\\u0438\\u0446\\u0430\",\"\\u0432\\u044b\\u0441\\u043e\\u043a\\u043e\",\"\\u0440\\u0430\\u0441\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\\u0438\\u0442\\u044c\",\"\\u043f\\u043e\\u043b\\u0435\",\"\\u0431\\u0430\\u043d\\u043a\",\"\\u044d\\u043a\\u0440\\u0430\\u043d\\u043d\\u044b\\u0439\",\"2010\",\"\\u043f\\u043b\\u0430\\u043d\\u043e\\u0432\\u044b\\u0439\",\"\\u043e\\u0440\\u0438\\u0435\\u043d\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u0431\\u044b\\u0441\\u0442\\u0440\\u044b\\u0439\",\"\\u0441\\u0430\\u0439\\u0442\",\"\\u0437\\u0430\\u0434\\u0430\\u0442\\u044c\",\"create\",\"\\u0441\\u043a\\u0440\\u0438\\u043f\\u0442\",\"\\u0444\\u0438\\u043d\\u0430\\u043d\\u0441\\u043e\\u0432\\u044b\\u0439\",\"\\u043f\\u043b\\u0430\\u043d\",\"\\u043e\\u0434\\u043d\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u043e\",\"\\u0434\\u0430\\u043b\\u044c\\u043d\\u0435\\u0439\\u0448\\u0438\\u0439\",\"\\u0434\\u043e\\u043f\\u0443\\u0441\\u0442\\u0438\\u043c\\u044b\\u0439\",\"\\u043c\\u043e\\u0449\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0433\\u043e\\u0442\\u043e\\u0432\\u044b\\u0439\",\"\\u043e\\u0437\\u043d\\u0430\\u0447\\u0430\\u0442\\u044c\",\"\\u043d\\u0430\\u0433\\u0440\\u0443\\u0437\\u043a\\u0430\",\"\\u0440\\u0430\\u0437\",\"\\u0437\\u043d\\u0430\\u043d\\u0438\\u0435\",\"\\u0443\\u0434\\u0430\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043e\\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u043b\\u044f\\u0442\\u044c\",\"\\u0443\\u043b\\u0433\\u0442\\u0443\",\"\\u043f\\u0440\\u043e\\u0433\\u0440\\u0430\\u043c\\u043c\\u043d\\u044b\\u0439_\\u043f\\u0440\\u043e\\u0434\\u0443\\u043a\\u0442\",\"\\u0441\\u043e\\u0431\\u044b\\u0442\\u0438\\u0435\",\"\\u043f\\u0440\\u0435\\u0438\\u043c\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u043e\",\"\\u0440\\u043e\\u043b\\u044c\",\"\\u043f\\u0440\\u0430\\u0432\\u0438\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u043e\\u0431\\u043e\\u0440\\u0443\\u0434\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0431\\u0443\\u0445\\u0433\\u0430\\u043b\\u0442\\u0435\\u0440\\u0441\\u043a\\u0438\\u0439\",\"\\u0448\\u0438\\u0444\\u0440\",\"\\u0442\\u0440\\u0435\\u0442\\u0438\\u0439\",\"\\u0441\\u0435\\u0440\\u044c\\u0451\\u0437\\u043d\\u044b\\u0439\",\"\\u043d\\u0430\\u0447\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0441\\u043e\\u0441\\u0442\\u0430\\u0432\\u043d\\u043e\\u0439_\\u0441\\u043e\\u0441\\u0442\\u043e\\u044f\\u043d\\u0438\\u0435\",\"\\u043d\\u0435\\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u044b\\u0439\",\"\\u043d\\u043e\\u043c\\u0435\\u0440\",\"\\u043d\\u0435\\u043f\\u043e\\u0441\\u0440\\u0435\\u0434\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u043e\",\"\\u0435\\u0434\\u0438\\u043d\\u044b\\u0439\",\"\\u0430\\u043a\\u0442\\u0443\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u0441\\u043b\\u0435\\u0434\\u043d\\u0438\\u0439\",\"\\u043d\\u0435\\u0434\\u043e\\u0441\\u0442\\u0430\\u0442\\u043e\\u043a\",\"\\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u044d\\u0444\\u0444\\u0435\\u043a\\u0442\\u0438\\u0432\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0446\\u0435\\u043d\\u0430\",\"\\u043f\\u0440\\u0435\\u0434\\u043f\\u043e\\u043b\\u0430\\u0433\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u043d\\u0430\\u0439\\u0442\\u0438\",\"\\u0438\\u043d\\u0441\\u0442\\u0440\\u0443\\u043c\\u0435\\u043d\\u0442\",\"\\u0441\\u043b\\u043e\\u0432\\u043e\",\"\\u043e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043b\\u043e\\u0433\\u0438\\u043a\\u0430\",\"\\u043e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u043d\\u0435\\u0431\\u043e\\u043b\\u044c\\u0448\\u043e\\u0439\",\"5\",\"\\u044d\\u043b\\u0435\\u043a\\u0442\\u0440\\u043e\\u043d\\u043d\\u044b\\u0439\",\"\\u043f\\u0430\\u0442\\u0435\\u043d\\u0442\\u043d\\u044b\\u0439\",\"7\",\"\\u0433\\u0440\\u0430\\u0444\\u0438\\u043a\",\"\\u043c\\u043e\\u0434\\u0435\\u043b\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0432\\u0435\\u0441\\u044c\\u043c\\u0430\",\"\\u0434\\u0430\\u0432\\u0430\\u0442\\u044c\",\"\\u043a\\u043e\\u043c\\u043c\\u0435\\u043d\\u0442\\u0430\\u0440\\u0438\\u0439\",\"\\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u044f\\u0442\\u044c\\u0441\\u044f\",\"on\",\"\\u043e\\u0441\\u044c\",\"\\u043f\\u043e\\u0432\\u044b\\u0448\\u0435\\u043d\\u0438\\u0435\",\"\\u043a\\u0430\\u0441\\u043a\\u0430\\u0434\\u043d\\u044b\\u0439\",\"\\u0433\\u043e\\u0441\\u0442\",\"\\u0447\\u0442\\u0435\\u043d\\u0438\\u0435\",\"2003\",\"\\u043f\\u0440\\u043e\\u0432\\u0435\\u0441\\u0442\\u0438\",\"\\u0441\\u043f\\u0435\\u0446\\u0438\\u0430\\u043b\\u0438\\u0441\\u0442\",\"\\u043c\\u043d\\u043e\\u0433\\u0438\\u043c\",\"\\u043a\\u0440\\u0438\\u0442\\u0435\\u0440\\u0438\\u0439\",\"iii\",\"\\u043f\\u0440\\u0438\\u043a\\u043b\\u0430\\u0434\\u043d\\u043e\\u0439\",\"odbc\",\"db2\",\"\\u043f\\u043e\\u043b\\u043d\\u043e\\u0441\\u0442\\u044c\\u044e\",\"\\u043f\\u043e\\u0441\\u0442\\u0440\\u043e\\u0438\\u0442\\u044c\",\"\\u043f\\u0440\\u0430\\u0432\\u043e\",\"\\u0440\\u0435\\u043a\\u043e\\u043c\\u0435\\u043d\\u0434\\u043e\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0441\\u0442\\u0430\\u043d\\u0434\\u0430\\u0440\\u0442\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u0430\\u043a\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\",\"\\u043a\\u043e\\u043c\\u043f\\u043b\\u0435\\u043a\\u0441\",\"\\u043c\\u043e\\u0434\\u0438\\u0444\\u0438\\u043a\\u0430\\u0446\\u0438\\u044f\",\"\\u0430\\u0431\\u0441\",\"\\u0434\\u043e\\u0441\\u0442\\u0430\\u0442\\u043e\\u0447\\u043d\\u044b\\u0439\",\"\\u0432\\u043e\\u0441\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043a\\u043b\\u0430\\u0441\\u0441\\u0438\\u0444\\u0438\\u043a\\u0430\\u0446\\u0438\\u044f\",\"\\u0444\\u0430\\u043a\\u0442\",\"\\u043f\\u043e\\u043a\\u0430\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\",\"\\u043a\\u043e\\u043f\\u0438\\u044f\",\"\\u0440\\u0430\\u0441\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u0430\\u0442\\u044b\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0434\\u043e\\u0441\\u0442\\u0438\\u0433\\u043d\\u0443\\u0442\\u044c\",\"\\u0433\\u0440\\u0430\\u0444\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u0444\\u0430\\u043a\\u0442\\u043e\\u0440\",\"\\u0441\\u0442\\u0430\\u043d\\u0446\\u0438\\u044f\",\"\\u043f\\u043e\\u0434\\u043b\\u0435\\u0436\\u0430\\u0442\\u044c\",\"\\u0436\\u0438\\u0437\\u043d\\u0435\\u043d\\u043d\\u044b\\u0439_\\u0446\\u0438\\u043a\\u043b\",\"\\u0438\\u0441\\u0441\\u043b\\u0435\\u0434\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043e\\u0431\\u043d\\u0430\\u0440\\u0443\\u0436\\u0438\\u0442\\u044c\",\"\\u0443\\u0447\\u0438\\u0442\\u044b\\u0432\\u0430\\u0442\\u044c\",\"\\u043f\\u043e\\u043d\\u044f\\u0442\\u043d\\u044b\\u0439\",\"\\u0438\\u0437\\u043c\\u0435\\u043d\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u043e\\u0442\\u0441\\u0443\\u0442\\u0441\\u0442\\u0432\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043d\\u0430\\u0437\\u044b\\u0432\\u0430\\u0442\\u044c\",\"\\u0442.\\u0434.\",\"\\u043e\\u0440\\u0438\\u0435\\u043d\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u043d\\u044b\\u0439\",\"\\u0441\\u043e\\u0434\\u0435\\u0440\\u0436\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0432\\u044b\\u0445\\u043e\\u0434\\u043d\\u043e\\u0439\",\"\\u043f\\u0440\\u0438\\u0432\\u043e\\u0434\\u0438\\u0442\\u044c\",\"256\",\"\\u0434\\u0440\\u0430\\u0439\\u0432\\u0435\\u0440\",\"\\u043e\\u0431\\u044a\\u0435\\u043a\\u0442\\u043d\\u044b\\u0439\",\"\\u043a\\u043b\\u044e\\u0447\\u0435\\u0432\\u043e\\u0439\",\"\\u043a\\u043e\\u043d\\u0435\\u0446\",\"\\u043f\\u0440\\u0438\\u0451\\u043c\\u043a\\u0430\",\"\\u0437\\u0430\\u043a\\u043b\\u044e\\u0447\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u043f\\u0435\\u0440\\u0432\\u0438\\u0447\\u043d\\u044b\\u0439\",\"\\u0440\\u0435\\u0433\\u0438\\u0441\\u0442\\u0440\\u0430\\u0446\\u0438\\u044f\",\"\\u043d\\u0438\",\"\\u043f\\u043e\\u043b\\u043d\\u043e\\u0442\\u0430\",\"\\u0441\\u0442\\u043e\\u043b\\u0431\\u0435\\u0446\",\"c\",\"\\u0435\\u0434\\u0438\\u043d\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u044b\\u0439\",\"\\u043d\\u043e\\u0441\\u0438\\u0442\\u0435\\u043b\\u044c\",\"\\u0441\\u043f\\u043e\\u0441\\u043e\\u0431\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043e\\u0442\\u043e\\u0431\\u0440\\u0430\\u0436\\u0435\\u043d\\u0438\\u0435\",\"\\u0435\\u0434\\u0438\\u043d\\u0438\\u0446\\u0430\",\"\\u043f\\u0440\\u0435\\u0434\\u043c\\u0435\\u0442\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u043e\\u0435\\u043a\\u0442\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u043e\\u0442\\u043e\\u0442\\u0438\\u043f\",\"\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439\",\"\\u0432\\u0435\\u0434\\u0435\\u043d\\u0438\\u0435\",\"2000\",\"\\u0440\\u0435\\u0430\\u043a\\u0446\\u0438\\u044f\",\"2.2\",\"\\u0438\\u0437\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c\",\"\\u043f\\u0440\\u0438\\u043d\\u044f\\u0442\\u0438\\u0435\",\"\\u043a\\u0430\\u0441\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0438\\u0441\\u043f\\u044b\\u0442\\u0430\\u043d\\u0438\\u0435\",\"\\u043f\\u043e\\u0441\\u0442\\u043e\\u044f\\u043d\\u043d\\u044b\\u0439\",\"\\u043c\\u043e\\u0449\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u043d\\u0438\\u043c\\u0430\\u043d\\u0438\\u0435\",\"\\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c\",\"\\u0444\\u043e\\u0440\\u043c\\u0430\\u043b\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f\",\"psm\",\"\\u043f\\u0440\\u043e\\u0438\\u0437\\u0432\\u043e\\u0434\\u0438\\u0442\\u0435\\u043b\\u044c\",\"\\u0447\\u0430\\u0441\\u0442\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043d\\u0435\\u043e\\u0431\\u0445\\u043e\\u0434\\u0438\\u043c\\u043e\\u0441\\u0442\\u044c\",\"\\u043c\\u0435\\u0440\\u0430\",\"\\u0431\\u043b\\u043e\\u043a\",\"\\u0440\\u0430\\u0431\\u043e\\u0442\\u043d\\u0438\\u043a\",\"\\u0442\\u0438\\u043f\\u043e\\u0432\\u043e\\u0439\",\"\\u0441\\u0435\\u0433\\u043e\\u0434\\u043d\\u044f\",\"\\u0440\\u0435\\u0448\\u0430\\u0442\\u044c\",\"\\u043e\\u0442\\u0432\\u0435\\u0447\\u0430\\u0442\\u044c\",\"\\u0438\\u0434\\u0442\\u0438\",\"\\u044f\\u0434\\u0440\\u043e\",\"\\u0432\\u044b\\u0434\\u0435\\u043b\\u0435\\u043d\\u0438\\u0435_\\u043c\\u0435\\u0442\\u043e\\u0434\",\"\\u043e\\u0446\\u0435\\u043d\\u0438\\u0442\\u044c\",\"\\u0440\\u0430\\u0441\\u0448\\u0438\\u0440\\u0435\\u043d\\u0438\\u0435\",\"\\u043b\\u043e\\u0433\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u043f\\u0440\\u0435\\u0434\\u044a\\u044f\\u0432\\u043b\\u044f\\u0442\\u044c\",\"\\u0438\\u043d\\u0438\\u0446\\u0438\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043b\\u044e\\u0431\\u043e\\u0439\",\"\\u0440\\u0430\\u0431\\u043e\\u0442\\u043e\\u0441\\u043f\\u043e\\u0441\\u043e\\u0431\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043f\\u0440\\u043e\\u043c\\u044b\\u0448\\u043b\\u0435\\u043d\\u043d\\u044b\\u0439\",\"\\u0447\\u0430\\u0441\\u0442\\u044c_\\u043a\\u043e\\u043d\\u0435\\u0447\\u043d\\u044b\\u0439\",\"\\u0430\\u0434\\u043c\\u0438\\u043d\\u0438\\u0441\\u0442\\u0440\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043b\\u043e\\u043a\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u0438\\u043d\\u0438\\u043c\\u0430\\u0442\\u044c\",\"+\",\"\\u043f\\u043e\\u0441\\u0442\\u0430\\u0432\\u0449\\u0438\\u043a\",\"solaris\",\"\\u043a\\u0440\\u0443\\u043f\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u0441\\u043b\\u0435\\u0434\\u0443\\u044e\\u0449\\u0438\\u0439\",\"\\u0438\\u0435\\u0440\\u0430\\u0440\\u0445\\u0438\\u044f\",\"\\u043e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\",\"\\u043f\\u043e\\u043d\\u044f\\u0442\\u0438\\u0435\",\"\\u0441\\u043b\\u0443\\u0436\\u0438\\u0442\\u044c\",\"\\u043d\\u0430\\u0432\\u044b\\u043a\",\"\\u043f\\u0440\\u043e\\u0446\\u0435\\u0441\\u0441\\u043e\\u0432\",\"pim\",\"\\u0438\\u043d\\u044b\\u0445\",\"\\u043f\\u0440\\u0438\\u0441\\u0443\\u0442\\u0441\\u0442\\u0432\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043c\\u0435\\u043d\\u044e\",\"\\u0432\\u0435\\u0440\\u043e\\u044f\\u0442\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0441\\u0440\\u0430\\u0432\\u043d\\u0435\\u043d\\u0438\\u0435\",\"6\",\"\\u0447\\u0435\\u0442\\u043a\\u043e\",\"\\u0440\\u0435\\u0433\\u043b\\u0430\\u043c\\u0435\\u043d\\u0442\",\"apache\",\"\\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u043d\\u044b\\u0439\",\"php\",\"\\u043a\\u0430\\u0442\\u0435\\u0433\\u043e\\u0440\\u0438\\u044f\",\"\\u0433.\",\"\\u0438\\u0441\",\"\\u043f\\u0435\\u0440\\u0435\\u0447\\u0438\\u0441\\u043b\\u0438\\u0442\\u044c\",\"1\\u0441_\\u043f\\u0440\\u0435\\u0434\\u043f\\u0440\\u0438\\u044f\\u0442\\u0438\\u0435\",\"\\u043e\\u0431\\u0443\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u0434\\u043e\\u0431\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u0437\\u0430\\u043f\\u0443\\u0441\\u043a\",\"\\u043f\\u0440\\u0435\\u0434\\u043b\\u0430\\u0433\\u0430\\u0442\\u044c\",\"\\u0432\\u043e\\u0437\\u043d\\u0438\\u043a\\u043d\\u043e\\u0432\\u0435\\u043d\\u0438\\u0435\",\"\\u043d\\u0430\\u0447\\u0438\\u043d\\u0430\\u0442\\u044c\",\"\\u043f\\u043b\\u0430\\u043d\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0434\\u0443\\u0431\\u043b\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043e\\u0442\\u043d\\u043e\\u0441\\u0438\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\",\"\\u0432\\u043d\\u0435\\u0448\\u043d\\u0438\\u0439_\\u043a\\u043b\\u044e\\u0447\",\"\\u043f\\u0435\\u0440\\u0435\\u0434\\u0430\\u0432\\u0430\\u0442\\u044c\",\"\\u043f\\u043e\\u0442\\u0440\\u0435\\u0431\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u044d\\u0442\\u0430\\u043f_\\u043f\\u0440\\u043e\\u0435\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"rdbms\",\"\\u0442\\u0435\\u043c\\u0430\",\"\\u0434\\u043e\\u043a\\u0443\\u043c\\u0435\\u043d\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043f\\u0430\\u0440\\u0430\\u043b\\u043b\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0434\\u0435\\u0442\\u0430\\u043b\\u044c\",\"\\u0441\\u0442\\u0430\\u0440\\u044b\\u0439\",\"\\u043a\\u043e\\u0440\\u043f\\u043e\\u0440\\u0430\\u0442\\u0438\\u0432\\u043d\\u044b\\u0439\",\"\\u043e\\u0431\\u0440\\u0430\\u0442\\u043d\\u044b\\u0439\",\"\\u0432\\u0435\\u0441\\u0442\\u0438\",\"\\u0430\\u043d\\u0430\\u043b\\u0438\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u043e\\u0442\\u0447\\u0451\\u0442\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043f\\u0440\\u0435\\u0434\\u043e\\u0441\\u0442\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u043e\\u0434\\u0440\\u043e\\u0431\\u043d\\u044b\\u0439\",\"\\u0442.\\u0435.\",\"\\u043c\\u0430\\u0433\\u0430\\u0437\\u0438\\u043d\",\"\\u043d\\u0435\\u0437\\u0430\\u0432\\u0438\\u0441\\u0438\\u043c\\u043e\\u0441\\u0442\\u044c\",\"\\u0444\\u0443\\u043d\\u043a\\u0446\\u0438\\u043e\\u043d\\u0430\\u043b\\u044c\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043a\\u0440\\u0438\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u043f\\u043e\\u044f\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043e\\u0440\\u0433\\u0430\\u043d\\u0438\\u0437\\u0430\\u0446\\u0438\\u043e\\u043d\\u043d\\u044b\\u0439\",\"\\u043c\\u0435\\u0442\\u043e\\u0434\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u043c\\u0430\\u0442\\u0435\\u043c\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u0440\\u0435\\u0434\\u043a\\u043e\",\"\\u0432\\u0441\\u0442\\u0440\\u0435\\u0447\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0432\\u0438\\u0442\\u043e\\u043a_\\u0441\\u043f\\u0438\\u0440\\u0430\\u043b\\u044c\",\"\\u0432\\u043d\\u0443\\u0442\\u0440\\u0438\",\"\\u043f\\u0440\\u0435\\u0434\\u044a\\u044f\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043b\\u0435\\u0433\\u043a\\u043e\",\"\\u0444\\u0438\\u043d\\u0430\\u043d\\u0441\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043d\\u0435\\u0437\\u0430\\u0432\\u0438\\u0441\\u0438\\u043c\\u044b\\u0439\",\"\\u0440\\u0430\\u0441\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\\u0438\\u0442\\u044c_\\u0431\\u0430\\u0437\\u0430\",\"mysql\",\"\\u043e\\u0442\\u043d\\u043e\\u0448\\u0435\\u043d\\u0438\\u0435_\\u043c\\u043d\\u043e\\u0433\\u0438\\u043c\",\"id\",\"\\u043d\\u0430\\u0440\\u0443\\u0448\\u0435\\u043d\\u0438\\u0435\",\"\\u044f\\u0437\\u044b\\u043a_java\",\"2.2.1\",\"\\u0440\\u0430\\u0437\\u043c\\u0435\\u0449\\u0435\\u043d\\u0438\\u0435\",\"\\u043e\\u043f\\u043b\\u0430\\u0442\\u0430\",\"\\u043f\\u043e\\u0442\\u0435\\u0440\\u044f\",\"\\u043d\\u0430\\u043a\\u043e\\u043f\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043d\\u0435\\u043a\\u043e\\u0440\\u0440\\u0435\\u043a\\u0442\\u043d\\u044b\\u0439\",\"\\u0442\\u0430\\u0431\\u043b\\u0438\\u0447\\u043d\\u044b\\u0439\",\"\\u0432\\u044b\\u0433\\u0440\\u0443\\u0437\\u043a\\u0430\",\"\\u043a\\u043e\\u043d\\u0444\\u043b\\u0438\\u043a\\u0442\",\"\\u043f\\u0440\\u0438\\u0451\\u043c\",\"\\u0440\\u0430\\u0441\\u0445\\u043e\\u0434\",\"\\u043f\\u0440\\u0438\\u0445\\u043e\\u0434\\u0438\\u0442\\u044c\\u0441\\u044f\",\"\\u0431\\u0430\\u043d\\u043a\\u043e\\u0432\\u0441\\u043a\\u0438\\u0439\",\"\\u0443\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u0438\\u0442\\u044c\",\"\\u0432\\u0435\\u0441\\u0442\\u0438\\u0441\\u044c\",\"\\u0443\\u0432\\u0435\\u043b\\u0438\\u0447\\u0435\\u043d\\u0438\\u0435\",\"\\u043e\\u0433\\u0440\\u0430\\u043d\\u0438\\u0447\\u0438\\u0442\\u044c\",\"\\u043f\\u0440\\u043e\\u0438\\u0437\\u0432\\u043e\\u0434\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u044b\\u0439\",\"\\u0438\\u043d\\u0442\\u0435\\u0433\\u0440\\u0430\\u0446\\u0438\\u044f\",\"\\u043d\\u0430\\u043f\\u0438\\u0441\\u0430\\u043d\\u0438\\u0435\",\"\\u0437\\u0430\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u0435\\u0440\\u0432\\u0438\\u0441\",\"\\u043b\\u0438\\u043d\\u0433\\u0432\\u0438\\u0441\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"iv\",\"\\u043f\\u0443\\u0442\\u0435\\u043c\",\"\\u043e\\u0431\\u043e\\u0437\\u043d\\u0430\\u0447\\u0435\\u043d\\u0438\\u0435\",\"866\",\"\\u043f\\u0440\\u0435\\u0434\\u044a\\u044f\\u0432\\u043b\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u0442\\u0435\\u043a\\u0443\\u0449\\u0438\\u0439\",\"\\u0438\\u0437\\u043c\\u0435\\u043d\\u044f\\u0442\\u044c\",\"\\u0431\\u0430\\u0437\\u043e\\u0432\\u044b\\u0439\",\"\\u043e\\u0431\\u044a\\u0435\\u043a\\u0442\\u043d\\u044b\\u0439_\\u043c\\u043d\\u043e\\u0436\\u0435\\u0441\\u0442\\u0432\\u043e\",\"\\u043c\\u0430\\u043a\\u0441\\u0438\\u043c\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0433\\u0438\\u0431\\u043a\\u0438\\u0439\",\"\\u043d\\u0430\\u0434\\u0451\\u0436\\u043d\\u044b\\u0439\",\"\\u0441\\u0442\\u043e\\u0440\\u043e\\u043d\\u043d\\u0438\\u0439\",\"\\u043c\\u0435\\u043d\\u0435\\u0434\\u0436\\u0435\\u0440\",\"\\u043f\\u0440\\u043e\\u0442\\u043e\\u043a\\u043e\\u043b\",\"\\u043f\\u0435\\u0440\\u0435\\u043d\\u0435\\u0441\\u0442\\u0438\",\"\\u043e\\u0442\\u0447\\u0451\\u0442\\u043d\\u044b\\u0439\",\"\\u0432\\u044b\\u0437\\u044b\\u0432\\u0430\\u0442\\u044c\",\"\\u0441\\u043e\\u0432\\u043e\\u043a\\u0443\\u043f\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0444\\u0430\\u043a\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\",\"\\u0441\\u0434\\u0430\\u0447\\u0430\",\"\\u0441\\u043c\\u044b\\u0441\\u043b\",\"\\u0441\\u0442\\u0430\\u0442\\u044c\\u044f\",\"\\u0440\\u0430\\u043d\\u043d\\u0438\\u0439\",\"\\u043d\\u0430\\u043f\\u0438\\u0441\\u0430\\u0442\\u044c\",\"\\u0441\\u043e\\u0441\\u0442\\u0430\\u0432\\u043b\\u044f\\u0442\\u044c\",\"\\u043a\\u043e\\u043d\\u0441\\u0442\\u0440\\u0443\\u043a\\u0446\\u0438\\u044f\",\"er\",\"10\",\"\\u0441\\u0442\\u043e\\u0438\\u0442\\u044c\",\"\\u0438\\u0434\\u0435\\u044f\",\"\\u0446\\u0435\\u043b\\u044b\\u0439\",\"\\u0440\\u0435\\u0448\\u0438\\u0442\\u044c\",\"\\u0433\\u0435\\u043d\\u0435\\u0440\\u0430\\u0446\\u0438\\u044f\",\"\\u043f\\u043e\\u043d\\u0438\\u043c\\u0430\\u0442\\u044c\",\"\\u043a\\u043e\\u0440\\u043f\\u043e\\u0440\\u0430\\u0446\\u0438\\u044f\",\"\\u043d\\u043e\\u0440\\u043c\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439_\\u0444\\u043e\\u0440\\u043c\\u0430\",\"\\u043f\\u0440\\u043e\\u0432\\u0435\\u0440\\u0438\\u0442\\u044c\",\"2.2.2\",\"\\u044d\\u043a\\u043e\\u043d\\u043e\\u043c\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u0432\\u044b\\u0441\\u0442\\u0443\\u043f\\u0430\\u0442\\u044c\",\"\\u043c\\u0430\\u0439\",\"\\u043d\\u043e\\u0440\\u043c\\u0430\\u0442\\u0438\\u0432\\u043d\\u044b\\u0439\",\"\\u043a\\u043e\\u043c\\u043f\\u044c\\u044e\\u0442\\u0435\\u0440\\u043d\\u044b\\u0439\",\"\\u0432\\u043b\\u0438\\u044f\\u0442\\u044c\",\"\\u0443\\u0441\\u0442\\u0440\\u043e\\u0439\\u0441\\u0442\\u0432\\u043e\",\"\\u0441\\u0447\\u0438\\u0442\\u0430\\u0442\\u044c\",\"\\u043c\\u0435\\u0441\\u044f\\u0446\",\"\\u0443\\u043d\\u0438\\u043a\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0442\\u0435\\u0441\\u0442\\u0435\\u0440\",\"\\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c\",\"\\u043d\\u0430\\u0447\\u0430\\u043b\\u043e\",\"\\u043a\\u043e\\u0440\\u0440\\u0435\\u043a\\u0442\\u043d\\u043e\\u0441\\u0442\\u044c\",\"2.2.4\",\"\\u0437\\u043d\\u0430\\u0447\\u0438\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\",\"\\u0432\\u044b\\u0431\\u043e\\u0440\\u043a\\u0430\",\"\\u0444\\u0443\\u043d\\u043a\\u0446\\u0438\\u043e\\u043d\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c\",\"int\",\"\\u0432\\u0432\\u0435\\u0434\\u0435\\u043d\\u0438\\u0435\",\"\\u0437\\u043d\\u0430\\u0442\\u044c\",\"\\u043a\\u043e\\u0440\\u0440\\u0435\\u043a\\u0442\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u0430\\u0432\\u0438\\u043b\\u044c\\u043d\\u043e\",\"\\u043f\\u043e\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c\",\"\\u0442\\u0435\\u0440\\u043c\\u0438\\u043d\",\"\\u0446\\u0438\\u043a\\u043b\",\"\\u043f\\u043e\\u0441\\u043b\\u0435\\u0434\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u043e\\u0442\\u043b\\u0438\\u0447\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u043f\\u0440\\u043e\\u0445\\u043e\\u0434\\u0438\\u0442\\u044c\",\"doctors\",\"\\u043f\\u0440\\u0438\\u043e\\u0440\\u0438\\u0442\\u0435\\u0442\",\"\\u043f\\u043e\\u0432\\u0435\\u0434\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u0435\\u0434\\u0435\\u043b\",\"\\u043f\\u0440\\u0435\\u0434\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u0445\\u0435\\u043c\\u0430_\\u0431\\u0430\\u0437\\u0430\",\"\\u043c\\u043d\\u043e\\u0433\\u0438\\u0445\",\"\\u043d\\u0435\\u0432\\u0435\\u0440\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u043e\\u0432\\u043e\\u0434\\u0438\\u0442\\u044c\",\"\\u043f\\u0440\\u043e\\u0441\\u0442\\u043e\\u0442\\u0430\",\"\\u0432\\u043e\\u0437\\u0432\\u0440\\u0430\\u0442\\u043d\\u044b\\u0439\",\"\\u0443\\u0447\\u0451\\u0442\\u043d\\u044b\\u0439\",\"informix\",\"\\u0437\\u0430\\u0447\\u0430\\u0441\\u0442\\u0443\\u044e\",\"\\u0441\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u0439\",\"\\u0440\\u0435\\u043a\\u0443\\u0440\\u0441\\u0438\\u0432\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u044f\\u0441\\u043d\\u0438\\u0442\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u0431\\u0443\\u0445\\u0433\\u0430\\u043b\\u0442\\u0435\\u0440\\u0438\\u044f\",\"\\u0434\\u0430\\u0442\\u044c\",\"8\",\"\\u0440\\u043e\\u0441\\u0442\",\"\\u0438\\u0437\\u0431\\u0435\\u0436\\u0430\\u0442\\u044c\",\"\\u0442\\u043e\\u0447\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u043e\\u0431\\u0440\\u0430\\u0449\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u043a\\u043e\\u043c\\u043c\\u0435\\u0440\\u0447\\u0435\\u0441\\u043a\\u0438\\u0439\",\"\\u0441\\u0441\\u044b\\u043b\\u043e\\u0447\\u043d\\u044b\\u0439_\\u0446\\u0435\\u043b\\u043e\\u0441\\u0442\\u043d\\u043e\\u0441\\u0442\\u044c\",\"\\u0434\\u0430\\u043d\\u043d\\u0443\\u044e\",\"\\u043a\\u043e\\u043d\\u0441\\u0443\\u043b\\u044c\\u0442\\u0430\\u043d\\u0442\",\"\\u0437\\u0430\\u043f\\u0438\\u0441\\u043a\\u0430\",\"\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0440\\u0430\\u0437\\u0440\\u0435\\u0448\\u0435\\u043d\\u0438\\u0435\",\"mda\",\"2.2.3\",\"\\u044d\\u0432\\u043c\",\"\\u043f\\u043e\\u043a\\u0430\\u0437\\u044b\\u0432\\u0430\\u0442\\u044c\",\"\\u043b\\u0451\\u0433\\u043a\\u0438\\u0439\",\"\\u0430\\u043f\\u0440\\u0435\\u043b\\u044c\",\"\\u0441\\u043e\\u043f\\u0440\\u043e\\u0432\\u043e\\u0436\\u0434\\u0435\\u043d\\u0438\\u0435\",\"\\u0448\\u0438\\u0440\\u043e\\u043a\\u0438\\u0439\",\"15\",\"\\u0441\\u0442\\u043e\\u0438\\u043c\\u043e\\u0441\\u0442\\u044c\",\"\\u043f\\u0435\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u044b\\u0439\",\"\\u0441\\u0435\\u0433\\u043c\\u0435\\u043d\\u0442\",\"\\u043f\\u043e\\u0441\\u0442\\u043e\\u044f\\u043d\\u043d\\u043e\",\"\\u0441\\u043e\\u043a\\u0440\\u0430\\u0449\\u0435\\u043d\\u0438\\u0435\",\"\\u0441\\u043c\\u0435\\u043d\\u0430\",\"\\u043c\\u0430\\u043b\\u044b\\u0439\",\"\\u043d\\u0430\\u0437\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u0430\\u043d\\u043d\\u0430\\u044f\",\"\\u044d\\u043a\\u0437\\u0435\\u043c\\u043f\\u043b\\u044f\\u0440\",\"\\u0440\\u0438\\u0441\\u0443\\u043d\\u043e\\u043a\",\"\\u0441\\u043e\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c\",\"\\u043f\\u043e\\u044f\\u0432\\u043b\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u043e\\u0434\\u0438\\u043d\\u0430\\u043a\\u043e\\u0432\\u044b\\u0439\",\"\\u043f\\u043e\\u0434\\u0445\\u043e\\u0434\\u0438\\u0442\\u044c\",\"null\",\"\\u0441\\u043b\\u043e\\u0439\",\"\\u043e\\u0431\\u0441\\u043b\\u0443\\u0436\\u0438\\u0432\\u0430\\u0442\\u044c\",\"\\u0432\\u044b\\u0437\\u0432\\u0430\\u0442\\u044c\",\"\\u0444\\u0430\\u0437\\u0430\",\"\\u0434\\u0440\\u0443\\u0433\",\"\\u0438\\u0441\\u0445\\u043e\\u0434\\u043d\\u044b\\u0439_\\u043a\\u043e\\u0434\",\"\\u0445\\u0430\\u0440\\u0430\\u043a\\u0442\\u0435\\u0440\",\"\\u0434\\u0438\\u0441\\u0442\\u0440\\u0438\\u0431\\u0443\\u0442\\u0438\\u0432\",\"\\u0437\\u0430\\u043d\\u0438\\u043c\\u0430\\u0442\\u044c\",\"2.2.5\",\"\\u0432\\u043e\\u0437\\u0432\\u0440\\u0430\\u0442\",\"\\u043f\\u043e\\u043f\\u044b\\u0442\\u043a\\u0430\",\"\\u0438\\u0437\\u043c\\u0435\\u0440\\u0435\\u043d\\u0438\\u0435\",\"\\u0434\\u0432\\u0438\\u0436\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u0430\\u0446\\u0438\\u0435\\u043d\\u0442\",\"2.2.6\",\"n\",\">\",\"\\u043a\\u043e\\u043d\\u0442\\u0435\\u043a\\u0441\\u0442\",\"windows_nt\",\"\\u043a\\u0430\\u0442\\u0430\\u043b\\u043e\\u0433\",\"\\u0432\\u0438\\u0434\\u0435\\u0442\\u044c\",\"\\u044d\\u043a\\u0432\\u0438\\u0432\\u0430\\u043b\\u0435\\u043d\\u0442\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"unix\",\"\\u0440\\u0435\\u043a\\u043e\\u043c\\u0435\\u043d\\u0434\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043a\\u044d\\u0448\",\"\\u043f\\u043e\\u043b\\u043d\\u043e\\u0446\\u0435\\u043d\\u043d\\u044b\\u0439\",\"\\u0438 \\u0434\\u0440.\",\"\\u0441\\u043a\\u043b\\u0430\\u0434\",\"\\u0442\\u0440\\u0430\\u0434\\u0438\\u0446\\u0438\\u043e\\u043d\\u043d\\u044b\\u0439\",\"\\u043c\\u0435\\u043d\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u0432\\u043e\\u0434\\u043e\\u043f\\u0430\\u0434\",\"512\",\"\\u0438\\u043d\\u0442\\u0435\\u0440\\u0430\\u043a\\u0442\\u0438\\u0432\\u043d\\u044b\\u0439\",\"ibm\",\"\\u0443\\u0441\\u043b\\u043e\\u0432\\u043d\\u044b\\u0439\",\"\\u043e\\u043f\\u044b\\u0442\\u043d\\u044b\\u0439\",\"\\u0432\\u044b\\u044f\\u0432\\u0438\\u0442\\u044c\",\"\\u043c\\u043e\\u043d\\u0438\\u0442\\u043e\\u0440\",\"\\u0436\\u0443\\u0440\\u043d\\u0430\\u043b\",\"\\u0441\\u043b\\u0435\\u0434\\u0441\\u0442\\u0432\\u0438\\u0435\",\"\\u043f\\u043e\\u0442\\u0435\\u043d\\u0446\\u0438\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u043e\\u0439\\u0442\\u0438\",\"\\u043f\\u0440\\u043e\\u043c\\u0435\\u0436\\u0443\\u0442\\u043e\\u0447\\u043d\\u044b\\u0439\",\"\\u0442\\u0435\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439\",\"\\u0440\\u0435\\u043a\\u0432\\u0438\\u0437\\u0438\\u0442\",\"\\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044c\\u0441\\u043a\\u0438\\u0439_\\u043f\\u0440\\u043e\\u0446\\u0435\\u0441\\u0441\",\"\\u043f\\u0430\\u0440\\u0430\",\"\\u0444\\u043e\\u043d\\u043e\\u0432\\u044b\\u0439\",\"\\u0431\\u0440\\u043e\\u0443\\u0437\\u0435\\u0440\",\"\\u0438\\u0434\\u0435\\u043d\\u0442\\u0438\\u0444\\u0438\\u043a\\u0430\\u0442\\u043e\\u0440\",\"\\u043f\\u0440\\u043e\\u0444\\u0435\\u0441\\u0441\\u0438\\u043e\\u043d\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439_\\u0441\\u0443\\u0431\\u0434\",\"\\u0441\\u043f\\u0435\\u0446\\u0438\\u0430\\u043b\\u044c\\u043d\\u043e\",\"case\",\"sun\",\"\\u0438\\u043d\\u043e\\u0439\",\"\\u043d\\u0435\\u0434\\u0435\\u043b\\u044f\",\"\\u0440\\u0430\\u0432\\u043d\\u044b\\u0439\",\"\\u043f\\u0440\\u0438\\u0432\\u043b\\u0435\\u043a\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0448\\u0430\\u0433\",\"\\u0440\\u0438\\u0441\\u043a\",\"\\u0438\\u0442\\u043e\\u0433\",\"\\u0442\\u0440\\u0430\\u043d\\u0441\\u0444\\u043e\\u0440\\u043c\\u0430\\u0446\\u0438\\u044f_\\u0432\\u044b\\u0434\\u0435\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043e\\u0431\\u043e\\u0439\\u0442\\u0438\\u0441\\u044c\",\"\\u0443\\u0447\\u0430\\u0441\\u0442\\u043e\\u043a\",\"\\u0441\\u0442\\u0440\\u043e\\u0433\\u043e\",\"\\u0430\\u043b\\u0433\\u043e\\u0440\\u0438\\u0442\\u043c\",\"\\u0441\\u0445\\u0435\\u043c\\u0430_\\u043f\\u0440\\u0435\\u043e\\u0431\\u0440\\u0430\\u0437\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u0435\\u0434\\u043e\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c\",\"\\u0434\\u0440\\u0443\\u0433\\u043e\\u043c\\u0443\",\"\\u043c\\u043e\\u0434\\u0435\\u043b\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u0432\\u044b\\u0447\\u0438\\u0441\\u043b\\u0438\\u0442\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0442\\u0435\\u0445\\u043d\\u0438\\u043a\\u0430\",\"\\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u044b\\u0439\",\"\\u043f\\u043e\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435\",\"\\u043a\\u043d\\u043e\\u043f\\u043a\\u0430\",\"\\u043d\\u0430\\u0437\\u044b\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0432\\u0432\\u0435\\u0441\\u0442\\u0438\",\"\\u043f\\u0435\\u0447\\u0430\\u0442\\u044c\",\"\\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u044f\\u0442\\u044c\",\"nt\",\"\\u0432\\u043d\\u0435\\u0441\\u0442\\u0438\",\"\\u043f\\u0440\\u043e\\u0438\\u0437\\u0432\\u043e\\u0434\\u0441\\u0442\\u0432\\u043e\",\"\\u043e\\u0447\\u0435\\u0432\\u0438\\u0434\\u043d\\u044b\\u0439\",\"internet\",\"\\u0444\\u043e\\u0440\\u043c\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043d\\u0435\\u0434\\u043e\\u043f\\u0443\\u0441\\u0442\\u0438\\u043c\\u044b\\u0439\",\"\\u043e\\u0431\\u0440\\u0430\\u0431\\u043e\\u0442\\u0430\\u0442\\u044c\",\"\\u043a\\u0430\\u0444\\u0435\\u0434\\u0440\\u0430\",\"\\u043e\\u0442\\u0441\\u043b\\u0435\\u0436\\u0438\\u0432\\u0430\\u0442\\u044c\",\"\\u0430\\u0443\\u0442\\u0435\\u043d\\u0442\\u0438\\u0444\\u0438\\u043a\\u0430\\u0446\\u0438\\u044f\",\"\\u043f\\u043e\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043f\\u0440\\u043e\\u0438\\u0437\\u0432\\u043e\\u0434\\u0438\\u0442\\u044c\",\"2.2.7\",\"\\u0443\\u043f\\u0440\\u043e\\u0441\\u0442\\u0438\\u0442\\u044c\",\"\\u043f\\u043e\\u043f\\u0443\\u043b\\u044f\\u0440\\u043d\\u044b\\u0439\",\"\\u0441\\u0442\\u0440\\u0443\\u043a\\u0442\\u0443\\u0440\\u043d\\u044b\\u0439\",\"\\u0443\\u0434\\u0430\\u043b\\u0451\\u043d\\u043d\\u044b\\u0439\",\"2000/\",\"2.1\",\"\\u043f\\u043e\\u043a\\u0443\\u043f\\u0430\\u0442\\u0435\\u043b\\u044c\",\"\\u0443\\u0441\\u043f\\u0435\\u0448\\u043d\\u044b\\u0439\",\"\\u043d\\u0430\\u043c\\u043d\\u043e\\u0433\\u043e\",\"\\u0432\\u043e\\u0441\\u043f\\u0440\\u0438\\u044f\\u0442\\u0438\\u0435\",\"stronghold\",\"\\u043f\\u0438\\u0441\\u0430\\u0442\\u044c\",\"\\u0441\\u043e\\u0441\\u0442\\u0430\\u0432\\u043d\\u043e\\u0439\",\"\\u043f\\u0440\\u0435\\u043e\\u0431\\u0440\\u0430\\u0437\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043d\\u0438\\u043a\\u0430\\u043a\\u043e\\u0439\",\"cim\",\"\\u0434\\u043e\\u0431\\u0430\\u0432\\u043b\\u044f\\u0442\\u044c\\u0441\\u044f\",\"\\u0434\\u0440\\u0443\\u0433\\u043e\\u043c\",\"\\u043c\\u043e\\u043d\\u0438\\u0442\\u043e\\u0440\\u0438\\u043d\\u0433\",\"\\u043b\\u043e\\u0433\\u0438\\u043a\\u0438\",\"\\u0432\\u044b\\u0445\\u043e\\u0434\",\"\\u043f\\u0440\\u0435\\u0434\\u0443\\u0441\\u043c\\u0430\\u0442\\u0440\\u0438\\u0432\\u0430\\u0442\\u044c\",\"\\u0440\\u0435\\u0430\\u043b\\u0438\\u0437\\u043e\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u043d\\u0430\\u0447\\u0438\\u043d\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0434\\u043b\\u0438\\u043d\\u0430\",\"\\u0432\\u043e\\u0437\\u0432\\u0440\\u0430\\u0449\\u0430\\u0442\\u044c\",\"\\u0442.\\u043a.\",\"\\u0437\\u0430\\u0432\\u0438\\u0441\\u0438\\u043c\\u044b\\u0439\",\"\\u0442\\u0440\\u0438\\u0433\\u0433\\u0435\\u0440\\u044b\",\"\\u043e\\u0431\\u043e\\u0437\\u043d\\u0430\\u0447\\u0430\\u0442\\u044c\",\"\\u0443\\u0434\\u0430\\u043b\\u0438\\u0442\\u044c\",\"\\u043e\\u043a\\u0440\\u0443\\u0436\\u0435\\u043d\\u0438\\u0435\",\"sdl\",\"\\u0441\\u043e\\u0433\\u043b\\u0430\\u0441\\u043d\\u043e\",\"celeron\",\"data\",\"\\u0441\\u043b\\u0435\\u0434\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\",\"\\u043f\\u0440\\u0435\\u0434\\u044a\\u044f\\u0432\\u0438\\u0442\\u044c\",\"\\u043f\\u043e\\u0434\\u0442\\u0438\\u043f\",\"\\u043e\\u043f\\u0438\\u0441\\u044b\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u043e\\u043f\\u0435\\u0440\\u0430\\u0446\\u0438\\u043e\\u043d\\u043d\\u044b\\u0439_\\u0441\\u0438\\u0441\\u0442\\u0435\\u043c\\u0430\",\"\\u0440\\u0430\\u0437\\u0434\\u0435\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u043e\\u0431\\u043c\\u0435\\u043d_\\u0434\\u0430\\u043d\\u043d\\u044b\\u043c\\u0438\",\"\\u043d\\u0430\\u0441\\u043a\\u043e\\u043b\\u044c\\u043a\\u043e\",\"\\u043f\\u043e\\u0434\\u043e\\u0431\\u043d\\u044b\\u0439\",\"\\u0441\\u0431\\u043e\\u0440\",\"\\u043d\\u0438\\u0437\\u043a\\u0438\\u0439\",\"\\u043f\\u0440\\u0430\\u0432\\u0438\\u043b\\u043e_\\u043f\\u0440\\u043e\\u0446\\u0435\\u0441\\u0441\",\"\\u0447\\u0435\\u0442\\u0432\\u0451\\u0440\\u0442\\u044b\\u0439\",\"\\u0442\\u0435\\u043a\\u0443\\u0449\\u0438\\u0439_\\u0441\\u0447\\u0451\\u0442\",\"\\u0432\\u043a\\u043b\\u044e\\u0447\\u0438\\u0442\\u044c\",\"<\",\"t\",\"30\",\"\\u0446\\u0435\\u043f\\u043e\\u0447\\u043a\\u0430\",\"\\u043a\\u043e\\u043f\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\",\"\\u043c\\u0430\\u043b\\u0435\\u043d\\u044c\\u043a\\u0438\\u0439\",\"\\u043e\\u0431\\u0440\\u0430\\u0442\\u0438\\u0442\\u044c\\u0441\\u044f\",\"\\u0440\\u0430\\u0441\\u0441\\u0447\\u0438\\u0442\\u0430\\u0442\\u044c\",\"\\u043e\\u0440\\u0433\\u0430\\u043d\\u0438\\u0437\\u043e\\u0432\\u0430\\u0442\\u044c\",\"\\u043d\\u0443\\u0436\\u043d\\u044b\\u0439\",\"\\u043c\\u0438\\u043d\\u0438\\u043c\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0441\\u043d\\u0438\\u0436\\u0430\\u0442\\u044c\",\"javascript\",\"\\u043a\\u043e\\u043c\\u043f\\u0435\\u0442\\u0435\\u043d\\u0446\\u0438\\u044f\",\"\\u043f\\u0440\\u0438\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u0432\\u044b\\u0434\\u0435\\u043b\\u0435\\u043d\\u0438\\u0435\",\"\\u0440\\u0430\\u0441\\u043f\\u043e\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435\",\"\\u0434\\u043e\\u043a\\u0442\\u043e\\u0440\",\"\\u0438\\u0437\\u043e\\u0431\\u0440\\u0430\\u0436\\u0435\\u043d\\u0438\\u0435\",\"\\u043a\\u043e\\u043e\\u0440\\u0434\\u0438\\u043d\\u0430\\u0442\\u0430\",\"\\u043f\\u0440\\u0435\\u0434\\u043b\\u043e\\u0436\\u0438\\u0442\\u044c\",\"\\u0436\\u0435\\u043b\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0441\\u0438\\u043d\\u0445\\u0440\\u043e\\u043d\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f\",\"\\u0441\\u0442\\u0440\\u043e\\u0433\\u0438\\u0439\",\"\\u0432\\u044b\\u0434\\u0435\\u043b\\u044f\\u0442\\u044c\",\"\\u043e\\u043f\\u044b\\u0442\",\"\\u0440\\u0443\\u0447\\u043d\\u043e\\u0439\",\"x\",\"\\u0438\\u0437\\u043d\\u0430\\u0447\\u0430\\u043b\\u044c\\u043d\\u043e\",\"\\u0441\\u0442\\u0430\\u0442\\u044c\",\"\\u043e\\u0431\\u043b\\u0435\\u0433\\u0447\\u0430\\u0442\\u044c\",\"\\u043d\\u0430\\u0437\\u0432\\u0430\\u0442\\u044c\",\"\\u0430\\u0440\\u0445\\u0438\\u0442\\u0435\\u043a\\u0442\\u0443\\u0440\\u0430_mda\",\"\\u043c\\u0438\\u043d\\u0438\\u043c\\u0443\\u043c\",\"\\u0441\\u0435\\u043a\\u0443\\u043d\\u0434\\u0430\",\"\\u043e\\u043a\\u0430\\u0437\\u044b\\u0432\\u0430\\u0442\\u044c\\u0441\\u044f\",\"\\u043f\\u0435\\u0440\\u0432\\u043e\\u043d\\u0430\\u0447\\u0430\\u043b\\u044c\\u043d\\u044b\\u0439\",\"\\u0443\\u0434\\u0435\\u043b\\u0438\\u0442\\u044c\",\"\\u043d\\u0430\\u0434\\u043f\\u0438\\u0441\\u044c\",\"\\u043d\\u0435\\u043a\\u0438\\u0439\",\"\\u0441\\u0430\\u043c\\u044b\\u043c\",\"\\u043f\\u043e\\u0445\\u043e\\u0436\\u0438\\u0439\",\"\\u0446\\u0435\\u043b\\u0435\\u0441\\u043e\\u043e\\u0431\\u0440\\u0430\\u0437\\u043d\\u044b\\u0439\",\"\\u043e\\u0431\\u0441\\u043b\\u0435\\u0434\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\"],\"shape\":[1043],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1087\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1088\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1083\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"black\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1084\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"black\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1085\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"black\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1054\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1067\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1068\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1069\",\"attributes\":{\"dimensions\":\"both\",\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1070\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p1076\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p1075\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1077\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1078\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1079\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1062\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1063\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1064\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1065\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1057\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1058\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1059\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1060\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1061\",\"attributes\":{\"axis\":{\"id\":\"p1057\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1066\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1062\"}}}]}}]}};\n const render_items = [{\"docid\":\"681b38e1-4bb7-437b-a4e7-5f18a8a9fdb7\",\"roots\":{\"p1046\":\"bf24c757-431b-4f0d-8197-1fcf9f8a30ad\"},\"root_ids\":[\"p1046\"]}];\n void root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", + "application/vnd.bokehjs_exec.v0+json": "" + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "id": "p1046" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "from bokeh.io import output_notebook\n", + "from bokeh.plotting import show, figure\n", + "\n", + "output_notebook()\n", + "p = figure(width=800, height=800)\n", + "p.text(x=coords_df.x, y=coords_df.y, text=coords_df.token) # type: ignore\n", + "show(p)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv (3.12.10)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lec4-2-nlp-dense.ipynb b/lec4-2-nlp-dense.ipynb new file mode 100644 index 0000000..2a32930 --- /dev/null +++ b/lec4-2-nlp-dense.ipynb @@ -0,0 +1,1610 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "id": "507915ea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.9.2\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "os.environ[\"KERAS_BACKEND\"] = \"torch\"\n", + "import keras\n", + "\n", + "print(keras.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e0043e5c", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.datasets import imdb\n", + "import os\n", + "\n", + "unique_words = 5000\n", + "max_length = 100\n", + "\n", + "output_dir = \"tmp\"\n", + "if not os.path.exists(output_dir):\n", + " os.makedirs(output_dir)\n", + "\n", + "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words, skip_top=50)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "aadc3471", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{34704: 'fawn',\n", + " 52009: 'tsukino',\n", + " 52010: 'nunnery',\n", + " 16819: 'sonja',\n", + " 63954: 'vani',\n", + " 1411: 'woods',\n", + " 16118: 'spiders',\n", + " 2348: 'hanging',\n", + " 2292: 'woody',\n", + " 52011: 'trawling',\n", + " 52012: \"hold's\",\n", + " 11310: 'comically',\n", + " 40833: 'localized',\n", + " 30571: 'disobeying',\n", + " 52013: \"'royale\",\n", + " 40834: \"harpo's\",\n", + " 52014: 'canet',\n", + " 19316: 'aileen',\n", + " 52015: 'acurately',\n", + " 52016: \"diplomat's\",\n", + " 25245: 'rickman',\n", + " 6749: 'arranged',\n", + " 52017: 'rumbustious',\n", + " 52018: 'familiarness',\n", + " 52019: \"spider'\",\n", + " 68807: 'hahahah',\n", + " 52020: \"wood'\",\n", + " 40836: 'transvestism',\n", + " 34705: \"hangin'\",\n", + " 2341: 'bringing',\n", + " 40837: 'seamier',\n", + " 34706: 'wooded',\n", + " 52021: 'bravora',\n", + " 16820: 'grueling',\n", + " 1639: 'wooden',\n", + " 16821: 'wednesday',\n", + " 52022: \"'prix\",\n", + " 34707: 'altagracia',\n", + " 52023: 'circuitry',\n", + " 11588: 'crotch',\n", + " 57769: 'busybody',\n", + " 52024: \"tart'n'tangy\",\n", + " 14132: 'burgade',\n", + " 52026: 'thrace',\n", + " 11041: \"tom's\",\n", + " 52028: 'snuggles',\n", + " 29117: 'francesco',\n", + " 52030: 'complainers',\n", + " 52128: 'templarios',\n", + " 40838: '272',\n", + " 52031: '273',\n", + " 52133: 'zaniacs',\n", + " 34709: '275',\n", + " 27634: 'consenting',\n", + " 40839: 'snuggled',\n", + " 15495: 'inanimate',\n", + " 52033: 'uality',\n", + " 11929: 'bronte',\n", + " 4013: 'errors',\n", + " 3233: 'dialogs',\n", + " 52034: \"yomada's\",\n", + " 34710: \"madman's\",\n", + " 30588: 'dialoge',\n", + " 52036: 'usenet',\n", + " 40840: 'videodrome',\n", + " 26341: \"kid'\",\n", + " 52037: 'pawed',\n", + " 30572: \"'girlfriend'\",\n", + " 52038: \"'pleasure\",\n", + " 52039: \"'reloaded'\",\n", + " 40842: \"kazakos'\",\n", + " 52040: 'rocque',\n", + " 52041: 'mailings',\n", + " 11930: 'brainwashed',\n", + " 16822: 'mcanally',\n", + " 52042: \"tom''\",\n", + " 25246: 'kurupt',\n", + " 21908: 'affiliated',\n", + " 52043: 'babaganoosh',\n", + " 40843: \"noe's\",\n", + " 40844: 'quart',\n", + " 362: 'kids',\n", + " 5037: 'uplifting',\n", + " 7096: 'controversy',\n", + " 21909: 'kida',\n", + " 23382: 'kidd',\n", + " 52044: \"error'\",\n", + " 52045: 'neurologist',\n", + " 18513: 'spotty',\n", + " 30573: 'cobblers',\n", + " 9881: 'projection',\n", + " 40845: 'fastforwarding',\n", + " 52046: 'sters',\n", + " 52047: \"eggar's\",\n", + " 52048: 'etherything',\n", + " 40846: 'gateshead',\n", + " 34711: 'airball',\n", + " 25247: 'unsinkable',\n", + " 7183: 'stern',\n", + " 52049: \"cervi's\",\n", + " 40847: 'dnd',\n", + " 11589: 'dna',\n", + " 20601: 'insecurity',\n", + " 52050: \"'reboot'\",\n", + " 11040: 'trelkovsky',\n", + " 52051: 'jaekel',\n", + " 52052: 'sidebars',\n", + " 52053: \"sforza's\",\n", + " 17636: 'distortions',\n", + " 52054: 'mutinies',\n", + " 30605: 'sermons',\n", + " 40849: '7ft',\n", + " 52055: 'boobage',\n", + " 52056: \"o'bannon's\",\n", + " 23383: 'populations',\n", + " 52057: 'chulak',\n", + " 27636: 'mesmerize',\n", + " 52058: 'quinnell',\n", + " 10310: 'yahoo',\n", + " 52060: 'meteorologist',\n", + " 42580: 'beswick',\n", + " 15496: 'boorman',\n", + " 40850: 'voicework',\n", + " 52061: \"ster'\",\n", + " 22925: 'blustering',\n", + " 52062: 'hj',\n", + " 27637: 'intake',\n", + " 5624: 'morally',\n", + " 40852: 'jumbling',\n", + " 52063: 'bowersock',\n", + " 52064: \"'porky's'\",\n", + " 16824: 'gershon',\n", + " 40853: 'ludicrosity',\n", + " 52065: 'coprophilia',\n", + " 40854: 'expressively',\n", + " 19503: \"india's\",\n", + " 34713: \"post's\",\n", + " 52066: 'wana',\n", + " 5286: 'wang',\n", + " 30574: 'wand',\n", + " 25248: 'wane',\n", + " 52324: 'edgeways',\n", + " 34714: 'titanium',\n", + " 40855: 'pinta',\n", + " 181: 'want',\n", + " 30575: 'pinto',\n", + " 52068: 'whoopdedoodles',\n", + " 21911: 'tchaikovsky',\n", + " 2106: 'travel',\n", + " 52069: \"'victory'\",\n", + " 11931: 'copious',\n", + " 22436: 'gouge',\n", + " 52070: \"chapters'\",\n", + " 6705: 'barbra',\n", + " 30576: 'uselessness',\n", + " 52071: \"wan'\",\n", + " 27638: 'assimilated',\n", + " 16119: 'petiot',\n", + " 52072: 'most\\x85and',\n", + " 3933: 'dinosaurs',\n", + " 355: 'wrong',\n", + " 52073: 'seda',\n", + " 52074: 'stollen',\n", + " 34715: 'sentencing',\n", + " 40856: 'ouroboros',\n", + " 40857: 'assimilates',\n", + " 40858: 'colorfully',\n", + " 27639: 'glenne',\n", + " 52075: 'dongen',\n", + " 4763: 'subplots',\n", + " 52076: 'kiloton',\n", + " 23384: 'chandon',\n", + " 34716: \"effect'\",\n", + " 27640: 'snugly',\n", + " 40859: 'kuei',\n", + " 9095: 'welcomed',\n", + " 30074: 'dishonor',\n", + " 52078: 'concurrence',\n", + " 23385: 'stoicism',\n", + " 14899: \"guys'\",\n", + " 52080: \"beroemd'\",\n", + " 6706: 'butcher',\n", + " 40860: \"melfi's\",\n", + " 30626: 'aargh',\n", + " 20602: 'playhouse',\n", + " 11311: 'wickedly',\n", + " 1183: 'fit',\n", + " 52081: 'labratory',\n", + " 40862: 'lifeline',\n", + " 1930: 'screaming',\n", + " 4290: 'fix',\n", + " 52082: 'cineliterate',\n", + " 52083: 'fic',\n", + " 52084: 'fia',\n", + " 34717: 'fig',\n", + " 52085: 'fmvs',\n", + " 52086: 'fie',\n", + " 52087: 'reentered',\n", + " 30577: 'fin',\n", + " 52088: 'doctresses',\n", + " 52089: 'fil',\n", + " 12609: 'zucker',\n", + " 31934: 'ached',\n", + " 52091: 'counsil',\n", + " 52092: 'paterfamilias',\n", + " 13888: 'songwriter',\n", + " 34718: 'shivam',\n", + " 9657: 'hurting',\n", + " 302: 'effects',\n", + " 52093: 'slauther',\n", + " 52094: \"'flame'\",\n", + " 52095: 'sommerset',\n", + " 52096: 'interwhined',\n", + " 27641: 'whacking',\n", + " 52097: 'bartok',\n", + " 8778: 'barton',\n", + " 21912: 'frewer',\n", + " 52098: \"fi'\",\n", + " 6195: 'ingrid',\n", + " 30578: 'stribor',\n", + " 52099: 'approporiately',\n", + " 52100: 'wobblyhand',\n", + " 52101: 'tantalisingly',\n", + " 52102: 'ankylosaurus',\n", + " 17637: 'parasites',\n", + " 52103: 'childen',\n", + " 52104: \"jenkins'\",\n", + " 52105: 'metafiction',\n", + " 17638: 'golem',\n", + " 40863: 'indiscretion',\n", + " 23386: \"reeves'\",\n", + " 57784: \"inamorata's\",\n", + " 52107: 'brittannica',\n", + " 7919: 'adapt',\n", + " 30579: \"russo's\",\n", + " 48249: 'guitarists',\n", + " 10556: 'abbott',\n", + " 40864: 'abbots',\n", + " 17652: 'lanisha',\n", + " 40866: 'magickal',\n", + " 52108: 'mattter',\n", + " 52109: \"'willy\",\n", + " 34719: 'pumpkins',\n", + " 52110: 'stuntpeople',\n", + " 30580: 'estimate',\n", + " 40867: 'ugghhh',\n", + " 11312: 'gameplay',\n", + " 52111: \"wern't\",\n", + " 40868: \"n'sync\",\n", + " 16120: 'sickeningly',\n", + " 40869: 'chiara',\n", + " 4014: 'disturbed',\n", + " 40870: 'portmanteau',\n", + " 52112: 'ineffectively',\n", + " 82146: \"duchonvey's\",\n", + " 37522: \"nasty'\",\n", + " 1288: 'purpose',\n", + " 52115: 'lazers',\n", + " 28108: 'lightened',\n", + " 52116: 'kaliganj',\n", + " 52117: 'popularism',\n", + " 18514: \"damme's\",\n", + " 30581: 'stylistics',\n", + " 52118: 'mindgaming',\n", + " 46452: 'spoilerish',\n", + " 52120: \"'corny'\",\n", + " 34721: 'boerner',\n", + " 6795: 'olds',\n", + " 52121: 'bakelite',\n", + " 27642: 'renovated',\n", + " 27643: 'forrester',\n", + " 52122: \"lumiere's\",\n", + " 52027: 'gaskets',\n", + " 887: 'needed',\n", + " 34722: 'smight',\n", + " 1300: 'master',\n", + " 25908: \"edie's\",\n", + " 40871: 'seeber',\n", + " 52123: 'hiya',\n", + " 52124: 'fuzziness',\n", + " 14900: 'genesis',\n", + " 12610: 'rewards',\n", + " 30582: 'enthrall',\n", + " 40872: \"'about\",\n", + " 52125: \"recollection's\",\n", + " 11042: 'mutilated',\n", + " 52126: 'fatherlands',\n", + " 52127: \"fischer's\",\n", + " 5402: 'positively',\n", + " 34708: '270',\n", + " 34723: 'ahmed',\n", + " 9839: 'zatoichi',\n", + " 13889: 'bannister',\n", + " 52130: 'anniversaries',\n", + " 30583: \"helm's\",\n", + " 52131: \"'work'\",\n", + " 34724: 'exclaimed',\n", + " 52132: \"'unfunny'\",\n", + " 52032: '274',\n", + " 547: 'feeling',\n", + " 52134: \"wanda's\",\n", + " 33269: 'dolan',\n", + " 52136: '278',\n", + " 52137: 'peacoat',\n", + " 40873: 'brawny',\n", + " 40874: 'mishra',\n", + " 40875: 'worlders',\n", + " 52138: 'protags',\n", + " 52139: 'skullcap',\n", + " 57599: 'dastagir',\n", + " 5625: 'affairs',\n", + " 7802: 'wholesome',\n", + " 52140: 'hymen',\n", + " 25249: 'paramedics',\n", + " 52141: 'unpersons',\n", + " 52142: 'heavyarms',\n", + " 52143: 'affaire',\n", + " 52144: 'coulisses',\n", + " 40876: 'hymer',\n", + " 52145: 'kremlin',\n", + " 30584: 'shipments',\n", + " 52146: 'pixilated',\n", + " 30585: \"'00s\",\n", + " 18515: 'diminishing',\n", + " 1360: 'cinematic',\n", + " 14901: 'resonates',\n", + " 40877: 'simplify',\n", + " 40878: \"nature'\",\n", + " 40879: 'temptresses',\n", + " 16825: 'reverence',\n", + " 19505: 'resonated',\n", + " 34725: 'dailey',\n", + " 52147: '2\\x85',\n", + " 27644: 'treize',\n", + " 52148: 'majo',\n", + " 21913: 'kiya',\n", + " 52149: 'woolnough',\n", + " 39800: 'thanatos',\n", + " 35734: 'sandoval',\n", + " 40882: 'dorama',\n", + " 52150: \"o'shaughnessy\",\n", + " 4991: 'tech',\n", + " 32021: 'fugitives',\n", + " 30586: 'teck',\n", + " 76128: \"'e'\",\n", + " 40884: 'doesn’t',\n", + " 52152: 'purged',\n", + " 660: 'saying',\n", + " 41098: \"martians'\",\n", + " 23421: 'norliss',\n", + " 27645: 'dickey',\n", + " 52155: 'dicker',\n", + " 52156: \"'sependipity\",\n", + " 8425: 'padded',\n", + " 57795: 'ordell',\n", + " 40885: \"sturges'\",\n", + " 52157: 'independentcritics',\n", + " 5748: 'tempted',\n", + " 34727: \"atkinson's\",\n", + " 25250: 'hounded',\n", + " 52158: 'apace',\n", + " 15497: 'clicked',\n", + " 30587: \"'humor'\",\n", + " 17180: \"martino's\",\n", + " 52159: \"'supporting\",\n", + " 52035: 'warmongering',\n", + " 34728: \"zemeckis's\",\n", + " 21914: 'lube',\n", + " 52160: 'shocky',\n", + " 7479: 'plate',\n", + " 40886: 'plata',\n", + " 40887: 'sturgess',\n", + " 40888: \"nerds'\",\n", + " 20603: 'plato',\n", + " 34729: 'plath',\n", + " 40889: 'platt',\n", + " 52162: 'mcnab',\n", + " 27646: 'clumsiness',\n", + " 3902: 'altogether',\n", + " 42587: 'massacring',\n", + " 52163: 'bicenntinial',\n", + " 40890: 'skaal',\n", + " 14363: 'droning',\n", + " 8779: 'lds',\n", + " 21915: 'jaguar',\n", + " 34730: \"cale's\",\n", + " 1780: 'nicely',\n", + " 4591: 'mummy',\n", + " 18516: \"lot's\",\n", + " 10089: 'patch',\n", + " 50205: 'kerkhof',\n", + " 52164: \"leader's\",\n", + " 27647: \"'movie\",\n", + " 52165: 'uncomfirmed',\n", + " 40891: 'heirloom',\n", + " 47363: 'wrangle',\n", + " 52166: 'emotion\\x85',\n", + " 52167: \"'stargate'\",\n", + " 40892: 'pinoy',\n", + " 40893: 'conchatta',\n", + " 41131: 'broeke',\n", + " 40894: 'advisedly',\n", + " 17639: \"barker's\",\n", + " 52169: 'descours',\n", + " 775: 'lots',\n", + " 9262: 'lotr',\n", + " 9882: 'irs',\n", + " 52170: 'lott',\n", + " 40895: 'xvi',\n", + " 34731: 'irk',\n", + " 52171: 'irl',\n", + " 6890: 'ira',\n", + " 21916: 'belzer',\n", + " 52172: 'irc',\n", + " 27648: 'ire',\n", + " 40896: 'requisites',\n", + " 7696: 'discipline',\n", + " 52964: 'lyoko',\n", + " 11313: 'extend',\n", + " 876: 'nature',\n", + " 52173: \"'dickie'\",\n", + " 40897: 'optimist',\n", + " 30589: 'lapping',\n", + " 3903: 'superficial',\n", + " 52174: 'vestment',\n", + " 2826: 'extent',\n", + " 52175: 'tendons',\n", + " 52176: \"heller's\",\n", + " 52177: 'quagmires',\n", + " 52178: 'miyako',\n", + " 20604: 'moocow',\n", + " 52179: \"coles'\",\n", + " 40898: 'lookit',\n", + " 52180: 'ravenously',\n", + " 40899: 'levitating',\n", + " 52181: 'perfunctorily',\n", + " 30590: 'lookin',\n", + " 40901: \"lot'\",\n", + " 52182: 'lookie',\n", + " 34873: 'fearlessly',\n", + " 52184: 'libyan',\n", + " 40902: 'fondles',\n", + " 35717: 'gopher',\n", + " 40904: 'wearying',\n", + " 52185: \"nz's\",\n", + " 27649: 'minuses',\n", + " 52186: 'puposelessly',\n", + " 52187: 'shandling',\n", + " 31271: 'decapitates',\n", + " 11932: 'humming',\n", + " 40905: \"'nother\",\n", + " 21917: 'smackdown',\n", + " 30591: 'underdone',\n", + " 40906: 'frf',\n", + " 52188: 'triviality',\n", + " 25251: 'fro',\n", + " 8780: 'bothers',\n", + " 52189: \"'kensington\",\n", + " 76: 'much',\n", + " 34733: 'muco',\n", + " 22618: 'wiseguy',\n", + " 27651: \"richie's\",\n", + " 40907: 'tonino',\n", + " 52190: 'unleavened',\n", + " 11590: 'fry',\n", + " 40908: \"'tv'\",\n", + " 40909: 'toning',\n", + " 14364: 'obese',\n", + " 30592: 'sensationalized',\n", + " 40910: 'spiv',\n", + " 6262: 'spit',\n", + " 7367: 'arkin',\n", + " 21918: 'charleton',\n", + " 16826: 'jeon',\n", + " 21919: 'boardroom',\n", + " 4992: 'doubts',\n", + " 3087: 'spin',\n", + " 53086: 'hepo',\n", + " 27652: 'wildcat',\n", + " 10587: 'venoms',\n", + " 52194: 'misconstrues',\n", + " 18517: 'mesmerising',\n", + " 40911: 'misconstrued',\n", + " 52195: 'rescinds',\n", + " 52196: 'prostrate',\n", + " 40912: 'majid',\n", + " 16482: 'climbed',\n", + " 34734: 'canoeing',\n", + " 52198: 'majin',\n", + " 57807: 'animie',\n", + " 40913: 'sylke',\n", + " 14902: 'conditioned',\n", + " 40914: 'waddell',\n", + " 52199: '3\\x85',\n", + " 41191: 'hyperdrive',\n", + " 34735: 'conditioner',\n", + " 53156: 'bricklayer',\n", + " 2579: 'hong',\n", + " 52201: 'memoriam',\n", + " 30595: 'inventively',\n", + " 25252: \"levant's\",\n", + " 20641: 'portobello',\n", + " 52203: 'remand',\n", + " 19507: 'mummified',\n", + " 27653: 'honk',\n", + " 19508: 'spews',\n", + " 40915: 'visitations',\n", + " 52204: 'mummifies',\n", + " 25253: 'cavanaugh',\n", + " 23388: 'zeon',\n", + " 40916: \"jungle's\",\n", + " 34736: 'viertel',\n", + " 27654: 'frenchmen',\n", + " 52205: 'torpedoes',\n", + " 52206: 'schlessinger',\n", + " 34737: 'torpedoed',\n", + " 69879: 'blister',\n", + " 52207: 'cinefest',\n", + " 34738: 'furlough',\n", + " 52208: 'mainsequence',\n", + " 40917: 'mentors',\n", + " 9097: 'academic',\n", + " 20605: 'stillness',\n", + " 40918: 'academia',\n", + " 52209: 'lonelier',\n", + " 52210: 'nibby',\n", + " 52211: \"losers'\",\n", + " 40919: 'cineastes',\n", + " 4452: 'corporate',\n", + " 40920: 'massaging',\n", + " 30596: 'bellow',\n", + " 19509: 'absurdities',\n", + " 53244: 'expetations',\n", + " 40921: 'nyfiken',\n", + " 75641: 'mehras',\n", + " 52212: 'lasse',\n", + " 52213: 'visability',\n", + " 33949: 'militarily',\n", + " 52214: \"elder'\",\n", + " 19026: 'gainsbourg',\n", + " 20606: 'hah',\n", + " 13423: 'hai',\n", + " 34739: 'haj',\n", + " 25254: 'hak',\n", + " 4314: 'hal',\n", + " 4895: 'ham',\n", + " 53262: 'duffer',\n", + " 52216: 'haa',\n", + " 69: 'had',\n", + " 11933: 'advancement',\n", + " 16828: 'hag',\n", + " 25255: \"hand'\",\n", + " 13424: 'hay',\n", + " 20607: 'mcnamara',\n", + " 52217: \"mozart's\",\n", + " 30734: 'duffel',\n", + " 30597: 'haq',\n", + " 13890: 'har',\n", + " 47: 'has',\n", + " 2404: 'hat',\n", + " 40922: 'hav',\n", + " 30598: 'haw',\n", + " 52218: 'figtings',\n", + " 15498: 'elders',\n", + " 52219: 'underpanted',\n", + " 52220: 'pninson',\n", + " 27655: 'unequivocally',\n", + " 23676: \"barbara's\",\n", + " 52222: \"bello'\",\n", + " 13000: 'indicative',\n", + " 40923: 'yawnfest',\n", + " 52223: 'hexploitation',\n", + " 52224: \"loder's\",\n", + " 27656: 'sleuthing',\n", + " 32625: \"justin's\",\n", + " 52225: \"'ball\",\n", + " 52226: \"'summer\",\n", + " 34938: \"'demons'\",\n", + " 52228: \"mormon's\",\n", + " 34740: \"laughton's\",\n", + " 52229: 'debell',\n", + " 39727: 'shipyard',\n", + " 30600: 'unabashedly',\n", + " 40404: 'disks',\n", + " 2293: 'crowd',\n", + " 10090: 'crowe',\n", + " 56437: \"vancouver's\",\n", + " 34741: 'mosques',\n", + " 6630: 'crown',\n", + " 52230: 'culpas',\n", + " 27657: 'crows',\n", + " 53347: 'surrell',\n", + " 52232: 'flowless',\n", + " 52233: 'sheirk',\n", + " 40926: \"'three\",\n", + " 52234: \"peterson'\",\n", + " 52235: 'ooverall',\n", + " 40927: 'perchance',\n", + " 1324: 'bottom',\n", + " 53366: 'chabert',\n", + " 52236: 'sneha',\n", + " 13891: 'inhuman',\n", + " 52237: 'ichii',\n", + " 52238: 'ursla',\n", + " 30601: 'completly',\n", + " 40928: 'moviedom',\n", + " 52239: 'raddick',\n", + " 51998: 'brundage',\n", + " 40929: 'brigades',\n", + " 1184: 'starring',\n", + " 52240: \"'goal'\",\n", + " 52241: 'caskets',\n", + " 52242: 'willcock',\n", + " 52243: \"threesome's\",\n", + " 52244: \"mosque'\",\n", + " 52245: \"cover's\",\n", + " 17640: 'spaceships',\n", + " 40930: 'anomalous',\n", + " 27658: 'ptsd',\n", + " 52246: 'shirdan',\n", + " 21965: 'obscenity',\n", + " 30602: 'lemmings',\n", + " 30603: 'duccio',\n", + " 52247: \"levene's\",\n", + " 52248: \"'gorby'\",\n", + " 25258: \"teenager's\",\n", + " 5343: 'marshall',\n", + " 9098: 'honeymoon',\n", + " 3234: 'shoots',\n", + " 12261: 'despised',\n", + " 52249: 'okabasho',\n", + " 8292: 'fabric',\n", + " 18518: 'cannavale',\n", + " 3540: 'raped',\n", + " 52250: \"tutt's\",\n", + " 17641: 'grasping',\n", + " 18519: 'despises',\n", + " 40931: \"thief's\",\n", + " 8929: 'rapes',\n", + " 52251: 'raper',\n", + " 27659: \"eyre'\",\n", + " 52252: 'walchek',\n", + " 23389: \"elmo's\",\n", + " 40932: 'perfumes',\n", + " 21921: 'spurting',\n", + " 52253: \"exposition'\\x85\",\n", + " 52254: 'denoting',\n", + " 34743: 'thesaurus',\n", + " 40933: \"shoot'\",\n", + " 49762: 'bonejack',\n", + " 52256: 'simpsonian',\n", + " 30604: 'hebetude',\n", + " 34744: \"hallow's\",\n", + " 52257: 'desperation\\x85',\n", + " 34745: 'incinerator',\n", + " 10311: 'congratulations',\n", + " 52258: 'humbled',\n", + " 5927: \"else's\",\n", + " 40848: 'trelkovski',\n", + " 52259: \"rape'\",\n", + " 59389: \"'chapters'\",\n", + " 52260: '1600s',\n", + " 7256: 'martian',\n", + " 25259: 'nicest',\n", + " 52262: 'eyred',\n", + " 9460: 'passenger',\n", + " 6044: 'disgrace',\n", + " 52263: 'moderne',\n", + " 5123: 'barrymore',\n", + " 52264: 'yankovich',\n", + " 40934: 'moderns',\n", + " 52265: 'studliest',\n", + " 52266: 'bedsheet',\n", + " 14903: 'decapitation',\n", + " 52267: 'slurring',\n", + " 52268: \"'nunsploitation'\",\n", + " 34746: \"'character'\",\n", + " 9883: 'cambodia',\n", + " 52269: 'rebelious',\n", + " 27660: 'pasadena',\n", + " 40935: 'crowne',\n", + " 52270: \"'bedchamber\",\n", + " 52271: 'conjectural',\n", + " 52272: 'appologize',\n", + " 52273: 'halfassing',\n", + " 57819: 'paycheque',\n", + " 20609: 'palms',\n", + " 52274: \"'islands\",\n", + " 40936: 'hawked',\n", + " 21922: 'palme',\n", + " 40937: 'conservatively',\n", + " 64010: 'larp',\n", + " 5561: 'palma',\n", + " 21923: 'smelling',\n", + " 13001: 'aragorn',\n", + " 52275: 'hawker',\n", + " 52276: 'hawkes',\n", + " 3978: 'explosions',\n", + " 8062: 'loren',\n", + " 52277: \"pyle's\",\n", + " 6707: 'shootout',\n", + " 18520: \"mike's\",\n", + " 52278: \"driscoll's\",\n", + " 40938: 'cogsworth',\n", + " 52279: \"britian's\",\n", + " 34747: 'childs',\n", + " 52280: \"portrait's\",\n", + " 3629: 'chain',\n", + " 2500: 'whoever',\n", + " 52281: 'puttered',\n", + " 52282: 'childe',\n", + " 52283: 'maywether',\n", + " 3039: 'chair',\n", + " 52284: \"rance's\",\n", + " 34748: 'machu',\n", + " 4520: 'ballet',\n", + " 34749: 'grapples',\n", + " 76155: 'summerize',\n", + " 30606: 'freelance',\n", + " 52286: \"andrea's\",\n", + " 52287: '\\x91very',\n", + " 45882: 'coolidge',\n", + " 18521: 'mache',\n", + " 52288: 'balled',\n", + " 40940: 'grappled',\n", + " 18522: 'macha',\n", + " 21924: 'underlining',\n", + " 5626: 'macho',\n", + " 19510: 'oversight',\n", + " 25260: 'machi',\n", + " 11314: 'verbally',\n", + " 21925: 'tenacious',\n", + " 40941: 'windshields',\n", + " 18560: 'paychecks',\n", + " 3399: 'jerk',\n", + " 11934: \"good'\",\n", + " 34751: 'prancer',\n", + " 21926: 'prances',\n", + " 52289: 'olympus',\n", + " 21927: 'lark',\n", + " 10788: 'embark',\n", + " 7368: 'gloomy',\n", + " 52290: 'jehaan',\n", + " 52291: 'turaqui',\n", + " 20610: \"child'\",\n", + " 2897: 'locked',\n", + " 52292: 'pranced',\n", + " 2591: 'exact',\n", + " 52293: 'unattuned',\n", + " 786: 'minute',\n", + " 16121: 'skewed',\n", + " 40943: 'hodgins',\n", + " 34752: 'skewer',\n", + " 52294: 'think\\x85',\n", + " 38768: 'rosenstein',\n", + " 52295: 'helmit',\n", + " 34753: 'wrestlemanias',\n", + " 16829: 'hindered',\n", + " 30607: \"martha's\",\n", + " 52296: 'cheree',\n", + " 52297: \"pluckin'\",\n", + " 40944: 'ogles',\n", + " 11935: 'heavyweight',\n", + " 82193: 'aada',\n", + " 11315: 'chopping',\n", + " 61537: 'strongboy',\n", + " 41345: 'hegemonic',\n", + " 40945: 'adorns',\n", + " 41349: 'xxth',\n", + " 34754: 'nobuhiro',\n", + " 52301: 'capitães',\n", + " 52302: 'kavogianni',\n", + " 13425: 'antwerp',\n", + " 6541: 'celebrated',\n", + " 52303: 'roarke',\n", + " 40946: 'baggins',\n", + " 31273: 'cheeseburgers',\n", + " 52304: 'matras',\n", + " 52305: \"nineties'\",\n", + " 52306: \"'craig'\",\n", + " 13002: 'celebrates',\n", + " 3386: 'unintentionally',\n", + " 14365: 'drafted',\n", + " 52307: 'climby',\n", + " 52308: '303',\n", + " 18523: 'oldies',\n", + " 9099: 'climbs',\n", + " 9658: 'honour',\n", + " 34755: 'plucking',\n", + " 30077: '305',\n", + " 5517: 'address',\n", + " 40947: 'menjou',\n", + " 42595: \"'freak'\",\n", + " 19511: 'dwindling',\n", + " 9461: 'benson',\n", + " 52310: 'white’s',\n", + " 40948: 'shamelessness',\n", + " 21928: 'impacted',\n", + " 52311: 'upatz',\n", + " 3843: 'cusack',\n", + " 37570: \"flavia's\",\n", + " 52312: 'effette',\n", + " 34756: 'influx',\n", + " 52313: 'boooooooo',\n", + " 52314: 'dimitrova',\n", + " 13426: 'houseman',\n", + " 25262: 'bigas',\n", + " 52315: 'boylen',\n", + " 52316: 'phillipenes',\n", + " 40949: 'fakery',\n", + " 27661: \"grandpa's\",\n", + " 27662: 'darnell',\n", + " 19512: 'undergone',\n", + " 52318: 'handbags',\n", + " 21929: 'perished',\n", + " 37781: 'pooped',\n", + " 27663: 'vigour',\n", + " 3630: 'opposed',\n", + " 52319: 'etude',\n", + " 11802: \"caine's\",\n", + " 52320: 'doozers',\n", + " 34757: 'photojournals',\n", + " 52321: 'perishes',\n", + " 34758: 'constrains',\n", + " 40951: 'migenes',\n", + " 30608: 'consoled',\n", + " 16830: 'alastair',\n", + " 52322: 'wvs',\n", + " 52323: 'ooooooh',\n", + " 34759: 'approving',\n", + " 40952: 'consoles',\n", + " 52067: 'disparagement',\n", + " 52325: 'futureistic',\n", + " 52326: 'rebounding',\n", + " 52327: \"'date\",\n", + " 52328: 'gregoire',\n", + " 21930: 'rutherford',\n", + " 34760: 'americanised',\n", + " 82199: 'novikov',\n", + " 1045: 'following',\n", + " 34761: 'munroe',\n", + " 52329: \"morita'\",\n", + " 52330: 'christenssen',\n", + " 23109: 'oatmeal',\n", + " 25263: 'fossey',\n", + " 40953: 'livered',\n", + " 13003: 'listens',\n", + " 76167: \"'marci\",\n", + " 52333: \"otis's\",\n", + " 23390: 'thanking',\n", + " 16022: 'maude',\n", + " 34762: 'extensions',\n", + " 52335: 'ameteurish',\n", + " 52336: \"commender's\",\n", + " 27664: 'agricultural',\n", + " 4521: 'convincingly',\n", + " 17642: 'fueled',\n", + " 54017: 'mahattan',\n", + " 40955: \"paris's\",\n", + " 52339: 'vulkan',\n", + " 52340: 'stapes',\n", + " 52341: 'odysessy',\n", + " 12262: 'harmon',\n", + " 4255: 'surfing',\n", + " 23497: 'halloran',\n", + " 49583: 'unbelieveably',\n", + " 52342: \"'offed'\",\n", + " 30610: 'quadrant',\n", + " 19513: 'inhabiting',\n", + " 34763: 'nebbish',\n", + " 40956: 'forebears',\n", + " 34764: 'skirmish',\n", + " 52343: 'ocassionally',\n", + " 52344: \"'resist\",\n", + " 21931: 'impactful',\n", + " 52345: 'spicier',\n", + " 40957: 'touristy',\n", + " 52346: \"'football'\",\n", + " 40958: 'webpage',\n", + " 52348: 'exurbia',\n", + " 52349: 'jucier',\n", + " 14904: 'professors',\n", + " 34765: 'structuring',\n", + " 30611: 'jig',\n", + " 40959: 'overlord',\n", + " 25264: 'disconnect',\n", + " 82204: 'sniffle',\n", + " 40960: 'slimeball',\n", + " 40961: 'jia',\n", + " 16831: 'milked',\n", + " 40962: 'banjoes',\n", + " 1240: 'jim',\n", + " 52351: 'workforces',\n", + " 52352: 'jip',\n", + " 52353: 'rotweiller',\n", + " 34766: 'mundaneness',\n", + " 52354: \"'ninja'\",\n", + " 11043: \"dead'\",\n", + " 40963: \"cipriani's\",\n", + " 20611: 'modestly',\n", + " 52355: \"professor'\",\n", + " 40964: 'shacked',\n", + " 34767: 'bashful',\n", + " 23391: 'sorter',\n", + " 16123: 'overpowering',\n", + " 18524: 'workmanlike',\n", + " 27665: 'henpecked',\n", + " 18525: 'sorted',\n", + " 52357: \"jōb's\",\n", + " 52358: \"'always\",\n", + " 34768: \"'baptists\",\n", + " 52359: 'dreamcatchers',\n", + " 52360: \"'silence'\",\n", + " 21932: 'hickory',\n", + " 52361: 'fun\\x97yet',\n", + " 52362: 'breakumentary',\n", + " 15499: 'didn',\n", + " 52363: 'didi',\n", + " 52364: 'pealing',\n", + " 40965: 'dispite',\n", + " 25265: \"italy's\",\n", + " 21933: 'instability',\n", + " 6542: 'quarter',\n", + " 12611: 'quartet',\n", + " 52365: 'padmé',\n", + " 52366: \"'bleedmedry\",\n", + " 52367: 'pahalniuk',\n", + " 52368: 'honduras',\n", + " 10789: 'bursting',\n", + " 41468: \"pablo's\",\n", + " 52370: 'irremediably',\n", + " 40966: 'presages',\n", + " 57835: 'bowlegged',\n", + " 65186: 'dalip',\n", + " 6263: 'entering',\n", + " 76175: 'newsradio',\n", + " 54153: 'presaged',\n", + " 27666: \"giallo's\",\n", + " 40967: 'bouyant',\n", + " 52371: 'amerterish',\n", + " 18526: 'rajni',\n", + " 30613: 'leeves',\n", + " 34770: 'macauley',\n", + " 615: 'seriously',\n", + " 52372: 'sugercoma',\n", + " 52373: 'grimstead',\n", + " 52374: \"'fairy'\",\n", + " 30614: 'zenda',\n", + " 52375: \"'twins'\",\n", + " 17643: 'realisation',\n", + " 27667: 'highsmith',\n", + " 7820: 'raunchy',\n", + " 40968: 'incentives',\n", + " 52377: 'flatson',\n", + " 35100: 'snooker',\n", + " 16832: 'crazies',\n", + " 14905: 'crazier',\n", + " 7097: 'grandma',\n", + " 52378: 'napunsaktha',\n", + " 30615: 'workmanship',\n", + " 52379: 'reisner',\n", + " 61309: \"sanford's\",\n", + " 52380: '\\x91doña',\n", + " 6111: 'modest',\n", + " 19156: \"everything's\",\n", + " 40969: 'hamer',\n", + " 52382: \"couldn't'\",\n", + " 13004: 'quibble',\n", + " 52383: 'socking',\n", + " 21934: 'tingler',\n", + " 52384: 'gutman',\n", + " 40970: 'lachlan',\n", + " 52385: 'tableaus',\n", + " 52386: 'headbanger',\n", + " 2850: 'spoken',\n", + " 34771: 'cerebrally',\n", + " 23493: \"'road\",\n", + " 21935: 'tableaux',\n", + " 40971: \"proust's\",\n", + " 40972: 'periodical',\n", + " 52388: \"shoveller's\",\n", + " 25266: 'tamara',\n", + " 17644: 'affords',\n", + " 3252: 'concert',\n", + " 87958: \"yara's\",\n", + " 52389: 'someome',\n", + " 8427: 'lingering',\n", + " 41514: \"abraham's\",\n", + " 34772: 'beesley',\n", + " 34773: 'cherbourg',\n", + " 28627: 'kagan',\n", + " 9100: 'snatch',\n", + " 9263: \"miyazaki's\",\n", + " 25267: 'absorbs',\n", + " 40973: \"koltai's\",\n", + " 64030: 'tingled',\n", + " 19514: 'crossroads',\n", + " 16124: 'rehab',\n", + " 52392: 'falworth',\n", + " 52393: 'sequals',\n", + " ...}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word_index = imdb.get_word_index()\n", + "word_index = { k: (v + 3) for k, v in word_index.items() }\n", + "word_index[\"PAD\"] = 0\n", + "word_index[\"START\"] = 1\n", + "word_index[\"UNK\"] = 2\n", + "index_word = { v: k for k, v in word_index.items() }\n", + "index_word" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "059670a8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 530,\n", + " 973,\n", + " 1622,\n", + " 1385,\n", + " 65,\n", + " 458,\n", + " 4468,\n", + " 66,\n", + " 3941,\n", + " 2,\n", + " 173,\n", + " 2,\n", + " 256,\n", + " 2,\n", + " 2,\n", + " 100,\n", + " 2,\n", + " 838,\n", + " 112,\n", + " 50,\n", + " 670,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 480,\n", + " 284,\n", + " 2,\n", + " 150,\n", + " 2,\n", + " 172,\n", + " 112,\n", + " 167,\n", + " 2,\n", + " 336,\n", + " 385,\n", + " 2,\n", + " 2,\n", + " 172,\n", + " 4536,\n", + " 1111,\n", + " 2,\n", + " 546,\n", + " 2,\n", + " 2,\n", + " 447,\n", + " 2,\n", + " 192,\n", + " 50,\n", + " 2,\n", + " 2,\n", + " 147,\n", + " 2025,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 1920,\n", + " 4613,\n", + " 469,\n", + " 2,\n", + " 2,\n", + " 71,\n", + " 87,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 530,\n", + " 2,\n", + " 76,\n", + " 2,\n", + " 2,\n", + " 1247,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 515,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 626,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 62,\n", + " 386,\n", + " 2,\n", + " 2,\n", + " 316,\n", + " 2,\n", + " 106,\n", + " 2,\n", + " 2,\n", + " 2223,\n", + " 2,\n", + " 2,\n", + " 480,\n", + " 66,\n", + " 3785,\n", + " 2,\n", + " 2,\n", + " 130,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 619,\n", + " 2,\n", + " 2,\n", + " 124,\n", + " 51,\n", + " 2,\n", + " 135,\n", + " 2,\n", + " 2,\n", + " 1415,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 215,\n", + " 2,\n", + " 77,\n", + " 52,\n", + " 2,\n", + " 2,\n", + " 407,\n", + " 2,\n", + " 82,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 107,\n", + " 117,\n", + " 2,\n", + " 2,\n", + " 256,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 3766,\n", + " 2,\n", + " 723,\n", + " 2,\n", + " 71,\n", + " 2,\n", + " 530,\n", + " 476,\n", + " 2,\n", + " 400,\n", + " 317,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 1029,\n", + " 2,\n", + " 104,\n", + " 88,\n", + " 2,\n", + " 381,\n", + " 2,\n", + " 297,\n", + " 98,\n", + " 2,\n", + " 2071,\n", + " 56,\n", + " 2,\n", + " 141,\n", + " 2,\n", + " 194,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 226,\n", + " 2,\n", + " 2,\n", + " 134,\n", + " 476,\n", + " 2,\n", + " 480,\n", + " 2,\n", + " 144,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 51,\n", + " 2,\n", + " 2,\n", + " 224,\n", + " 92,\n", + " 2,\n", + " 104,\n", + " 2,\n", + " 226,\n", + " 65,\n", + " 2,\n", + " 2,\n", + " 1334,\n", + " 88,\n", + " 2,\n", + " 2,\n", + " 283,\n", + " 2,\n", + " 2,\n", + " 4472,\n", + " 113,\n", + " 103,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 178,\n", + " 2]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "4c1912fa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"UNK UNK UNK UNK UNK brilliant casting location scenery story direction everyone's really suited UNK part UNK played UNK UNK could UNK imagine being there robert UNK UNK UNK amazing actor UNK now UNK same being director UNK father came UNK UNK same scottish island UNK myself UNK UNK loved UNK fact there UNK UNK real connection UNK UNK UNK UNK witty remarks throughout UNK UNK were great UNK UNK UNK brilliant UNK much UNK UNK bought UNK UNK UNK soon UNK UNK UNK released UNK UNK UNK would recommend UNK UNK everyone UNK watch UNK UNK fly UNK UNK amazing really cried UNK UNK end UNK UNK UNK sad UNK UNK know what UNK say UNK UNK cry UNK UNK UNK UNK must UNK been good UNK UNK definitely UNK also UNK UNK UNK two little UNK UNK played UNK UNK UNK norman UNK paul UNK were UNK brilliant children UNK often left UNK UNK UNK UNK list UNK think because UNK stars UNK play them UNK grown up UNK such UNK big UNK UNK UNK whole UNK UNK these children UNK amazing UNK should UNK UNK UNK what UNK UNK done don't UNK think UNK whole story UNK UNK lovely because UNK UNK true UNK UNK someone's life after UNK UNK UNK UNK UNK us UNK\"" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\" \".join(index_word[id] for id in X_train[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "faf79c8d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"START this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert redford's is an amazing actor and now the same being director norman's father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for retail and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also congratulations to the two little boy's that played the part's of norman and paul they were just brilliant children are often left out of the praising list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\"" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(textual_X_train, _), _ = imdb.load_data()\n", + "\" \".join(index_word[id] for id in textual_X_train[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "131e125a", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.preprocessing.sequence import pad_sequences\n", + "\n", + "X_train = pad_sequences(X_train, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)\n", + "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "6a2e7a0e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Model: \"sequential_1\"\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential_1\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+       "│ embedding_1 (Embedding)         │ (None, 100, 64)        │       320,000 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ flatten_1 (Flatten)             │ (None, 6400)           │             0 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dense_2 (Dense)                 │ (None, 64)             │       409,664 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dropout_1 (Dropout)             │ (None, 64)             │             0 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dense_3 (Dense)                 │ (None, 1)              │            65 │\n",
+       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", + "│ embedding_1 (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m320,000\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ flatten_1 (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m6400\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m409,664\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 729,729 (2.78 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m729,729\u001b[0m (2.78 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 729,729 (2.78 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m729,729\u001b[0m (2.78 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from keras.api.models import Sequential\n", + "from keras.api.layers import Dense, Flatten, Dropout, Embedding, InputLayer\n", + "\n", + "simple_model = Sequential()\n", + "simple_model.add(InputLayer(shape=(max_length,), dtype=\"float32\"))\n", + "simple_model.add(Embedding(unique_words, 64))\n", + "simple_model.add(Flatten())\n", + "simple_model.add(Dense(64, activation=\"relu\"))\n", + "simple_model.add(Dropout(0.5))\n", + "simple_model.add(Dense(1, activation=\"sigmoid\"))\n", + "\n", + "simple_model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "52043fc5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 19ms/step - accuracy: 0.5753 - loss: 0.6517 - val_accuracy: 0.8346 - val_loss: 0.3689\n", + "Epoch 2/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 17ms/step - accuracy: 0.8922 - loss: 0.2751 - val_accuracy: 0.8460 - val_loss: 0.3510\n", + "Epoch 3/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 18ms/step - accuracy: 0.9724 - loss: 0.1080 - val_accuracy: 0.8335 - val_loss: 0.4402\n", + "Epoch 4/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 18ms/step - accuracy: 0.9974 - loss: 0.0224 - val_accuracy: 0.8337 - val_loss: 0.5407\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from keras.api.callbacks import ModelCheckpoint\n", + "\n", + "simple_model.compile(\n", + " loss=\"binary_crossentropy\",\n", + " optimizer=\"adam\",\n", + " metrics=[\"accuracy\"],\n", + ")\n", + "\n", + "simple_model.fit(\n", + " X_train,\n", + " y_train,\n", + " batch_size=128,\n", + " epochs=4,\n", + " validation_data=(X_valid, y_valid),\n", + " callbacks=[ModelCheckpoint(filepath=output_dir + \"/simple_weights.{epoch:02d}.keras\")],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "73443ddb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.8436 - loss: 0.3559\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.3510318398475647, 0.8459600210189819]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simple_model.load_weights(output_dir + \"/simple_weights.02.keras\")\n", + "simple_model.evaluate(X_valid, y_valid)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "069236c0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step\n" + ] + }, + { + "data": { + "image/png": "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AACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4F3SAWbhwobp06aKYmBj17dtXO3fubOqWAADABeCCDTAvv/yysrKy9NBDD+n999/XVVddpdTUVB0+fLipWwMAAE3sgg0wc+fO1ejRo3X//fcrOTlZS5YsUcuWLfXSSy81dWsAAKCJRTd1A2dTUVGhgoICTZ061V4XGRmplJQU5efnn3Wb8vJylZeX2z+XlZVJkoLBYL33V1P+bb3vE8D5qY44qeD//ytYXf6taqyapm0I+IlqiPPr6fu1LOsH6y7IAPP111+rurpaHo8nZL3H49G+ffvOus2sWbP08MMPn7E+MTGxQXoE0HTc9qv7mrAL4KfN/UzD7v/o0aNyu93nHL8gA0xdTJ06VVlZWfbPNTU1OnLkiNq3b6+IiIh6e59gMKjExEQdPHhQLper3vaLMzHXjYN5bhzMc+NgnhtHQ86zZVk6evSoEhISfrDuggwwF110kaKiohQIBELWBwIBeb3es27jdDrldDpD1sXFxTVUi3K5XPzlaCTMdeNgnhsH89w4mOfG0VDz/ENXXmpdkDfxOhwO9e7dW3l5efa6mpoa5eXlyefzNWFnAADgQnBBXoGRpKysLA0fPlx9+vTRNddco2eeeUbHjx/X/fff39StAQCAJnbBBpi7775bX331laZPny6/36+rr75aGzZsOOPG3sbmdDr10EMPnfHrKtQ/5rpxMM+Ng3luHMxz47gQ5jnC+lfPKQEAAFxgLsh7YAAAAH4IAQYAABiHAAMAAIxDgAEAAMYhwJzFwoUL1aVLF8XExKhv377auXPnD9avWbNG3bt3V0xMjHr27Kk33nijkTo1Xzhz/cILL6h///5q27at2rZtq5SUlH/53wanhPtnutaqVasUERGhO+64o2EbbCbCnefS0lJlZGSoQ4cOcjqduuyyy/j34zyEO8/PPPOMunXrptjYWCUmJiozM1MnT55spG7NtHXrVt12221KSEhQRESEXn311X+5zebNm9WrVy85nU517dpV2dnZDdukhRCrVq2yHA6H9dJLL1m7d++2Ro8ebcXFxVmBQOCs9e+++64VFRVlzZkzx9qzZ481bdo0q0WLFlZRUVEjd26ecOf63nvvtRYuXGh98MEH1t69e63f/e53ltvttv7+9783cudmCXeeax04cMD62c9+ZvXv39+6/fbb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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.hist(simple_model.predict(X_valid))\n", + "_ = plt.axvline(x=0.5, color=\"orange\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv (3.12.10)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lec4-3-nlp-conv.ipynb b/lec4-3-nlp-conv.ipynb new file mode 100644 index 0000000..83dbcd5 --- /dev/null +++ b/lec4-3-nlp-conv.ipynb @@ -0,0 +1,323 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "507915ea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.9.2\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "os.environ[\"KERAS_BACKEND\"] = \"torch\"\n", + "import keras\n", + "\n", + "print(keras.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e0043e5c", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.datasets import imdb\n", + "import os\n", + "\n", + "unique_words = 5000\n", + "max_length = 400\n", + "\n", + "output_dir = \"tmp\"\n", + "if not os.path.exists(output_dir):\n", + " os.makedirs(output_dir)\n", + "\n", + "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "131e125a", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.preprocessing.sequence import pad_sequences\n", + "\n", + "X_train = pad_sequences(X_train, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)\n", + "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "47f253ee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Model: \"sequential\"\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+       "│ embedding (Embedding)           │ (None, 400, 64)        │       320,000 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ spatial_dropout1d               │ (None, 400, 64)        │             0 │\n",
+       "│ (SpatialDropout1D)              │                        │               │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ conv1d (Conv1D)                 │ (None, 398, 256)       │        49,408 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ global_max_pooling1d            │ (None, 256)            │             0 │\n",
+       "│ (GlobalMaxPooling1D)            │                        │               │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dense (Dense)                   │ (None, 256)            │        65,792 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dropout (Dropout)               │ (None, 256)            │             0 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dense_1 (Dense)                 │ (None, 1)              │           257 │\n",
+       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", + "│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m400\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m320,000\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ spatial_dropout1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m400\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "│ (\u001b[38;5;33mSpatialDropout1D\u001b[0m) │ │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ conv1d (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m398\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m49,408\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ global_max_pooling1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "│ (\u001b[38;5;33mGlobalMaxPooling1D\u001b[0m) │ │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m65,792\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m257\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 435,457 (1.66 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m435,457\u001b[0m (1.66 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 435,457 (1.66 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m435,457\u001b[0m (1.66 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from keras.api.models import Sequential\n", + "from keras.api.layers import InputLayer, Embedding, SpatialDropout1D, Conv1D, GlobalMaxPooling1D, Dense, Dropout\n", + "\n", + "conv_model = Sequential()\n", + "conv_model.add(InputLayer(shape=(max_length,), dtype=\"float32\"))\n", + "conv_model.add(Embedding(unique_words, 64))\n", + "conv_model.add(SpatialDropout1D(0.2))\n", + "\n", + "# сверточный слой\n", + "conv_model.add(Conv1D(256, 3, activation=\"relu\"))\n", + "\n", + "conv_model.add(GlobalMaxPooling1D())\n", + "\n", + "# полносвязанный слой\n", + "conv_model.add(Dense(256, activation=\"relu\"))\n", + "conv_model.add(Dropout(0.2))\n", + "\n", + "# выходной слой\n", + "conv_model.add(Dense(1, activation=\"sigmoid\"))\n", + "\n", + "conv_model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "68838a5a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 48ms/step - accuracy: 0.6241 - loss: 0.6084 - val_accuracy: 0.8735 - val_loss: 0.3017\n", + "Epoch 2/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 44ms/step - accuracy: 0.8978 - loss: 0.2526 - val_accuracy: 0.8906 - val_loss: 0.2637\n", + "Epoch 3/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 45ms/step - accuracy: 0.9400 - loss: 0.1670 - val_accuracy: 0.8906 - val_loss: 0.2735\n", + "Epoch 4/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 46ms/step - accuracy: 0.9648 - loss: 0.1062 - val_accuracy: 0.8894 - val_loss: 0.3019\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from keras.api.callbacks import ModelCheckpoint\n", + "\n", + "conv_model.compile(\n", + " loss=\"binary_crossentropy\",\n", + " optimizer=\"adam\",\n", + " metrics=[\"accuracy\"],\n", + ")\n", + "\n", + "conv_model.fit(\n", + " X_train,\n", + " y_train,\n", + " batch_size=128,\n", + " epochs=4,\n", + " validation_data=(X_valid, y_valid),\n", + " callbacks=[ModelCheckpoint(filepath=output_dir + \"/conv_weights.{epoch:02d}.keras\")],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6475dab9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.8874 - loss: 0.2689\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.2637385427951813, 0.89055997133255]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "conv_model.load_weights(output_dir + \"/conv_weights.02.keras\")\n", + "conv_model.evaluate(X_valid, y_valid)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bf2d2d6c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 4ms/step\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.hist(conv_model.predict(X_valid))\n", + "_ = plt.axvline(x=0.5, color=\"orange\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv (3.12.10)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lec4-4-nlp-rnn.ipynb b/lec4-4-nlp-rnn.ipynb new file mode 100644 index 0000000..1079499 --- /dev/null +++ b/lec4-4-nlp-rnn.ipynb @@ -0,0 +1,323 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "507915ea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.9.2\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "os.environ[\"KERAS_BACKEND\"] = \"jax\"\n", + "import keras\n", + "\n", + "print(keras.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e0043e5c", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.datasets import imdb\n", + "import os\n", + "\n", + "unique_words = 10000\n", + "max_length = 100\n", + "\n", + "output_dir = \"tmp\"\n", + "if not os.path.exists(output_dir):\n", + " os.makedirs(output_dir)\n", + "\n", + "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "131e125a", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.preprocessing.sequence import pad_sequences\n", + "\n", + "X_train = pad_sequences(X_train, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)\n", + "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1e3fb0ec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Model: \"sequential\"\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+       "│ embedding (Embedding)           │ (None, 100, 64)        │       640,000 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ spatial_dropout1d               │ (None, 100, 64)        │             0 │\n",
+       "│ (SpatialDropout1D)              │                        │               │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ simple_rnn (SimpleRNN)          │ (None, 256)            │        82,176 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dense (Dense)                   │ (None, 1)              │           257 │\n",
+       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", + "│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m640,000\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ spatial_dropout1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "│ (\u001b[38;5;33mSpatialDropout1D\u001b[0m) │ │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ simple_rnn (\u001b[38;5;33mSimpleRNN\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m82,176\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m257\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 722,433 (2.76 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m722,433\u001b[0m (2.76 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 722,433 (2.76 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m722,433\u001b[0m (2.76 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from keras.api.models import Sequential\n", + "from keras.api.layers import InputLayer, Embedding, SpatialDropout1D, SimpleRNN, Dense\n", + "\n", + "rnn_model = Sequential()\n", + "rnn_model.add(InputLayer(shape=(max_length,), dtype=\"float32\"))\n", + "rnn_model.add(Embedding(unique_words, 64))\n", + "rnn_model.add(SpatialDropout1D(0.2))\n", + "rnn_model.add(SimpleRNN(256, dropout=0.2))\n", + "rnn_model.add(Dense(1, activation=\"sigmoid\"))\n", + "\n", + "rnn_model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "11236198", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 68ms/step - accuracy: 0.5207 - loss: 0.6994 - val_accuracy: 0.5872 - val_loss: 0.6700\n", + "Epoch 2/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 64ms/step - accuracy: 0.6188 - loss: 0.6423 - val_accuracy: 0.6368 - val_loss: 0.6183\n", + "Epoch 3/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 64ms/step - accuracy: 0.7102 - loss: 0.5539 - val_accuracy: 0.6463 - val_loss: 0.6441\n", + "Epoch 4/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 65ms/step - accuracy: 0.7746 - loss: 0.4737 - val_accuracy: 0.7338 - val_loss: 0.5681\n", + "Epoch 5/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 65ms/step - accuracy: 0.8127 - loss: 0.4065 - val_accuracy: 0.6766 - val_loss: 0.6422\n", + "Epoch 6/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 67ms/step - accuracy: 0.8613 - loss: 0.3246 - val_accuracy: 0.7152 - val_loss: 0.6385\n", + "Epoch 7/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 66ms/step - accuracy: 0.8923 - loss: 0.2667 - val_accuracy: 0.7202 - val_loss: 0.6684\n", + "Epoch 8/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 67ms/step - accuracy: 0.9032 - loss: 0.2335 - val_accuracy: 0.7296 - val_loss: 0.6990\n", + "Epoch 9/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 70ms/step - accuracy: 0.9118 - loss: 0.2143 - val_accuracy: 0.6944 - val_loss: 0.7852\n", + "Epoch 10/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 70ms/step - accuracy: 0.9205 - loss: 0.2022 - val_accuracy: 0.7359 - val_loss: 0.7074\n", + "Epoch 11/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 69ms/step - accuracy: 0.9418 - loss: 0.1523 - val_accuracy: 0.7127 - val_loss: 0.8376\n", + "Epoch 12/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 68ms/step - accuracy: 0.9440 - loss: 0.1462 - val_accuracy: 0.7288 - val_loss: 0.8534\n", + "Epoch 13/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 69ms/step - accuracy: 0.9344 - loss: 0.1649 - val_accuracy: 0.7157 - val_loss: 0.8279\n", + "Epoch 14/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 70ms/step - accuracy: 0.9201 - loss: 0.1998 - val_accuracy: 0.6386 - val_loss: 1.1343\n", + "Epoch 15/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 68ms/step - accuracy: 0.9301 - loss: 0.1774 - val_accuracy: 0.7041 - val_loss: 0.9636\n", + "Epoch 16/16\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 69ms/step - accuracy: 0.9616 - loss: 0.1055 - val_accuracy: 0.6747 - val_loss: 1.1050\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from keras.api.callbacks import ModelCheckpoint\n", + "\n", + "rnn_model.compile(\n", + " loss=\"binary_crossentropy\",\n", + " optimizer=\"adam\",\n", + " metrics=[\"accuracy\"],\n", + ")\n", + "\n", + "rnn_model.fit(\n", + " X_train,\n", + " y_train,\n", + " batch_size=128,\n", + " epochs=16,\n", + " validation_data=(X_valid, y_valid),\n", + " callbacks=[ModelCheckpoint(filepath=output_dir + \"/rnn_weights.{epoch:02d}.keras\")],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "94987771", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 10ms/step - accuracy: 0.7307 - loss: 0.7206\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.7074107527732849, 0.7359200119972229]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rnn_model.load_weights(output_dir + \"/rnn_weights.10.keras\")\n", + "rnn_model.evaluate(X_valid, y_valid)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8965a612", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 10ms/step\n" + ] + }, + { + "data": { + "image/png": "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/epX1g033GDdcccd9dOswUKd59LSUqt3797Wrbfear377rvWoUOHrM2bN1v5+fn13LlZQp3n5cuXW06n01q+fLl16NAha+PGjVb79u2ttLS0eu7cLG+++ab18MMPW6+99polyVqzZs2P1h88eNBq3ry5lZ6ebu3bt8967rnnrIiICGvDhg111iMB5geuu+46KzU11X5fWVlpxcTEWBkZGeesv/vuu62kpKSgdX369LH+/d//vU77NF2o8/xDFRUVVqtWraxly5bVVYuNRk3muqKiwvrtb39rLVmyxEpJSSHAXIBQ53nRokXWZZddZpWVldVXi41CqPOcmppq3XTTTUHr0tPTrX79+tVpn43JhQSYCRMmWFdddVXQunvuucdKTEyss774CukMZWVlysvLU0JCgr0uPDxcCQkJys3NPec2ubm5QfWSlJiYeN561Gyef+jbb79VeXm52rRpU1dtNgo1neuZM2cqOjpaw4cPr482jVeTeX7jjTfk8/mUmpoqj8ejq6++Wk888YQqKyvrq23j1GSef/vb3yovL8/+mungwYN68803deutt9ZLz78UDfFZeNE+ibchfP3116qsrDzrab8ej0cHDhw45zZ+v/+c9X6/v876NF1N5vmHJk6cqJiYmLP+wiBYTeb63Xff1UsvvaT8/Px66LBxqMk8Hzx4UJs2bdKQIUP05ptv6rPPPtOf/vQnlZeXa9q0afXRtnFqMs/33Xefvv76a11//fWyLEsVFRUaPXq0/uu//qs+Wv7FON9nYSAQ0KlTp9SsWbNa/5mcgYFxZs2apZUrV2rNmjVq2rRpQ7fTqBw/flxDhw7Viy++qEsuuaSh22nUqqqqFB0drRdeeEG9evXSPffco4cffliLFy9u6NYalc2bN+uJJ57QwoUL9cEHH+i1115TVlaWHn300YZuDT8TZ2DOcMkllygiIkJFRUVB64uKiuT1es+5jdfrDakeNZvnak8//bRmzZqlt99+W9dcc01dttkohDrXf/vb3/T555/r9ttvt9dVVVVJkiIjI1VQUKDLL7+8bps2UE3+TLdv315NmjRRRESEva5bt27y+/0qKyuTw+Go055NVJN5fuSRRzR06FCNGDFCktS9e3edPHlSo0aN0sMPP6zwcP4/vjac77PQ5XLVydkXiTMwQRwOh3r16qWcnBx7XVVVlXJycuTz+c65jc/nC6qXpOzs7PPWo2bzLEmzZ8/Wo48+qg0bNqh379710arxQp3rrl27avfu3crPz7eXf/u3f1P//v2Vn5+v2NjY+mzfGDX5M92vXz999tlndkCUpE8++UTt27cnvJxHTeb522+/PSukVIdGi18FWGsa5LOwzi4PNtTKlSstp9NpZWZmWvv27bNGjRplRUVFWX6/37Isyxo6dKg1adIku/69996zIiMjraefftrav3+/NW3aNG6jvgChzvOsWbMsh8Nh/c///I/15Zdf2svx48cb6hCMEepc/xB3IV2YUOe5sLDQatWqlTV27FiroKDAWrdunRUdHW099thjDXUIRgh1nqdNm2a1atXK+utf/2odPHjQeuutt6zLL7/cuvvuuxvqEIxw/Phx68MPP7Q+/PBDS5I1Z84c68MPP7S++OILy7Isa9KkSdbQoUPt+urbqMePH2/t37/fWrBgAbdRN4TnnnvO6tixo+VwOKzrrrvO2r59uz32u9/9zkpJSQmqX7VqlXXllVdaDofDuuqqq6ysrKx67thMocxzp06dLElnLdOmTav/xg0U6p/pMxFgLlyo87xt2zarT58+ltPptC677DLr8ccftyoqKuq5a/OEMs/l5eXW9OnTrcsvv9xq2rSpFRsba/3pT3+yvvnmm/pv3CDvvPPOOf/NrZ7blJQU63e/+91Z2/To0cNyOBzWZZddZi1durROewyzLM6hAQAAs3ANDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADG+T9Q4gVg0ztxkAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.hist(rnn_model.predict(X_valid))\n", + "_ = plt.axvline(x=0.5, color=\"orange\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv (3.12.10)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lec4-5-nlp-lstm.ipynb b/lec4-5-nlp-lstm.ipynb new file mode 100644 index 0000000..ad95b6b --- /dev/null +++ b/lec4-5-nlp-lstm.ipynb @@ -0,0 +1,299 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "507915ea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.9.2\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "os.environ[\"KERAS_BACKEND\"] = \"jax\"\n", + "import keras\n", + "\n", + "print(keras.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e0043e5c", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.datasets import imdb\n", + "import os\n", + "\n", + "unique_words = 10000\n", + "max_length = 100\n", + "\n", + "output_dir = \"tmp\"\n", + "if not os.path.exists(output_dir):\n", + " os.makedirs(output_dir)\n", + "\n", + "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "131e125a", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.preprocessing.sequence import pad_sequences\n", + "\n", + "X_train = pad_sequences(X_train, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)\n", + "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1e3fb0ec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Model: \"sequential\"\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+       "│ embedding (Embedding)           │ (None, 100, 64)        │       640,000 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ spatial_dropout1d               │ (None, 100, 64)        │             0 │\n",
+       "│ (SpatialDropout1D)              │                        │               │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ lstm (LSTM)                     │ (None, 256)            │       328,704 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dense (Dense)                   │ (None, 1)              │           257 │\n",
+       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", + "│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m640,000\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ spatial_dropout1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "│ (\u001b[38;5;33mSpatialDropout1D\u001b[0m) │ │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ lstm (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m328,704\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m257\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 968,961 (3.70 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m968,961\u001b[0m (3.70 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 968,961 (3.70 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m968,961\u001b[0m (3.70 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from keras.api.models import Sequential\n", + "from keras.api.layers import InputLayer, Embedding, SpatialDropout1D, LSTM, Dense\n", + "\n", + "lstm_model = Sequential()\n", + "lstm_model.add(InputLayer(shape=(max_length,), dtype=\"float32\"))\n", + "lstm_model.add(Embedding(unique_words, 64))\n", + "lstm_model.add(SpatialDropout1D(0.2))\n", + "lstm_model.add(LSTM(256, dropout=0.2))\n", + "lstm_model.add(Dense(1, activation=\"sigmoid\"))\n", + "\n", + "lstm_model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "11236198", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m42s\u001b[0m 214ms/step - accuracy: 0.6435 - loss: 0.6105 - val_accuracy: 0.8497 - val_loss: 0.3466\n", + "Epoch 2/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m46s\u001b[0m 231ms/step - accuracy: 0.8819 - loss: 0.2947 - val_accuracy: 0.8527 - val_loss: 0.3380\n", + "Epoch 3/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m53s\u001b[0m 273ms/step - accuracy: 0.9121 - loss: 0.2282 - val_accuracy: 0.8472 - val_loss: 0.3587\n", + "Epoch 4/4\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m64s\u001b[0m 325ms/step - accuracy: 0.9299 - loss: 0.1847 - val_accuracy: 0.8332 - val_loss: 0.3998\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from keras.api.callbacks import ModelCheckpoint\n", + "\n", + "lstm_model.compile(\n", + " loss=\"binary_crossentropy\",\n", + " optimizer=\"adam\",\n", + " metrics=[\"accuracy\"],\n", + ")\n", + "\n", + "lstm_model.fit(\n", + " X_train,\n", + " y_train,\n", + " batch_size=128,\n", + " epochs=4,\n", + " validation_data=(X_valid, y_valid),\n", + " callbacks=[ModelCheckpoint(filepath=output_dir + \"/lstm_weights.{epoch:02d}.keras\")],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "94987771", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 50ms/step - accuracy: 0.8509 - loss: 0.3421\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.33803924918174744, 0.8527200222015381]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lstm_model.load_weights(output_dir + \"/lstm_weights.02.keras\")\n", + "lstm_model.evaluate(X_valid, y_valid)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8965a612", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m36s\u001b[0m 47ms/step\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGdCAYAAAAMm0nCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAArk0lEQVR4nO3df3RU9Z3/8Vd+MEP4MRNBMyFLkChViKKWUGHqjy6aZYrR1RKqVIqpgix0cJfkLGBWCoquUPwBqGBWUUJPYRF61FWiiTEIHGX4YTQtglAtsaGLM+hqMkAhP8j9/uE3V0ZAmZBk+MTn45x7zuR+3vfO+34IzIube2/iLMuyBAAAYJD4WDcAAAAQLQIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4ibFuoL00Nzdr//796tmzp+Li4mLdDgAAOA2WZengwYNKS0tTfPypz7N02gCzf/9+paenx7oNAADQCvv27VPfvn1POd5pA0zPnj0lfTUBLpcrxt0AaDNNh6UX0756PXq/lNg9tv0AaFPhcFjp6en25/ipdNoA0/JjI5fLRYABOpOmBKnb/3/tchFggE7quy7/4CJeAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMkxroBE/W/tyTWLUTtk/k5sW4BAIA2wxkYAABgnKgCTP/+/RUXF3fC4vf7JUlHjx6V3+9X79691aNHD+Xm5ioUCkXso6amRjk5OerWrZtSUlI0ffp0NTU1RdRs2LBBQ4YMkdPp1IABA1RcXHxmRwkAADqVqALM9u3b9emnn9pLeXm5JOnnP/+5JCk/P1+vvvqq1q5dq40bN2r//v0aPXq0vf2xY8eUk5OjhoYGbd68WStWrFBxcbFmz55t11RXVysnJ0cjRoxQVVWVpk2bpokTJ6qsrKwtjhcAAHQCcZZlWa3deNq0aVq3bp0++ugjhcNhnXfeeVq1apXGjBkjSdq9e7cGDRqkQCCg4cOH6/XXX9eNN96o/fv3y+PxSJKKioo0c+ZMffbZZ3I4HJo5c6ZKSkr0wQcf2O8zduxY1dbWqrS09LR7C4fDcrvdqqurk8vlau0hnhTXwAAx1HRYWtPjq9e3HpISu8e2HwBt6nQ/v1t9DUxDQ4N+//vf66677lJcXJwqKyvV2Nio7Oxsu2bgwIHq16+fAoGAJCkQCGjw4MF2eJEkn8+ncDisnTt32jXH76OlpmUfp1JfX69wOByxAACAzqnVAebll19WbW2tfvWrX0mSgsGgHA6HkpOTI+o8Ho+CwaBdc3x4aRlvGfu2mnA4rCNHjpyyn3nz5sntdttLenp6aw8NAACc5VodYJ577jmNGjVKaWlpbdlPqxUWFqqurs5e9u3bF+uWAABAO2nVc2D++te/6s0339SLL75or0tNTVVDQ4Nqa2sjzsKEQiGlpqbaNdu2bYvYV8tdSsfXfPPOpVAoJJfLpaSkpFP25HQ65XQ6W3M4AADAMK06A7N8+XKlpKQoJ+frC0OzsrLUpUsXVVRU2Ov27Nmjmpoaeb1eSZLX69WOHTt04MABu6a8vFwul0uZmZl2zfH7aKlp2QcAAEDUAaa5uVnLly9XXl6eEhO/PoHjdrs1YcIEFRQU6K233lJlZaXuvPNOeb1eDR8+XJI0cuRIZWZmavz48frjH/+osrIyzZo1S36/3z57MnnyZO3du1czZszQ7t27tXTpUq1Zs0b5+fltdMgAAMB0Uf8I6c0331RNTY3uuuuuE8YWLlyo+Ph45ebmqr6+Xj6fT0uXLrXHExIStG7dOk2ZMkVer1fdu3dXXl6e5s6da9dkZGSopKRE+fn5Wrx4sfr27atly5bJ5/O18hABAEBnc0bPgTmb8RyYSDwHBp0Gz4EBOrXT/fzmlzkCABBj/Mc4evwyRwAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMAAAwDgEGAAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGiTrA/O///q9++ctfqnfv3kpKStLgwYP17rvv2uOWZWn27Nnq06ePkpKSlJ2drY8++ihiH1988YXGjRsnl8ul5ORkTZgwQYcOHYqo+dOf/qRrrrlGXbt2VXp6uhYsWNDKQwQAAJ1NVAHmyy+/1FVXXaUuXbro9ddf165du/TYY4/pnHPOsWsWLFigJ554QkVFRdq6dau6d+8un8+no0eP2jXjxo3Tzp07VV5ernXr1mnTpk2aNGmSPR4OhzVy5Eidf/75qqys1COPPKL7779fzzzzTBscMgAAMF1iNMW//e1vlZ6eruXLl9vrMjIy7NeWZWnRokWaNWuWbr75ZknS7373O3k8Hr388ssaO3asPvzwQ5WWlmr79u0aOnSoJOnJJ5/UDTfcoEcffVRpaWlauXKlGhoa9Pzzz8vhcOiSSy5RVVWVHn/88YigAwAAvp+iOgPzyiuvaOjQofr5z3+ulJQU/fCHP9Szzz5rj1dXVysYDCo7O9te53a7NWzYMAUCAUlSIBBQcnKyHV4kKTs7W/Hx8dq6datdc+2118rhcNg1Pp9Pe/bs0ZdffnnS3urr6xUOhyMWAADQOUUVYPbu3aunn35aP/jBD1RWVqYpU6boX//1X7VixQpJUjAYlCR5PJ6I7Twejz0WDAaVkpISMZ6YmKhevXpF1JxsH8e/xzfNmzdPbrfbXtLT06M5NAAAYJCoAkxzc7OGDBmihx9+WD/84Q81adIk3X333SoqKmqv/k5bYWGh6urq7GXfvn2xbgkAALSTqAJMnz59lJmZGbFu0KBBqqmpkSSlpqZKkkKhUERNKBSyx1JTU3XgwIGI8aamJn3xxRcRNSfbx/Hv8U1Op1MulytiAQAAnVNUAeaqq67Snj17Itb9+c9/1vnnny/pqwt6U1NTVVFRYY+Hw2Ft3bpVXq9XkuT1elVbW6vKykq7Zv369WpubtawYcPsmk2bNqmxsdGuKS8v18UXXxxxxxMAAPh+iirA5Ofna8uWLXr44Yf18ccfa9WqVXrmmWfk9/slSXFxcZo2bZoeeughvfLKK9qxY4fuuOMOpaWl6ZZbbpH01Rmbn/70p7r77ru1bds2vfPOO5o6darGjh2rtLQ0SdLtt98uh8OhCRMmaOfOnXrhhRe0ePFiFRQUtO3RAwAAI0V1G/WPfvQjvfTSSyosLNTcuXOVkZGhRYsWady4cXbNjBkzdPjwYU2aNEm1tbW6+uqrVVpaqq5du9o1K1eu1NSpU3X99dcrPj5eubm5euKJJ+xxt9utN954Q36/X1lZWTr33HM1e/ZsbqEGAACSpDjLsqxYN9EewuGw3G636urq2vx6mP73lrTp/jrCJ/NzYt0C0DaaDktrenz1+tZDUmL32PYDtAE+V752up/f/C4kAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMAAAwDgEGAAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHGiCjD333+/4uLiIpaBAwfa40ePHpXf71fv3r3Vo0cP5ebmKhQKReyjpqZGOTk56tatm1JSUjR9+nQ1NTVF1GzYsEFDhgyR0+nUgAEDVFxc3PojBAAAnU7UZ2AuueQSffrpp/by9ttv22P5+fl69dVXtXbtWm3cuFH79+/X6NGj7fFjx44pJydHDQ0N2rx5s1asWKHi4mLNnj3brqmurlZOTo5GjBihqqoqTZs2TRMnTlRZWdkZHioAAOgsEqPeIDFRqampJ6yvq6vTc889p1WrVum6666TJC1fvlyDBg3Sli1bNHz4cL3xxhvatWuX3nzzTXk8Hl1xxRV68MEHNXPmTN1///1yOBwqKipSRkaGHnvsMUnSoEGD9Pbbb2vhwoXy+XxneLgAAKAziPoMzEcffaS0tDRdcMEFGjdunGpqaiRJlZWVamxsVHZ2tl07cOBA9evXT4FAQJIUCAQ0ePBgeTweu8bn8ykcDmvnzp12zfH7aKlp2cep1NfXKxwORywAAKBziirADBs2TMXFxSotLdXTTz+t6upqXXPNNTp48KCCwaAcDoeSk5MjtvF4PAoGg5KkYDAYEV5axlvGvq0mHA7ryJEjp+xt3rx5crvd9pKenh7NoQEAAINE9SOkUaNG2a8vu+wyDRs2TOeff77WrFmjpKSkNm8uGoWFhSooKLC/DofDhBgAADqpM7qNOjk5WRdddJE+/vhjpaamqqGhQbW1tRE1oVDIvmYmNTX1hLuSWr7+rhqXy/WtIcnpdMrlckUsAACgczqjAHPo0CH95S9/UZ8+fZSVlaUuXbqooqLCHt+zZ49qamrk9XolSV6vVzt27NCBAwfsmvLycrlcLmVmZto1x++jpaZlHwAAAFEFmH//93/Xxo0b9cknn2jz5s362c9+poSEBP3iF7+Q2+3WhAkTVFBQoLfeekuVlZW688475fV6NXz4cEnSyJEjlZmZqfHjx+uPf/yjysrKNGvWLPn9fjmdTknS5MmTtXfvXs2YMUO7d+/W0qVLtWbNGuXn57f90QMAACNFdQ3M3/72N/3iF7/Q//3f/+m8887T1VdfrS1btui8886TJC1cuFDx8fHKzc1VfX29fD6fli5dam+fkJCgdevWacqUKfJ6verevbvy8vI0d+5cuyYjI0MlJSXKz8/X4sWL1bdvXy1btoxbqAEAgC3Osiwr1k20h3A4LLfbrbq6uja/Hqb/vSVtur+O8Mn8nFi3ALSNpsPSmh5fvb71kJTYPbb9AG2Az5Wvne7nN78LCQAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMAAAwDgEGAAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4ZxRg5s+fr7i4OE2bNs1ed/ToUfn9fvXu3Vs9evRQbm6uQqFQxHY1NTXKyclRt27dlJKSounTp6upqSmiZsOGDRoyZIicTqcGDBig4uLiM2kVAAB0Iq0OMNu3b9d//dd/6bLLLotYn5+fr1dffVVr167Vxo0btX//fo0ePdoeP3bsmHJyctTQ0KDNmzdrxYoVKi4u1uzZs+2a6upq5eTkaMSIEaqqqtK0adM0ceJElZWVtbZdAADQibQqwBw6dEjjxo3Ts88+q3POOcdeX1dXp+eee06PP/64rrvuOmVlZWn58uXavHmztmzZIkl64403tGvXLv3+97/XFVdcoVGjRunBBx/UkiVL1NDQIEkqKipSRkaGHnvsMQ0aNEhTp07VmDFjtHDhwjY4ZAAAYLpWBRi/36+cnBxlZ2dHrK+srFRjY2PE+oEDB6pfv34KBAKSpEAgoMGDB8vj8dg1Pp9P4XBYO3futGu+uW+fz2fv42Tq6+sVDocjFgAA0DklRrvB6tWr9d5772n79u0njAWDQTkcDiUnJ0es93g8CgaDds3x4aVlvGXs22rC4bCOHDmipKSkE9573rx5euCBB6I9HAAAYKCozsDs27dP//Zv/6aVK1eqa9eu7dVTqxQWFqqurs5e9u3bF+uWAABAO4kqwFRWVurAgQMaMmSIEhMTlZiYqI0bN+qJJ55QYmKiPB6PGhoaVFtbG7FdKBRSamqqJCk1NfWEu5Javv6uGpfLddKzL5LkdDrlcrkiFgAA0DlFFWCuv/567dixQ1VVVfYydOhQjRs3zn7dpUsXVVRU2Nvs2bNHNTU18nq9kiSv16sdO3bowIEDdk15eblcLpcyMzPtmuP30VLTsg8AAPD9FtU1MD179tSll14asa579+7q3bu3vX7ChAkqKChQr1695HK5dM8998jr9Wr48OGSpJEjRyozM1Pjx4/XggULFAwGNWvWLPn9fjmdTknS5MmT9dRTT2nGjBm66667tH79eq1Zs0YlJSVtccwAAMBwUV/E+10WLlyo+Ph45ebmqr6+Xj6fT0uXLrXHExIStG7dOk2ZMkVer1fdu3dXXl6e5s6da9dkZGSopKRE+fn5Wrx4sfr27atly5bJ5/O1dbsAAMBAcZZlWbFuoj2Ew2G53W7V1dW1+fUw/e8170zQJ/NzYt0C0DaaDktrenz1+tZDUmL32PYDtAE+V752up/f/C4kAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMAAAwDgEGAAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHGiCjBPP/20LrvsMrlcLrlcLnm9Xr3++uv2+NGjR+X3+9W7d2/16NFDubm5CoVCEfuoqalRTk6OunXrppSUFE2fPl1NTU0RNRs2bNCQIUPkdDo1YMAAFRcXt/4IAQBApxNVgOnbt6/mz5+vyspKvfvuu7ruuut08803a+fOnZKk/Px8vfrqq1q7dq02btyo/fv3a/To0fb2x44dU05OjhoaGrR582atWLFCxcXFmj17tl1TXV2tnJwcjRgxQlVVVZo2bZomTpyosrKyNjpkAABgujjLsqwz2UGvXr30yCOPaMyYMTrvvPO0atUqjRkzRpK0e/duDRo0SIFAQMOHD9frr7+uG2+8Ufv375fH45EkFRUVaebMmfrss8/kcDg0c+ZMlZSU6IMPPrDfY+zYsaqtrVVpaelp9xUOh+V2u1VXVyeXy3Umh3iC/veWtOn+OsIn83Ni3QLQNpoOS2t6fPX61kNSYvfY9gO0AT5Xvna6n9+tvgbm2LFjWr16tQ4fPiyv16vKyko1NjYqOzvbrhk4cKD69eunQCAgSQoEAho8eLAdXiTJ5/MpHA7bZ3ECgUDEPlpqWvZxKvX19QqHwxELAADonKIOMDt27FCPHj3kdDo1efJkvfTSS8rMzFQwGJTD4VBycnJEvcfjUTAYlCQFg8GI8NIy3jL2bTXhcFhHjhw5ZV/z5s2T2+22l/T09GgPDQAAGCLqAHPxxRerqqpKW7du1ZQpU5SXl6ddu3a1R29RKSwsVF1dnb3s27cv1i0BAIB2khjtBg6HQwMGDJAkZWVlafv27Vq8eLFuu+02NTQ0qLa2NuIsTCgUUmpqqiQpNTVV27Zti9hfy11Kx9d8886lUCgkl8ulpKSkU/bldDrldDqjPRwAAGCgM34OTHNzs+rr65WVlaUuXbqooqLCHtuzZ49qamrk9XolSV6vVzt27NCBAwfsmvLycrlcLmVmZto1x++jpaZlHwAAAFGdgSksLNSoUaPUr18/HTx4UKtWrdKGDRtUVlYmt9utCRMmqKCgQL169ZLL5dI999wjr9er4cOHS5JGjhypzMxMjR8/XgsWLFAwGNSsWbPk9/vtsyeTJ0/WU089pRkzZuiuu+7S+vXrtWbNGpWUmHeFNgAAaB9RBZgDBw7ojjvu0Keffiq3263LLrtMZWVl+qd/+idJ0sKFCxUfH6/c3FzV19fL5/Np6dKl9vYJCQlat26dpkyZIq/Xq+7duysvL09z5861azIyMlRSUqL8/HwtXrxYffv21bJly+Tz+drokAEAgOnO+DkwZyueAxOJ58Cg0+A5MOiE+Fz5Wrs/BwYAACBWCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMAAAwDgEGAAAYJyofpkjAABnOxN/rxCixxkYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMAAAwDgEGAAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwTlQBZt68efrRj36knj17KiUlRbfccov27NkTUXP06FH5/X717t1bPXr0UG5urkKhUERNTU2NcnJy1K1bN6WkpGj69OlqamqKqNmwYYOGDBkip9OpAQMGqLi4uHVHCAAAOp2oAszGjRvl9/u1ZcsWlZeXq7GxUSNHjtThw4ftmvz8fL366qtau3atNm7cqP3792v06NH2+LFjx5STk6OGhgZt3rxZK1asUHFxsWbPnm3XVFdXKycnRyNGjFBVVZWmTZumiRMnqqysrA0OGQAAmC7OsiyrtRt/9tlnSklJ0caNG3Xttdeqrq5O5513nlatWqUxY8ZIknbv3q1BgwYpEAho+PDhev3113XjjTdq//798ng8kqSioiLNnDlTn332mRwOh2bOnKmSkhJ98MEH9nuNHTtWtbW1Ki0tPa3ewuGw3G636urq5HK5WnuIJ9X/3pI23V9H+GR+TqxbANpG02FpTY+vXt96SErsHtt+cNYx8d9oE7XX58rpfn6f0TUwdXV1kqRevXpJkiorK9XY2Kjs7Gy7ZuDAgerXr58CgYAkKRAIaPDgwXZ4kSSfz6dwOKydO3faNcfvo6WmZR8nU19fr3A4HLEAAIDOqdUBprm5WdOmTdNVV12lSy+9VJIUDAblcDiUnJwcUevxeBQMBu2a48NLy3jL2LfVhMNhHTly5KT9zJs3T263217S09Nbe2gAAOAs1+oA4/f79cEHH2j16tVt2U+rFRYWqq6uzl727dsX65YAAEA7SWzNRlOnTtW6deu0adMm9e3b116fmpqqhoYG1dbWRpyFCYVCSk1NtWu2bdsWsb+Wu5SOr/nmnUuhUEgul0tJSUkn7cnpdMrpdLbmcAAAgGGiOgNjWZamTp2ql156SevXr1dGRkbEeFZWlrp06aKKigp73Z49e1RTUyOv1ytJ8nq92rFjhw4cOGDXlJeXy+VyKTMz0645fh8tNS37AAAA329RnYHx+/1atWqV/ud//kc9e/a0r1lxu91KSkqS2+3WhAkTVFBQoF69esnlcumee+6R1+vV8OHDJUkjR45UZmamxo8frwULFigYDGrWrFny+/32GZTJkyfrqaee0owZM3TXXXdp/fr1WrNmjUpKuLIcAABEeQbm6aefVl1dnf7xH/9Rffr0sZcXXnjBrlm4cKFuvPFG5ebm6tprr1VqaqpefPFFezwhIUHr1q1TQkKCvF6vfvnLX+qOO+7Q3Llz7ZqMjAyVlJSovLxcl19+uR577DEtW7ZMPp+vDQ4ZAACY7oyeA3M24zkwnQPPr8EJeA4MvgP/RncMo58DAwAAEAsEGAAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIyTGOsGAABnr/73lsS6BeCkOAMDAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMbhVwngrGbiY8w/mZ8T6xYAoNPjDAwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHGiDjCbNm3STTfdpLS0NMXFxenll1+OGLcsS7Nnz1afPn2UlJSk7OxsffTRRxE1X3zxhcaNGyeXy6Xk5GRNmDBBhw4diqj505/+pGuuuUZdu3ZVenq6FixYEP3RAQCATinqAHP48GFdfvnlWrJkyUnHFyxYoCeeeEJFRUXaunWrunfvLp/Pp6NHj9o148aN086dO1VeXq5169Zp06ZNmjRpkj0eDoc1cuRInX/++aqsrNQjjzyi+++/X88880wrDhEAAHQ2UT/IbtSoURo1atRJxyzL0qJFizRr1izdfPPNkqTf/e538ng8evnllzV27Fh9+OGHKi0t1fbt2zV06FBJ0pNPPqkbbrhBjz76qNLS0rRy5Uo1NDTo+eefl8Ph0CWXXKKqqio9/vjjEUEHAAB8P7Xpk3irq6sVDAaVnZ1tr3O73Ro2bJgCgYDGjh2rQCCg5ORkO7xIUnZ2tuLj47V161b97Gc/UyAQ0LXXXiuHw2HX+Hw+/fa3v9WXX36pc84554T3rq+vV319vf11OBxuy0MDThtPD8apmPi9AZyt2vQi3mAwKEnyeDwR6z0ejz0WDAaVkpISMZ6YmKhevXpF1JxsH8e/xzfNmzdPbrfbXtLT08/8gAAAwFmp09yFVFhYqLq6OnvZt29frFsCAADtpE0DTGpqqiQpFApFrA+FQvZYamqqDhw4EDHe1NSkL774IqLmZPs4/j2+yel0yuVyRSwAAKBzatMAk5GRodTUVFVUVNjrwuGwtm7dKq/XK0nyer2qra1VZWWlXbN+/Xo1Nzdr2LBhds2mTZvU2Nho15SXl+viiy8+6fUvAADg+yXqi3gPHTqkjz/+2P66urpaVVVV6tWrl/r166dp06bpoYce0g9+8ANlZGToN7/5jdLS0nTLLbdIkgYNGqSf/vSnuvvuu1VUVKTGxkZNnTpVY8eOVVpamiTp9ttv1wMPPKAJEyZo5syZ+uCDD7R48WItXLiwbY4aQASTLi5NijuqDwfHugsAsRZ1gHn33Xc1YsQI++uCggJJUl5enoqLizVjxgwdPnxYkyZNUm1tra6++mqVlpaqa9eu9jYrV67U1KlTdf311ys+Pl65ubl64okn7HG326033nhDfr9fWVlZOvfcczV79mxuoQYQYdBvSnXE6vrdhQA6nTjLsqxYN9EewuGw3G636urq2vx6GJP+twp0Nl+dgRkjSRq04w8EGCBG2uvxC6f7+d1p7kICAADfHwQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMAAAwDgEGAAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMY5qwPMkiVL1L9/f3Xt2lXDhg3Ttm3bYt0SAAA4C5y1AeaFF15QQUGB5syZo/fee0+XX365fD6fDhw4EOvWAABAjJ21Aebxxx/X3XffrTvvvFOZmZkqKipSt27d9Pzzz8e6NQAAEGOJsW7gZBoaGlRZWanCwkJ7XXx8vLKzsxUIBE66TX19verr6+2v6+rqJEnhcLjN+2uu/3ub7xPA6TkWd1Th//9X8Fj939VsNce2IeB7qj0+X4/fr2VZ31p3VgaYzz//XMeOHZPH44lY7/F4tHv37pNuM2/ePD3wwAMnrE9PT2+XHgHEjtt+dUcMuwC+39yL2nf/Bw8elNvtPuX4WRlgWqOwsFAFBQX2183Nzfriiy/Uu3dvxcXFtdn7hMNhpaena9++fXK5XG22X5yIue4YzHPHYJ47BvPccdprri3L0sGDB5WWlvatdWdlgDn33HOVkJCgUCgUsT4UCik1NfWk2zidTjmdzoh1ycnJ7dWiXC4Xfzk6CHPdMZjnjsE8dwzmueO0x1x/25mXFmflRbwOh0NZWVmqqKiw1zU3N6uiokJerzeGnQEAgLPBWXkGRpIKCgqUl5enoUOH6sorr9SiRYt0+PBh3XnnnbFuDQAAxNhZG2Buu+02ffbZZ5o9e7aCwaCuuOIKlZaWnnBhb0dzOp2aM2fOCT+uQttjrjsG89wxmOeOwTx3nFjPdZz1XfcpAQAAnGXOymtgAAAAvg0BBgAAGIcAAwAAjEOAAQAAxiHAnMSSJUvUv39/de3aVcOGDdO2bdu+tX7t2rUaOHCgunbtqsGDB+u1117roE7NF81cP/vss7rmmmt0zjnn6JxzzlF2dvZ3/tngK9F+T7dYvXq14uLidMstt7Rvg51EtPNcW1srv9+vPn36yOl06qKLLuLfj9MQ7TwvWrRIF198sZKSkpSenq78/HwdPXq0g7o106ZNm3TTTTcpLS1NcXFxevnll79zmw0bNmjIkCFyOp0aMGCAiouL27dJCxFWr15tORwO6/nnn7d27txp3X333VZycrIVCoVOWv/OO+9YCQkJ1oIFC6xdu3ZZs2bNsrp06WLt2LGjgzs3T7Rzffvtt1tLliyx3n//fevDDz+0fvWrX1lut9v629/+1sGdmyXaeW5RXV1t/cM//IN1zTXXWDfffHPHNGuwaOe5vr7eGjp0qHXDDTdYb7/9tlVdXW1t2LDBqqqq6uDOzRLtPK9cudJyOp3WypUrrerqaqusrMzq06ePlZ+f38Gdm+W1116z7rvvPuvFF1+0JFkvvfTSt9bv3bvX6tatm1VQUGDt2rXLevLJJ62EhASrtLS03XokwHzDlVdeafn9fvvrY8eOWWlpada8efNOWn/rrbdaOTk5EeuGDRtm/cu//Eu79tkZRDvX39TU1GT17NnTWrFiRXu12Cm0Zp6bmpqsH//4x9ayZcusvLw8AsxpiHaen376aeuCCy6wGhoaOqrFTiHaefb7/dZ1110Xsa6goMC66qqr2rXPzuR0AsyMGTOsSy65JGLdbbfdZvl8vnbrix8hHaehoUGVlZXKzs6218XHxys7O1uBQOCk2wQCgYh6SfL5fKesx1daM9ff9Pe//12NjY3q1atXe7VpvNbO89y5c5WSkqIJEyZ0RJvGa808v/LKK/J6vfL7/fJ4PLr00kv18MMP69ixYx3VtnFaM88//vGPVVlZaf+Yae/evXrttdd0ww03dEjP3xex+Cw8a5/EGwuff/65jh07dsLTfj0ej3bv3n3SbYLB4Enrg8Fgu/XZGbRmrr9p5syZSktLO+EvDb7Wmnl+++239dxzz6mqqqoDOuwcWjPPe/fu1fr16zVu3Di99tpr+vjjj/XrX/9ajY2NmjNnTke0bZzWzPPtt9+uzz//XFdffbUsy1JTU5MmT56s//iP/+iIlr83TvVZGA6HdeTIESUlJbX5e3IGBkaaP3++Vq9erZdeekldu3aNdTudxsGDBzV+/Hg9++yzOvfcc2PdTqfW3NyslJQUPfPMM8rKytJtt92m++67T0VFRbFurVPZsGGDHn74YS1dulTvvfeeXnzxRZWUlOjBBx+MdWs4Q5yBOc65556rhIQEhUKhiPWhUEipqakn3SY1NTWqenylNXPd4tFHH9X8+fP15ptv6rLLLmvPNo0X7Tz/5S9/0SeffKKbbrrJXtfc3CxJSkxM1J49e3ThhRe2b9MGas33c58+fdSlSxclJCTY6wYNGqRgMKiGhgY5HI527dlErZnn3/zmNxo/frwmTpwoSRo8eLAOHz6sSZMm6b777lN8PP+Pbwun+ix0uVztcvZF4gxMBIfDoaysLFVUVNjrmpubVVFRIa/Xe9JtvF5vRL0klZeXn7IeX2nNXEvSggUL9OCDD6q0tFRDhw7tiFaNFu08Dxw4UDt27FBVVZW9/PM//7NGjBihqqoqpaend2T7xmjN9/NVV12ljz/+2A6IkvTnP/9Zffr0IbycQmvm+e9///sJIaUlNFr8KsA2E5PPwna7PNhQq1evtpxOp1VcXGzt2rXLmjRpkpWcnGwFg0HLsixr/Pjx1r333mvXv/POO1ZiYqL16KOPWh9++KE1Z84cbqM+TdHO9fz58y2Hw2H94Q9/sD799FN7OXjwYKwOwQjRzvM3cRfS6Yl2nmtqaqyePXtaU6dOtfbs2WOtW7fOSklJsR566KFYHYIRop3nOXPmWD179rT++7//29q7d6/1xhtvWBdeeKF16623xuoQjHDw4EHr/ffft95//31LkvX4449b77//vvXXv/7VsizLuvfee63x48fb9S23UU+fPt368MMPrSVLlnAbdSw8+eSTVr9+/SyHw2FdeeWV1pYtW+yxn/zkJ1ZeXl5E/Zo1a6yLLrrIcjgc1iWXXGKVlJR0cMfmimauzz//fEvSCcucOXM6vnHDRPs9fTwCzOmLdp43b95sDRs2zHI6ndYFF1xg/ed//qfV1NTUwV2bJ5p5bmxstO6//37rwgsvtLp27Wqlp6dbv/71r60vv/yy4xs3yFtvvXXSf29b5jYvL8/6yU9+csI2V1xxheVwOKwLLrjAWr58ebv2GGdZnEMDAABm4RoYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIzz/wC4WLJ2OVzCxAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.hist(lstm_model.predict(X_valid))\n", + "_ = plt.axvline(x=0.5, color=\"orange\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv (3.12.10)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lec4-6-nlp-blstm.ipynb b/lec4-6-nlp-blstm.ipynb new file mode 100644 index 0000000..18fc6eb --- /dev/null +++ b/lec4-6-nlp-blstm.ipynb @@ -0,0 +1,303 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "507915ea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.9.2\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "os.environ[\"KERAS_BACKEND\"] = \"jax\"\n", + "import keras\n", + "\n", + "print(keras.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e0043e5c", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.datasets import imdb\n", + "import os\n", + "\n", + "unique_words = 10000\n", + "max_length = 100\n", + "\n", + "output_dir = \"tmp\"\n", + "if not os.path.exists(output_dir):\n", + " os.makedirs(output_dir)\n", + "\n", + "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "131e125a", + "metadata": {}, + "outputs": [], + "source": [ + "from keras.api.preprocessing.sequence import pad_sequences\n", + "\n", + "X_train = pad_sequences(X_train, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)\n", + "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1e3fb0ec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Model: \"sequential\"\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+       "│ embedding (Embedding)           │ (None, 100, 64)        │       640,000 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ spatial_dropout1d               │ (None, 100, 64)        │             0 │\n",
+       "│ (SpatialDropout1D)              │                        │               │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ bidirectional (Bidirectional)   │ (None, 512)            │       657,408 │\n",
+       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+       "│ dense (Dense)                   │ (None, 1)              │           513 │\n",
+       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", + "│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m640,000\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ spatial_dropout1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "│ (\u001b[38;5;33mSpatialDropout1D\u001b[0m) │ │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ bidirectional (\u001b[38;5;33mBidirectional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m657,408\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m513\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 1,297,921 (4.95 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m1,297,921\u001b[0m (4.95 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 1,297,921 (4.95 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,297,921\u001b[0m (4.95 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from keras.api.models import Sequential\n", + "from keras.api.layers import InputLayer, Embedding, SpatialDropout1D, LSTM, Bidirectional, Dense\n", + "\n", + "blstm_model = Sequential()\n", + "blstm_model.add(InputLayer(shape=(max_length,), dtype=\"float32\"))\n", + "blstm_model.add(Embedding(unique_words, 64))\n", + "blstm_model.add(SpatialDropout1D(0.2))\n", + "blstm_model.add(Bidirectional(LSTM(256, dropout=0.2)))\n", + "blstm_model.add(Dense(1, activation=\"sigmoid\"))\n", + "\n", + "blstm_model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "11236198", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/6\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m134s\u001b[0m 682ms/step - accuracy: 0.6565 - loss: 0.6039 - val_accuracy: 0.8432 - val_loss: 0.3756\n", + "Epoch 2/6\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m166s\u001b[0m 848ms/step - accuracy: 0.8841 - loss: 0.2820 - val_accuracy: 0.8425 - val_loss: 0.3577\n", + "Epoch 3/6\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m176s\u001b[0m 902ms/step - accuracy: 0.9148 - loss: 0.2238 - val_accuracy: 0.8459 - val_loss: 0.3929\n", + "Epoch 4/6\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m171s\u001b[0m 875ms/step - accuracy: 0.9375 - loss: 0.1744 - val_accuracy: 0.8434 - val_loss: 0.3572\n", + "Epoch 5/6\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m155s\u001b[0m 790ms/step - accuracy: 0.9466 - loss: 0.1520 - val_accuracy: 0.8385 - val_loss: 0.4029\n", + "Epoch 6/6\n", + "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m158s\u001b[0m 807ms/step - accuracy: 0.9584 - loss: 0.1172 - val_accuracy: 0.8337 - val_loss: 0.4419\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from keras.api.callbacks import ModelCheckpoint\n", + "\n", + "blstm_model.compile(\n", + " loss=\"binary_crossentropy\",\n", + " optimizer=\"adam\",\n", + " metrics=[\"accuracy\"],\n", + ")\n", + "\n", + "blstm_model.fit(\n", + " X_train,\n", + " y_train,\n", + " batch_size=128,\n", + " epochs=6,\n", + " validation_data=(X_valid, y_valid),\n", + " callbacks=[ModelCheckpoint(filepath=output_dir + \"/blstm_weights.{epoch:02d}.keras\")],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "94987771", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m86s\u001b[0m 110ms/step - accuracy: 0.8449 - loss: 0.3976\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.3929494023323059, 0.8458799719810486]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "blstm_model.load_weights(output_dir + \"/blstm_weights.03.keras\")\n", + "blstm_model.evaluate(X_valid, y_valid)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8965a612", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m85s\u001b[0m 108ms/step\n" + ] + }, + { + "data": { + "image/png": "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VmlpaZ3rN23aZIWEhFjZ2dnWnj17rIkTJ1otWrSwdu3a1cSTm8ffvR4yZIg1Z84ca+fOndbevXut3/72t1ZkZKT1r3/9q4knN4u/+3zG/v37rZ///OdWnz59rAEDBjTNsAbzd58rKiqsXr16Wf3797c++eQTa//+/db69eut4uLiJp7cLP7uc05OjuV0Oq2cnBxr//791po1a6y4uDhrzJgxTTy5WVavXm09++yz1gcffGBJslasWPGj6/ft22e1bNnSysjIsPbs2WPNnj3bCgkJsfLy8hptRgLmB2688UYrPT3d/nVNTY0VHx9vZWVl1bn+gQcesFJTU32OJSUlWY8//nijztkc+LvXP1RdXW1FRERYixcvbqwRm4X67HN1dbV18803W2+99ZY1bNgwAuYC+LvPc+fOta688kqrsrKyqUZsFvzd5/T0dOuOO+7wOZaRkWH17t27UedsTi4kYMaNG2d17drV59iDDz5opaSkNNpcfAvpLJWVlSoqKlJycrJ9LDg4WMnJySosLKzzPoWFhT7rJSklJeW863Faffb6h7777jtVVVWpTZs2jTWm8eq7z5MnT1Z0dLSGDx/eFGMarz77vHLlSrndbqWnpysmJkbXXnutpk6dqpqamqYa2zj12eebb75ZRUVF9reZ9u3bp9WrV6t///5NMvOlIhCvhRft38QbCN9++61qamrO+dt+Y2Ji9Pnnn9d5H4/HU+d6j8fTaHM2B/XZ6x965plnFB8ff86/NPiv+uzzJ598orffflvFxcVNMGHzUJ993rdvn9atW6e0tDStXr1aX331lZ566ilVVVVp0qRJTTG2ceqzz0OGDNG3336rW265RZZlqbq6Wk888YT+8Ic/NMXIl4zzvRZ6vV59//33Cg8Pb/DfkyswMNK0adO0dOlSrVixQmFhYYEep9k4fvy4hg4dqgULFqhdu3aBHqdZq62tVXR0tObPn6+ePXvqwQcf1LPPPqt58+YFerRmZf369Zo6darefPNN7dixQx988IFyc3M1ZcqUQI+G/xFXYM7Srl07hYSEqLS01Od4aWmpYmNj67xPbGysX+txWn32+ozp06dr2rRp+utf/6rrrruuMcc0nr/7/M9//lMHDhzQvffeax+rra2VJIWGhqqkpEQdO3Zs3KENVJ8/z3FxcWrRooVCQkLsY507d5bH41FlZaUcDkejzmyi+uzzc889p6FDh+qxxx6TJHXr1k0nT57UyJEj9eyzzyo4mP+Pbwjney10uVyNcvVF4gqMD4fDoZ49e6qgoMA+Vltbq4KCArnd7jrv43a7fdZLUn5+/nnX47T67LUkZWdna8qUKcrLy1OvXr2aYlSj+bvPnTp10q5du1RcXGzffvWrX+n2229XcXGxEhISmnJ8Y9Tnz3Pv3r311Vdf2YEoSV988YXi4uKIl/Oozz5/991350TKmWi0+FGADSYgr4WN9vZgQy1dutRyOp3WokWLrD179lgjR460oqKiLI/HY1mWZQ0dOtQaP368vX7Tpk1WaGioNX36dGvv3r3WpEmT+Bj1BfJ3r6dNm2Y5HA7rz3/+s/Wf//zHvh0/fjxQT8EI/u7zD/EppAvj7z4fPHjQioiIsEaNGmWVlJRYq1atsqKjo60XX3wxUE/BCP7u86RJk6yIiAjrvffes/bt22etXbvW6tixo/XAAw8E6ikY4fjx49bOnTutnTt3WpKsGTNmWDt37rS+/vpry7Isa/z48dbQoUPt9Wc+Rj127Fhr79691pw5c/gYdSDMnj3buuKKKyyHw2HdeOON1pYtW+xzt956qzVs2DCf9cuXL7euvvpqy+FwWF27drVyc3ObeGJz+bPX7du3tySdc5s0aVLTD24Yf/9Mn42AuXD+7vPmzZutpKQky+l0WldeeaX10ksvWdXV1U08tXn82eeqqirr+eeftzp27GiFhYVZCQkJ1lNPPWUdO3as6Qc3yN/+9rc6/3t7Zm+HDRtm3Xrrrefcp3v37pbD4bCuvPJK65133mnUGYMsi2toAADALLwHBgAAGIeAAQAAxiFgAACAcQgYAABgHAIGAAAYh4ABAADGIWAAAIBxCBgAAGAcAgYAABiHgAEAAMYhYAAAgHEIGAAAYJz/A/Aol/9oKMUaAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.hist(blstm_model.predict(X_valid))\n", + "_ = plt.axvline(x=0.5, color=\"orange\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv (3.12.10)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}