python_for_analytics

Форк
0
/
2.1_LEC_numpy_and_Word2vec.ipynb 
921 строка · 65.9 Кб
1
{
2
 "cells": [
3
  {
4
   "cell_type": "markdown",
5
   "metadata": {},
6
   "source": [
7
    "# Немного про скорость\n",
8
    "- numpy\n",
9
    "- python\n",
10
    "- pandas"
11
   ]
12
  },
13
  {
14
   "cell_type": "code",
15
   "execution_count": 1,
16
   "metadata": {},
17
   "outputs": [],
18
   "source": [
19
    "import numpy as np\n",
20
    "from random import random"
21
   ]
22
  },
23
  {
24
   "cell_type": "markdown",
25
   "metadata": {},
26
   "source": [
27
    "### Задача 1\n",
28
    "Просто посчитать сумму чисел"
29
   ]
30
  },
31
  {
32
   "cell_type": "code",
33
   "execution_count": 2,
34
   "metadata": {},
35
   "outputs": [],
36
   "source": [
37
    "data = list(range(10**6))"
38
   ]
39
  },
40
  {
41
   "cell_type": "code",
42
   "execution_count": 3,
43
   "metadata": {},
44
   "outputs": [
45
    {
46
     "data": {
47
      "text/plain": [
48
       "[0, 1, 2, 3, 4]"
49
      ]
50
     },
51
     "execution_count": 3,
52
     "metadata": {},
53
     "output_type": "execute_result"
54
    }
55
   ],
56
   "source": [
57
    "data[:5]"
58
   ]
59
  },
60
  {
61
   "cell_type": "markdown",
62
   "metadata": {},
63
   "source": [
64
    "Однократное вычисление"
65
   ]
66
  },
67
  {
68
   "cell_type": "code",
69
   "execution_count": 4,
70
   "metadata": {
71
    "scrolled": true
72
   },
73
   "outputs": [
74
    {
75
     "name": "stdout",
76
     "output_type": "stream",
77
     "text": [
78
      "CPU times: user 97.1 ms, sys: 2.04 ms, total: 99.1 ms\n",
79
      "Wall time: 97.8 ms\n"
80
     ]
81
    },
82
    {
83
     "data": {
84
      "text/plain": [
85
       "499999500000"
86
      ]
87
     },
88
     "execution_count": 4,
89
     "metadata": {},
90
     "output_type": "execute_result"
91
    }
92
   ],
93
   "source": [
94
    "%%time\n",
95
    "\n",
96
    "total_sum = 0\n",
97
    "\n",
98
    "for num in data:\n",
99
    "    total_sum += num\n",
100
    "    \n",
101
    "total_sum"
102
   ]
103
  },
104
  {
105
   "cell_type": "code",
106
   "execution_count": 5,
107
   "metadata": {
108
    "scrolled": true
109
   },
110
   "outputs": [
111
    {
112
     "name": "stdout",
113
     "output_type": "stream",
114
     "text": [
115
      "CPU times: user 5.85 ms, sys: 58 µs, total: 5.9 ms\n",
116
      "Wall time: 5.92 ms\n"
117
     ]
118
    },
119
    {
120
     "data": {
121
      "text/plain": [
122
       "499999500000"
123
      ]
124
     },
125
     "execution_count": 5,
126
     "metadata": {},
127
     "output_type": "execute_result"
128
    }
129
   ],
130
   "source": [
131
    "%%time\n",
132
    "\n",
133
    "sum(data)"
134
   ]
135
  },
136
  {
137
   "cell_type": "markdown",
138
   "metadata": {},
139
   "source": [
140
    "Тест скорости"
141
   ]
142
  },
143
  {
144
   "cell_type": "code",
145
   "execution_count": 6,
146
   "metadata": {
147
    "scrolled": false
148
   },
149
   "outputs": [
150
    {
151
     "name": "stdout",
152
     "output_type": "stream",
153
     "text": [
154
      "CPU times: user 5.49 s, sys: 24.4 ms, total: 5.52 s\n",
155
      "Wall time: 5.55 s\n"
156
     ]
157
    }
158
   ],
159
   "source": [
160
    "%%time\n",
161
    "\n",
162
    "for _ in range(10**3):  # _ - это намек, что переменная в цикле НЕ используется\n",
163
    "    result = sum(data)"
164
   ]
165
  },
166
  {
167
   "cell_type": "code",
168
   "execution_count": 11,
169
   "metadata": {},
170
   "outputs": [
171
    {
172
     "data": {
173
      "text/plain": [
174
       "677"
175
      ]
176
     },
177
     "execution_count": 11,
178
     "metadata": {},
179
     "output_type": "execute_result"
180
    }
181
   ],
182
   "source": [
183
    "_"
184
   ]
185
  },
186
  {
187
   "cell_type": "markdown",
188
   "metadata": {},
189
   "source": [
190
    "Еще вариант"
191
   ]
192
  },
193
  {
194
   "cell_type": "code",
195
   "execution_count": 7,
196
   "metadata": {},
197
   "outputs": [
198
    {
199
     "name": "stdout",
200
     "output_type": "stream",
201
     "text": [
202
      "5.49 ms ± 111 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
203
     ]
204
    }
205
   ],
206
   "source": [
207
    "%%timeit\n",
208
    "\n",
209
    "sum(data)"
210
   ]
211
  },
212
  {
213
   "cell_type": "markdown",
214
   "metadata": {},
215
   "source": [
216
    "Пробуем с массивом numpy"
217
   ]
218
  },
219
  {
220
   "cell_type": "code",
221
   "execution_count": 8,
222
   "metadata": {},
223
   "outputs": [
224
    {
225
     "data": {
226
      "text/plain": [
227
       "array([0, 1, 2, 3, 4])"
228
      ]
229
     },
230
     "execution_count": 8,
231
     "metadata": {},
232
     "output_type": "execute_result"
233
    }
234
   ],
235
   "source": [
236
    "data = np.arange(10**6)\n",
237
    "data[:5]"
238
   ]
239
  },
240
  {
241
   "cell_type": "markdown",
242
   "metadata": {},
243
   "source": [
244
    "# Профилировщик\n",
245
    "- PyCharm\n",
246
    "- VS code"
247
   ]
248
  },
249
  {
250
   "cell_type": "code",
251
   "execution_count": 9,
252
   "metadata": {
253
    "scrolled": true
254
   },
255
   "outputs": [
256
    {
257
     "name": "stdout",
258
     "output_type": "stream",
259
     "text": [
260
      "CPU times: user 545 ms, sys: 3.46 ms, total: 549 ms\n",
261
      "Wall time: 549 ms\n"
262
     ]
263
    }
264
   ],
265
   "source": [
266
    "%%time\n",
267
    "\n",
268
    "for _ in range(10**3):\n",
269
    "    result = np.sum(data)"
270
   ]
271
  },
272
  {
273
   "cell_type": "code",
274
   "execution_count": 10,
275
   "metadata": {},
276
   "outputs": [
277
    {
278
     "ename": "KeyboardInterrupt",
279
     "evalue": "",
280
     "output_type": "error",
281
     "traceback": [
282
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
283
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
284
      "\u001b[0;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n",
285
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
286
     ]
287
    }
288
   ],
289
   "source": [
290
    "%%time\n",
291
    "\n",
292
    "for _ in range(10**3):\n",
293
    "    result = sum(data)"
294
   ]
295
  },
296
  {
297
   "attachments": {
298
    "rope.png": {
299
     "image/png": "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ICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxleGlmOlVzZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4zNTg0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjIyNDA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KOK7mJQAAQABJREFUeAHs3QewHld1OPBjSZbVLFvdsiUsy5KQu9y75YorxtjYoWSAAGESCD0DAc9/YIBQYggtNk6CCSGTwQTj3nuTe5PkJhdJliyr997/Okue82Qkve/bV1f63ZmHnt777u7e390xOnvunrvTxk0tNAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFRYoFOFr92lEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoBCQ+HQjECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQeQGJz8pPoQEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQICDx6R4gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKDyAhKflZ9CAyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQOLTPUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQOUFJD4rP4UGQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAxKd7gAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBygtIfFZ+Cg2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAGJT/cAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKVF5D4rPwUGgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhKf7gECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCovIPFZ+Sk0AAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJD7dAwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVF5A4rPyU2gABAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhIfLoHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCovIDEZ+Wn0AAIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJD4dA8QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFB5AYnPyk+hARAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgIPHpHiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoPICEp+Vn0IDIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBA4tM9QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA5QUkPis/hQZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIDEp3uAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHKC0h8Vn4KDYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAYlP9wABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApUXkPis/BQaAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECEp/uAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEKi8g8Vn5KTQAAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQkPt0DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhUXkDis/JTaAAECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEh8ugcIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKi8gMRn5afQAAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQkPh0DxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUHkBic/KT6EBECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAg8ekeIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECg8gISn5WfQgMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEDi0z1AgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDlBSQ+Kz+FBkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAgMSne4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcoLSHxWfgoNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABiU/3AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEClReQ+Kz8FBoAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQISn+4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQqLyDxWfkpNAACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCQ+3QMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFReQOKz8lNoAAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQISHy6BwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqLyAxGflp9AACBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCQ+HQPECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQeQGJz8pPoQEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQICDx6R4gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKDyAhKflZ9CAyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQOLTPUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQOUFJD4rP4UGQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAxKd7gAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBygtIfFZ+Cg2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAGJT/cAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKVF5D4rPwUGgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhKf7gECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCovIPFZ+Sk0AAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJD7dAwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVF5A4rPyU2gABAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhIfLoHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCovIDEZ+Wn0AAIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJD4dA8QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFB5AYnPyk+hARAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgIPHpHiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoPICEp+Vn0IDIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBA4tM9QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA5QUkPis/hQZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIDEp3uAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHKC0h8Vn4KDYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAYlP9wABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApUXkPis/BQaAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECEp/uAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEKi8g8Vn5KTQAAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQkPt0DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhUXkDis/JTaAAECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEh8ugcIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKi8gMRn5afQAAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQkPh0DxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUHkBic/KT6EBECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAg8ekeIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECg8gISn5WfQgMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEDi0z1AgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDlBSQ+Kz+FBkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAgMSne4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcoLSHxWfgoNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABiU/3AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEClReQ+Kz8FBoAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQISn+4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQqLyDxWfkpNAACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCQ+3QMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFReQOKz8lNoAAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQISHy6BwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqLyAxGflp9AACBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCQ+HQPECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQeQGJz8pPoQEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQICDx6R4gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKDyAhKflZ9CAyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQOLTPUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQOUFJD4rP4UGQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAxKd7gAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBygtIfFZ+Cg2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAGJT/cAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKVF5D4rPwUGgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhKf7gECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCovIPFZ+Sk0AAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJD7dAwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVF5A4rPyU2gABAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhIfLoHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCovIDEZ+Wn0AAIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJD4dA8QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFB5AYnPyk+hARAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgIPHpHiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoPICEp+Vn0IDIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBA4tM9QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA5QUkPis/hQZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIDEp3uAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHKC0h8Vn4KDYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAYlP9wABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApUXkPis/BQaAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECEp/uAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEKi8g8Vn5KTQAAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQkPt0DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhUXkDis/JTaAAECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEh8ugcIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKi8gMRn5afQAAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQkPh0DxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUHkBic/KT6EBECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAg8ekeIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECg8gISn5WfQgMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEDi0z1AgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDlBSQ+Kz+FBkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAgMSne4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcoLSHxWfgoNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABiU/3AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEClReQ+Kz8FBoAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQISn+4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQqLyDxWfkpNAACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCQ+3QMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFReQOKz8lNoAAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQISHy6BwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqLyAxGflp9AACBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCQ+HQPECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQeQGJz8pPoQEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQICDx6R4gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKDyAhKflZ9CAyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQOLTPUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQOUFJD4rP4UGQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAxKd7gAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBygtIfFZ+Cg2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAGJT/cAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKVF5D4rPwUGgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhKf7gECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCovIPFZ+Sk0AAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJD7dAwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVF5A4rPyU2gABAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhIfLoHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCovIDEZ+Wn0AAIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJD4dA8QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFB5AYnPyk+hARAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgIPHpHiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoPICEp+Vn0IDIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBA4tM9QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA5QUkPis/hQZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIDEp3uAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHKC0h8Vn4KDYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAYlP9wABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApUXkPis/BQaAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECEp/uAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEKi8g8Vn5KTQAAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQkPt0DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhUXkDis/JTaAAECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEh8ugcIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKi8gMRn5afQAAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQkPh0DxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUHkBic/KT6EBECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAg8ekeIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECg8gISn5WfQgMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEDi0z1AgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDlBSQ+Kz+FBkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAgMSne4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcoLSHxWfgoNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABiU/3AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEClReQ+Kz8FBoAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQISn+4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQqLyDxWfkpNAACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCQ+3QMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFReQOKz8lNoAAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIdEFAgAABAgRaW2DFihUxf/78WLBgQSxdujTWr18fXbp0iV133TX69+8fffr0ie7du7f2ZTg+AQIECBAgQIAAAQIESgmsWrWqiGfmzZtXxDTr1q2LTp06FTFNv379Ir969OhR6tg6ESBAgAABAgQItJyAxGfLWToSAQIECDQSyOTmjBkzYvz48TFx4sSYMmVKNDwkyN/tvPPOxUOCgQMHxujRo2Ps2LExZsyYRkfwLQECBAgQIECAAAECBNpPoHFM8/LLL8frr78ec+bMeTvx2blz57cXc44YMaKIaY455pj2u2BnJkCAAAECBAgQCIlPNwEBAgQItKjAhg0bYvbs2XH//ffHvffeG88++2y89tprxcOB/N07W66SzsRn3759JT7fiePvBAgQIECAAAECBAi0ucCWYprJkyfH4sWLY0sxzU477RSDBw+Onj17hsRnm0+XExIgQIAAAQIENhOQ+NyMw18IECBAoDkCa9eujWeeeSauvvrquPPOO2PSpElFWdttHXPjxo1F2dt99tlnWx/zOwIECBAgQIAAAQIECLS6QNmYJuOaUaNGtfr1OQEBAgQIECBAgMC2BSQ+t+3jtwQIECBQo8Dq1auLNzwvv/zy4m3P5cuX19Rzl112KR4QHHjggTV93ocIECBAgAABAgQIECDQGgJlY5ouXbrE8OHD4/DDD2+Ny3JMAgQIECBAgACBOgQkPuvA8lECBAgQ2LJAPiC477774nvf+16MGzcucrVzrW333XePo446Knbbbbdau/gcAQIECBAgQIAAAQIEWlSgOTFNt27d4vjjjy+272jRi3IwAgQIECBAgACBugUkPusm04EAAQIEGgusW7cuJkyYEJdddlk8/PDDjX/V5Pe5F84ee+xRPCTI7zUCBAgQIECAAAECBAi0tUDu21k2pslrzUWcZ5xxRohp2nrmnI8AAQIECBAg8OcCnf78R35CgAABAgRqE8g3O+fMmRNXXnllUd62tl7/96lcGZ374BxwwAH/90PfESBAgAABAgQIECBAoA0FFi1aVDqmyTK3++67bxx22GFteMVORYAAAQIECBAgsDUBic+tyfg5AQIECDQpsGrVqrjnnnvi2muvjVwlXW/r06dPHHfcccrc1gvn8wQIECBAgAABAgQItIhAVrDJbTvKxjTdu3ePsWPHKnPbIrPhIAQIECBAgACB5gtIfDbf0BEIECCwQwrk254zZ86M//iP/4hcIV1vyzJQe+65Z1Hmtt6+Pk+AAAECBAgQIECAAIGWEJg3b17827/9W6mYJs+fizmzzK1GgAABAgQIECDQMQQkPjvGPLgKAgQIVE4g3/bMPT0fe+yxUtfeo0ePosTt6NGjS/XXiQABAgQIECBAgAABAs0RyLc9M6bJrzJt5513jv322y8OOeSQMt31IUCAAAECBAgQaAUBic9WQHVIAgQI7AgC+ZbnNddcEytXriw13H79+hVlbnv16lWqv04ECBAgQIAAAQIECBBojsDy5cvj6quvjhUrVpQ6TC7mPOWUU6J3796l+utEgAABAgQIECDQ8gISny1v6ogECBDY7gXWrl0bL730UowbN67UWDt16hRDhgyJE044oVR/nQgQIECAAAECBAgQINAcgQ0bNsSkSZPi/vvvL3WY3LojF3O+5z3vKdVfJwIECBAgQIAAgdYRkPhsHVdHJUCAwHYtkCuib7/99liwYEGpceZbnlkOavjw4aX660SAAAECBAgQIECAAIHmCORizptvvjnmz59f6jBdu3YtYhpbd5Ti04kAAQIECBAg0GoCEp+tRuvABAgQ2D4FcmX0rFmz4tZbby09wP79+8dJJ50U3bp1K30MHQkQIECAAAECBAgQIFBGYOPGjTFv3ry44YYbynQv+mSZ2zPPPDO6d+9e+hg6EiBAgAABAgQItLyAxGfLmzoiAQIEtmuB1atXx6OPPhqvvfZaqXF26dIlhg0bFkcffXSp/joRIECAAAECBAgQIECgOQLr16+PRx55pCh1W+Y4uXXHHnvsUezvWaa/PgQIECBAgAABAq0nIPHZeraOTIAAge1SYMmSJXHLLbdEJkDLtN69e8cRRxxR7PFZpr8+BAgQIECAAAECBAgQaI7AypUr4/rrry8d0+yyyy7FQs5c0KkRIECAAAECBAh0LAGJz441H66GAAECHVpg3bp1MXny5HjooYdKX+egQYNi7NixsfPOO5c+ho4ECBAgQIAAAQIECBAoI5Bbd0ydOjXuu+++Mt2LPr169Yqzzz47cp9PjQABAgQIECBAoGMJSHx2rPlwNQQIEOjQArky+p577ok5c+aUus58MDBixIjijc9SB9CJAAECBAgQIECAAAECzRDIxZx33nlnzJo1q9RROnfuHHvvvXeccMIJpfrrRIAAAQIECBAg0LoCEp+t6+voBAgQ2G4ENm7cGPPnzy/K3Ob3ZVqfPn3i2GOPjf79+5fprg8BAgQIECBAgAABAgSaJbB48eKizG3ZmKZbt25x0kknFXt8NutCdCZAgAABAgQIEGgVAYnPVmF1UAIECGx/AmvXro3x48fHxIkTSw1up512isGDBxcPCTp18n8/pRB1IkCAAAECBAgQIECgtMD69etjwoQJ8dxzz5U+xu677x5nnXVWiGlKE+pIgAABAgQIEGhVAU+eW5XXwQkQILD9CCxfvjxuu+22yD/LtO7du8f+++8fBx10UJnu+hAgQIAAAQIECBAgQKBZArmY88Ybb4xly5aVOs7OO+8co0aNiiOPPLJUf50IECBAgAABAgRaX0Dis/WNnYEAAQKVF9iwYUO89dZbxf6eZQfTr1+/OPHEE6N3795lD6EfAQIECBAgQIAAAQIESglkadvZs2fHHXfcUap/dsrFnGeccUbkW58aAQIECBAgQIBAxxSQ+OyY8+KqCBAg0KEEVq1aFY888ki88cYbpa6rc+fOMXTo0KLMbakD6ESAAAECBAgQIECAAIFmCKxbty7GjRsXkydPLnWU3LpjwIABRZnbUgfQiQABAgQIECBAoE0EJD7bhNlJCBAgUG2BpUuXxs033xxZGqpM69WrV4wZMyaGDx9eprs+BAgQIECAAAECBAgQaJZALua87rrrSsc0Xbt2LWKa0aNHN+s6dCZAgAABAgQIEGhdAYnP1vV1dAIECFReIFdGv/766/Hoo4+WHkuujD7llFOiW7dupY+hIwECBAgQIECAAAECBMoI5NYdU6ZMiYceeqhM96JPz54945xzzinK3ZY+iI4ECBAgQIAAAQKtLiDx2erETkCAAIFqC6xcubLY23PevHmlBtKpU6fiTc9jjjmmVH+dCBAgQIAAAQIECBAg0ByBXMx55513xpw5c0od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AgQIECBAgACBNhLIqi633HJL6bP17Nmzw8U0uT1Hlrddvny5mKb0zOpIgAABAgQI7IgCEp874qwbMwECBP5XIFdGT5gwoSgLVQala9euceihh8aYMWPKdG9Wn3xDNffrvPfee4tStq+99lrMmTMnli1bVvMeN7VeQO/evWPYsGESn7WC+RwBAgQIECBAgACBNhLIhZBZDvb5558vdcbcumNHiGnybc8s52sxZ6nbRCcCBAgQIECgQgISnxWaLJdKgACBlhbIPWPybc8sd1um5cro8847L3r06FGme9198g3OV199tdi3s6Hs09y5c2PRokWRZW5bq+UDgv322y922WWX1jqF4xIgQIAAAQIECBAgUEIgF3PeeuutkbFNmZZlbt///ve3WUyTidrJkyfH3Xff/XYp27aKaUaPHh3dunUrw6QPAQIECBAgQKAyAhKflZkqF0qAAIGWFcgytxlg5/6eZVqWfx06dGicccYZZbrX3CcfDMycOTMee+yxt0vZzpgxI+bNm1c6YVvzyTd9sEuXLsUbrYccckjstNNO9XT1WQIECBAgQIAAAQIEWlkgt+64/fbbS50l/30/ePDgOOecc0r1r7VTQ+z15JNPFvFX/vnGG2+0WUyT4zzssMPi4IMPFtPUOmk+R4AAAQIECFRWQOKzslPnwgkQINA8gXxD8plnnilWG5c5Uvfu3eOkk06KIUOGlOneZJ/GpWwfffTRyFK2mexsjVK227qYfffdN04++eRWG+e2zu13BAgQIECAAAECBAhsXSAXSWZMk1VhyrRc5HjKKafEu971rjLdm+yzatWqogxvbs/x8MMPxyuvvFIsPs1YJ6+9rVrfvn1j7NixxcLVtjqn8xAgQIAAAQIE2ktA4rO95J2XAAEC7SzQUOY2y8eWabnvZZaEyocFLdUyGZsJzixjm1+5/2ju27l48eJWLWW7tevPUr75Rms+DMkSWBoBAgQIECBAgAABAh1HIMvc3nLLLVE2psnFnJdcckmLxjSZ0My3OTOeeeCBB4rE7OzZs4vtOcpeZ3PEM47JNz1zMaeYpjmS+hIgQIAAAQJVEWi5p9VVGbHrJECAAIHYsGFDzJo1K+6///5SGhkwZ+nXI444olT/xp3yWjK5+fjjj0euhH7qqafizTffLN7uLLtPT+Pjl/0+S/meeOKJxYOQPffcs+xh9CNAgAAB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4+67726Vtz47WkyTC1tHjhwZp59+estiOxoBAgQIECBAgEClBCQ+KzVdLpYAgZYQyL1wTj755Mhk37Zavu35ox/9KBYsWLCtj5X63RVXXBFTpkwp1bc1OvXs2TPOP//86NevX2sc3jEJECBAgAABAgQIEGhBgXpimn/5l3+JTFJu3LixBa8goqPFNDvvvHNcdNFFkfufagQIECBAgAABAjuugMTnjjv3Rk5ghxY49dRTY8CAAZEPDLbVnnjiibjssssi9/xsqZblpn71q1+1+KrrHEufPn2ia9eudV1qrozO8r+Z+GzKo64D+zABAgQIECBAgAABAq0mUGtM8/TTT8dPfvKTWLFiRYtdS2vFNHmBffv2rTumyThm0KBBReJTTNNi0+xABAgQIECAAIFKCkh8VnLaXDQBAs0VGDp0aJxxxhlNvvW5evXquOqqq+KXv/xli6yQfvjhh+PSSy+NWbNmNXcIRf8M6t/1rncVScvvfve78c1vfjNypXM9rXv37nHmmWfGPvvsU083nyVAgAABAgQIECBAoB0F6olp/uu//quIaTK+aW5r6ZgmrycXYp5zzjmRMc33v//9umOarOZz9tlnx4gRI5o7PP0JECBAgAABAgQqLrDtOo8VH5zLJ0CAwNYEMjn48Y9/PG688caYO3fu1j5W/Dx//8Mf/jCWLVsWn/3sZyP3CC3TbrjhhvjOd74TEyZMKNO96JOJzlwBve+++8aYMWPikEMOiQMPPDD22GOP6N27d1x33XWxatWqmo+fx8tSUJdcckndDxdqPokPEiBAgAABAgQIECDQ4gL1xDTz5s2Ln/70p7F8+fIipilbDrYlYpqEyEo1w4cPL2KajGsyphk8eHCx9cYtt9xSV0yTx9ttt93iL//yL8U0iaERIECAAAECBHZwAYnPHfwGMHwCO7LA4YcfHhdeeGH8+te/jrVr126T4s0334yf/exn8dJLL8Vf//Vfx7HHHhudO3feZp+GX77++uvx29/+Nn73u99Ffr9hw4aGX23zz0xK5gOBPffcM3I1d65eHjlyZPHnkCFDiuA+A/xevXoV15Klq+6+++66yvJ269YtTjrppOKBwzYvxi8JECBAgAABAgQIEOhwAvXENDNmzCje+nzllVfiE5/4RJx44ok1l5SdMmVK/OY3v6k7pkmwjGkyqZkxTS7gHDVqVBHT5N8zntl9993fjmny87fddltdMU2+7Tl27NhIC40AAQIECBAgQIDATps2t2/Z3e2ZEiBAoEICEydOjA9+8INFQrOW/xz27Nkzhg0bFqecckrknjqHHXZYsZdMJhAbWu4HunDhwpg0aVLcd999ceeddxbHz1XWtbRMeOYDgQ996ENx9NFHF2WfshxtJjjzq0ePHn+2kjmvffLkyUXAnw80am2ZQM1Svu95z3tq7eJzBAgQIECAAAECBAh0IIEyMU1ul5HJwoaYJhdbZszR0DKmWbRoUWSS9IEHHoi77rqrqFxTa0yTx8lzfOQjH4njjjtus5gmK+hsKabJPnPmzCkSmLnwtNaWidUs5XvuuefW2sXnCBAgQIAAAQIEtmMBic/teHINjQCBpgXWrVtXBMlf/OIXY8mSJU13+N9PZFnZQYMGxcCBA4uVy/lnBu95vEx6ZqCeCcgM3PPhQK1veXbq1CmOOuqo+Pa3v12Usc0gvpY9O/O8WeY2k6X5kKKW1rVr12IfnP/+7/+OTOhqBAgQIECAAAECBAhUT6A5Mc2AAQOKuCYXRGZ8kzFNQ9Iz45n8mj17dhHT1BpnpGBuyfGDH/wgDj300GKrjlpimux36623xvnnn19zTJNVeE4++eS4/vrri0WieQyNAAECBAgQIEBgxxZQ6nbHnn+jJ7DDC2RZpCx3m6ukL7/88lizZk1NJpkkza/XXnst8m3PTCJm0J1vXmbZ3NxnMx9A1NMa3vT83ve+F8cff3zNZafyHHmuXIldz8OIXNGdq68lPeuZJZ8lQIAAAQIECBAg0LEEmhvTZOWYhpgmF2Jmy/hi5cqVdcc02XevvfaKyy67rHijNOOketo999xTV0yTY8+tO7IyjkaAAAECBAgQIEAgBSQ+3QcECOzwArmvzJe+9KViJfMf/vCHJvf7bAyWic58IJBfzWmZ9Nxjjz2KNz3rTXrmeXN/z8cee6yuS8iHBLmyWyNAgAABAgQIECBAoNoCHSGmScHcr/P73/9+qaRnLkJ9+OGH65qITNRmSV2NAAECBAgQIECAQIPAn5byNfzNnwQIENhBBYYOHRrf+ta34qKLLopMCLZ1Gzx4cHznO98p9qWpd1V0ltGdNm1avPrqq3VddvbLhKlGgAABAgQIECBAgED1Bdo7punbt29k9ZoLLrigruo1DfLTp0+Pl19+ueGvNf2ZC1GXL19e02d9iAABAgQIECBAYMcQkPjcMebZKAkQqEFgxIgRRfLxk5/8ZGQZ2LZqw4YNK0pBfeADH4hdd9217tNmedsXX3wxli5dWlff1atXx7PPPltXHx8mQIAAAQIECBAgQKDjCrRnTPPjH/84PvzhD5eKaVI0tx+pN6bJWOjJJ5/suBPiyggQIECAAAECBNpcQOKzzcmdkACBjiqQ5WbzQcE3vvGN4u3PLD3b2u20006LK6+8Ms4///zI8lRlWgb7zz33XLG/aD39cx/SBx98MF544YV6uvksAQIECBAgQIAAAQIdVOCdMc3ee+8d+bPWbA0xTS7kLBvT5PU9/fTTdcc0uRfpAw88EBMmTGjNITo2AQIECBAgQIBAhQQ6byrt+K0KXa9LJUCAQKsLZLA+evToGDNmTFE2acqUKZHJxZZsuQ/N5z//+fjqV78ahx12WLPeMM03N6+44oq6S91mWahly5bFokWL4phjjolevXq15BAdiwABAgQIECBAgACBdhJoHNPk3plTp06NtWvXtujVtGRMkxf2s5/9LCZNmlT3NWap27lz58bxxx9f+m3Tuk+qAwECBAgQIECAQIcV2GnTg++NHfbqXBgBAgTaUaDhAUG+FXnNNdfEuHHjikRhcy4py9qed955ceGFF8YBBxwQAwcObM7hir7z5s2Lk046KV566aW6j5Wrv/v06RPvfe974zOf+Uwcfvjh0blz57qPowMBAgQIECBAgAABAh1PIGOaadOmxcMPPxx//OMfiz9z4WNzWmvENLmYM2ORstVoevfuHeecc0587nOfi6OPPlpM05wJ1pcAAQIECBAgUHEBic+KT6DLJ0Cg9QVyn5kZM2bE+PHj46GHHopHH300XnvttViyZEmTJ88k4qBBg+Lggw+OE088MU444YQYPnx4ZBndLl26NNm/qQ9s2LCheDiQx63lerZ0vEx+9uzZM0aNGlVcX5aqytXS/fr129LH/YwAAQIECBAgQIAAgYoJZEwzc+bMoiRsJkEfeeSRIqZZuHBhkyPJmCYXbB5yyCGtEtPkBeQbqXn8sjFNHqNHjx4xcuTIOO644+L0008vFof2798/f6URIECAAAECBAjsQAISnzvQZBsqAQLNE8g9MfPtyvnz5xeB+eTJk4vV07NmzYrFixdHrlLu1KlTEXD37ds39tprr8g9dTL4Hjx4cGTQ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EOg8gR07b8hGTIAAgTIEIlR84YUX0sqVKxsLjqc777jjjnTYYYdVT3k2fuAvDti6VO5ll12WLrroor846r9/Xr9+ffWeni+++OK/f/QbAQIECBAgQIAAAQIE/l/g+eefTytWrGj0iMDyrrvuSkceeWS35jTxRfHKj0svvTRdcskljd8bK9m8+OKLyZymkcoBBAgQIECAAIGOEBB8dkSbDJIAgRIF4j01zz77bOMdyvF05pVXXlm9MyeevuzuFuHnqFGjqveETpw4sfZ08Q7Sr7/+OsWd1DYCBAgQIECAAAECBAj8ViCepHz66acb5zTxmXgq9MQTT6xWlPntObb19wg/r7/++urpz7pzxBi///57c5o6JPsIECBAgAABAh0kIPjsoGYZKgEC5QjE5Hv58uVpzpw5tUXHUk4TJkxI8YRmv379ao/9OzvjvLHM1OWXX57i97rtp59+cpGgDsg+AgQIECBAgAABAoUKxDK37777bmP18V7Pq666qkfnNHFD5+jRo9M111zTOKeJm07dzNnYJgcQIECAAAECBDpCoP5qdkeUYJAECBDIT2DLli1pwYIFadWqVbXFRdh5wQUXpBEjRtQety07Bw0alKZMmZLGjRtX+/G4SDB//vyW3tlTeyI7CRAgQIAAAQIECBDISiDmCT/88ENjTRdffHGK13f09Na3b980derUNH78+NpTx/zLnKaWyE4CBAgQIECAQMcICD47plUGSoBASQJbg8948rNuGzJkSDr11FNT3M3c01ucMy4+xHJTdVuMNd5DGk+o2ggQIECAAAECBAgQILBVYN68ealpTjNw4MB0xhlntGVOE+OIJW9POeWUrUP6039jjOY0f0rjjwQIECBAgACBjhMQfHZcywyYAIESBOLdmYsXL64tdetytE1PZNaepGHngAED0uTJkxuOSmn9+vWCz0YlBxAgQIAAAQIECBAoS2DhwoWNBccrNg488MDG47b1gD59+qTjjz++8ePmNI1EDiBAgAABAgQIdISA4LMj2mSQBAiUJhDB57fffltb9k477ZTGjh2b+vfvX3tcd3bGRYJ99tknxbK3ddvmzZsbx1v3efsIECBAgAABAgQIEMhP4Ouvv24s6oADDmjrnCZuGN13333T4MGDa8diTlPLYycBAgQIECBAoGMEBJ8d0yoDJUCgNIE1a9bUlhxL0bbj3Z6/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hx9+SOvXr/+f08cd0PGe0D333LNaxvaYY46pnvKMd9/Ee0QFnv/D5T8IECBAgAABAgQIEGizQMxp1q1bl1atWpXeeeedxjnNjjvuWM1pRo4cWc1p4r2h8TN+/Pg0ePDgJPBsc8OcngABAgQIECDQCwUEn72wKYZEgACB7grEErgRdG7YsKG6aPDNN99U/8ZFhC1btqR4r00sXzt8+PA0YsSI6qJA/K1///4p3oFjI0CAAAECBAgQIECAwPYUaGVOEzdyxio1MaeJmzdjPhPzGnOa7dk5302AAAECBAgQ2L4Cgs/t6+/bCRAg0HaBWPI2ws64ezp+YotlbeMnnvr07s62t8AXECBAgAABAgQIECDQDYE/m9PE6eKJT3OabsD6KAECBAgQIEAgQwHBZ4ZNVRIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB0gR2LK1g9RIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQnIPgsruUKJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIJCfgOAzv56qiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAoLP4lquYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL5CQg+8+upiggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUJyD4LK7lCiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCQn4DgM7+eqogAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAcQKCz+JarmACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC+QkIPvPrqYoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCcg+Cyu5QomQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkJ+A4DO/nqqIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHECgs/iWq5gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvkJCD7z66mKCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQn8B+tQWzH6jftGAAAAABJRU5ErkJggg=="
300
    }
301
   },
302
   "cell_type": "markdown",
303
   "metadata": {},
304
   "source": [
305
    "### Задача 2\n",
306
    "Веревку длиной 1 метр разрезают в двух случайных местах. С какой вероятностью длина самого большого отрезка окажется более 50 сантиметров?\n",
307
    "![rope.png](attachment:rope.png)"
308
   ]
309
  },
310
  {
311
   "cell_type": "code",
312
   "execution_count": 14,
313
   "metadata": {},
314
   "outputs": [],
315
   "source": [
316
    "from random import random"
317
   ]
318
  },
319
  {
320
   "cell_type": "code",
321
   "execution_count": 22,
322
   "metadata": {},
323
   "outputs": [
324
    {
325
     "data": {
326
      "text/plain": [
327
       "(0.5976711992032095, 0.9661842897029447)"
328
      ]
329
     },
330
     "execution_count": 22,
331
     "metadata": {},
332
     "output_type": "execute_result"
333
    }
334
   ],
335
   "source": [
336
    "first = random()\n",
337
    "second = random()\n",
338
    "\n",
339
    "first, second"
340
   ]
341
  },
342
  {
343
   "cell_type": "code",
344
   "execution_count": null,
345
   "metadata": {},
346
   "outputs": [],
347
   "source": [
348
    "left_cut = min(first, second)\n",
349
    "right_cut = max(first, second)"
350
   ]
351
  },
352
  {
353
   "cell_type": "code",
354
   "execution_count": null,
355
   "metadata": {},
356
   "outputs": [],
357
   "source": [
358
    "if left_cut > 0.5\n",
359
    "if right_cut - left_cut > 0.5\n",
360
    "if right_cut < 0.5"
361
   ]
362
  },
363
  {
364
   "cell_type": "code",
365
   "execution_count": null,
366
   "metadata": {},
367
   "outputs": [],
368
   "source": []
369
  },
370
  {
371
   "cell_type": "code",
372
   "execution_count": 32,
373
   "metadata": {
374
    "scrolled": true
375
   },
376
   "outputs": [
377
    {
378
     "name": "stdout",
379
     "output_type": "stream",
380
     "text": [
381
      "0.7501787\n",
382
      "CPU times: user 5.91 s, sys: 35.4 ms, total: 5.95 s\n",
383
      "Wall time: 5.96 s\n"
384
     ]
385
    }
386
   ],
387
   "source": [
388
    "%%time\n",
389
    "\n",
390
    "N_ATTEMPTS = 10**7\n",
391
    "success_count = 0\n",
392
    "\n",
393
    "for _ in range(N_ATTEMPTS):\n",
394
    "    first_cut = random()\n",
395
    "    second_cut = random()\n",
396
    "    \n",
397
    "    left_cut = min(first_cut, second_cut)  # позиция левого надреза\n",
398
    "    right_cut = max(first_cut, second_cut)  # позиция правого надреза\n",
399
    "    \n",
400
    "    if (\n",
401
    "        left_cut >= 0.5 or  # левый кусок больше 50см\n",
402
    "        right_cut - left_cut >= 0.5 or  # кусок между надрезами больше 50см\n",
403
    "        1-right_cut >= 0.5  # правый кусок больше 50см\n",
404
    "    ):\n",
405
    "        success_count += 1\n",
406
    "        \n",
407
    "print(success_count / N_ATTEMPTS)"
408
   ]
409
  },
410
  {
411
   "cell_type": "markdown",
412
   "metadata": {},
413
   "source": [
414
    "Пробуем с помощью numpy"
415
   ]
416
  },
417
  {
418
   "cell_type": "code",
419
   "execution_count": 24,
420
   "metadata": {},
421
   "outputs": [
422
    {
423
     "data": {
424
      "text/plain": [
425
       "array([0.75778293, 0.8903409 , 0.37658031, 0.77807423, 0.58180176,\n",
426
       "       0.71740072, 0.27533437, 0.76562725, 0.57958218, 0.77943997])"
427
      ]
428
     },
429
     "execution_count": 24,
430
     "metadata": {},
431
     "output_type": "execute_result"
432
    }
433
   ],
434
   "source": [
435
    "np.random.random(10)"
436
   ]
437
  },
438
  {
439
   "cell_type": "code",
440
   "execution_count": 28,
441
   "metadata": {},
442
   "outputs": [
443
    {
444
     "data": {
445
      "text/plain": [
446
       "array([0.13294801, 0.77226362, 0.85692282, 0.29534272, 0.36666038,\n",
447
       "       0.37564865, 0.97125546, 0.43806988, 0.29694839, 0.83192201])"
448
      ]
449
     },
450
     "execution_count": 28,
451
     "metadata": {},
452
     "output_type": "execute_result"
453
    }
454
   ],
455
   "source": [
456
    "first_cut = np.random.random(10)\n",
457
    "first_cut"
458
   ]
459
  },
460
  {
461
   "cell_type": "code",
462
   "execution_count": 29,
463
   "metadata": {},
464
   "outputs": [
465
    {
466
     "data": {
467
      "text/plain": [
468
       "array([0, 1, 1, 0, 0, 0, 1, 0, 0, 1])"
469
      ]
470
     },
471
     "execution_count": 29,
472
     "metadata": {},
473
     "output_type": "execute_result"
474
    }
475
   ],
476
   "source": [
477
    "# np.where(условие, что подставить, когда условие выполнено, когда условие НЕ выполнено)\n",
478
    "\n",
479
    "np.where(first_cut > 0.5, 1, 0)"
480
   ]
481
  },
482
  {
483
   "cell_type": "code",
484
   "execution_count": 26,
485
   "metadata": {},
486
   "outputs": [],
487
   "source": [
488
    "first_cut = np.random.random(10**7)"
489
   ]
490
  },
491
  {
492
   "cell_type": "code",
493
   "execution_count": 27,
494
   "metadata": {},
495
   "outputs": [
496
    {
497
     "data": {
498
      "text/plain": [
499
       "80000096"
500
      ]
501
     },
502
     "execution_count": 27,
503
     "metadata": {},
504
     "output_type": "execute_result"
505
    }
506
   ],
507
   "source": [
508
    "first_cut.__sizeof__()"
509
   ]
510
  },
511
  {
512
   "cell_type": "code",
513
   "execution_count": 30,
514
   "metadata": {},
515
   "outputs": [
516
    {
517
     "name": "stdout",
518
     "output_type": "stream",
519
     "text": [
520
      "CPU times: user 1.6 s, sys: 90.3 ms, total: 1.69 s\n",
521
      "Wall time: 1.69 s\n"
522
     ]
523
    },
524
    {
525
     "data": {
526
      "text/plain": [
527
       "0.7499787"
528
      ]
529
     },
530
     "execution_count": 30,
531
     "metadata": {},
532
     "output_type": "execute_result"
533
    }
534
   ],
535
   "source": [
536
    "%%time\n",
537
    "\n",
538
    "first_cut = np.random.random(10**7)\n",
539
    "second_cut = np.random.random(10**7)\n",
540
    "\n",
541
    "sum(np.where(\n",
542
    "    ((first_cut < 0.5) & (second_cut < 0.5)) |   # | or, & and\n",
543
    "    ((first_cut > 0.5) & (second_cut > 0.5)) |\n",
544
    "    (abs(first_cut - second_cut) > 0.5), \n",
545
    "    1, 0)) / 10**7"
546
   ]
547
  },
548
  {
549
   "cell_type": "code",
550
   "execution_count": null,
551
   "metadata": {},
552
   "outputs": [],
553
   "source": [
554
    "# multiprocessing  Thread\n",
555
    "# asyncio - асинхронные вычисления"
556
   ]
557
  },
558
  {
559
   "cell_type": "code",
560
   "execution_count": null,
561
   "metadata": {},
562
   "outputs": [],
563
   "source": []
564
  },
565
  {
566
   "cell_type": "code",
567
   "execution_count": null,
568
   "metadata": {},
569
   "outputs": [],
570
   "source": []
571
  },
572
  {
573
   "cell_type": "markdown",
574
   "metadata": {},
575
   "source": [
576
    "# Метрики схожести текстов"
577
   ]
578
  },
579
  {
580
   "cell_type": "markdown",
581
   "metadata": {},
582
   "source": [
583
    "Расстояние Хемминга - число различающихся символов (у строк одинакового размера)"
584
   ]
585
  },
586
  {
587
   "cell_type": "code",
588
   "execution_count": 33,
589
   "metadata": {},
590
   "outputs": [],
591
   "source": [
592
    "signal_1 = '010010100101010101101011101010100101'\n",
593
    "signal_2 = '010110100101011101110011101010100101'"
594
   ]
595
  },
596
  {
597
   "cell_type": "code",
598
   "execution_count": 34,
599
   "metadata": {},
600
   "outputs": [
601
    {
602
     "name": "stdout",
603
     "output_type": "stream",
604
     "text": [
605
      "4\n"
606
     ]
607
    }
608
   ],
609
   "source": [
610
    "hamming_dist = 0\n",
611
    "\n",
612
    "for i, number in enumerate(signal_1):\n",
613
    "    if number != signal_2[i]:\n",
614
    "        hamming_dist += 1\n",
615
    "        \n",
616
    "print(hamming_dist)"
617
   ]
618
  },
619
  {
620
   "cell_type": "markdown",
621
   "metadata": {},
622
   "source": [
623
    "Расстояние Левенштейна"
624
   ]
625
  },
626
  {
627
   "cell_type": "code",
628
   "execution_count": 35,
629
   "metadata": {},
630
   "outputs": [],
631
   "source": [
632
    "import Levenshtein"
633
   ]
634
  },
635
  {
636
   "cell_type": "code",
637
   "execution_count": 36,
638
   "metadata": {},
639
   "outputs": [
640
    {
641
     "data": {
642
      "text/plain": [
643
       "4"
644
      ]
645
     },
646
     "execution_count": 36,
647
     "metadata": {},
648
     "output_type": "execute_result"
649
    }
650
   ],
651
   "source": [
652
    "Levenshtein.distance('иванов', 'петров')"
653
   ]
654
  },
655
  {
656
   "cell_type": "code",
657
   "execution_count": 37,
658
   "metadata": {},
659
   "outputs": [],
660
   "source": [
661
    "voice_transcription = 'Романова'  # результат расшифровки голоса"
662
   ]
663
  },
664
  {
665
   "cell_type": "code",
666
   "execution_count": 38,
667
   "metadata": {},
668
   "outputs": [],
669
   "source": [
670
    "team = ['Мединская', 'Лучникова', 'Шереметьева', 'Разгуляева', 'Романовская']  # список настоящих фамилий"
671
   ]
672
  },
673
  {
674
   "cell_type": "code",
675
   "execution_count": 39,
676
   "metadata": {},
677
   "outputs": [
678
    {
679
     "data": {
680
      "text/plain": [
681
       "[('Романовская', 3),\n",
682
       " ('Лучникова', 6),\n",
683
       " ('Мединская', 7),\n",
684
       " ('Разгуляева', 7),\n",
685
       " ('Шереметьева', 8)]"
686
      ]
687
     },
688
     "execution_count": 39,
689
     "metadata": {},
690
     "output_type": "execute_result"
691
    }
692
   ],
693
   "source": [
694
    "sorted([(name, Levenshtein.distance(name, voice_transcription)) for name in team], key=lambda x: x[1])"
695
   ]
696
  },
697
  {
698
   "cell_type": "code",
699
   "execution_count": null,
700
   "metadata": {},
701
   "outputs": [],
702
   "source": []
703
  },
704
  {
705
   "cell_type": "code",
706
   "execution_count": null,
707
   "metadata": {},
708
   "outputs": [],
709
   "source": []
710
  },
711
  {
712
   "cell_type": "markdown",
713
   "metadata": {},
714
   "source": [
715
    "# Word2vec"
716
   ]
717
  },
718
  {
719
   "cell_type": "markdown",
720
   "metadata": {},
721
   "source": [
722
    "- google --> пщщпду\n",
723
    "- однушка --> однокомнатная квартира\n",
724
    "\n",
725
    "[Пример](https://ai.intelligentonlinetools.com/ml/k-means-clustering-example-word2vec/) использования"
726
   ]
727
  },
728
  {
729
   "cell_type": "code",
730
   "execution_count": 40,
731
   "metadata": {},
732
   "outputs": [],
733
   "source": [
734
    "import word2vec"
735
   ]
736
  },
737
  {
738
   "cell_type": "code",
739
   "execution_count": null,
740
   "metadata": {
741
    "scrolled": true
742
   },
743
   "outputs": [],
744
   "source": [
745
    "# построение модели\n",
746
    "# word2vec.word2vec('keywords_only.csv', 'keywords.bin', size=100, binary=True, verbose=True)"
747
   ]
748
  },
749
  {
750
   "cell_type": "code",
751
   "execution_count": 41,
752
   "metadata": {},
753
   "outputs": [],
754
   "source": [
755
    "model = word2vec.load('keywords.bin')"
756
   ]
757
  },
758
  {
759
   "cell_type": "code",
760
   "execution_count": 42,
761
   "metadata": {
762
    "scrolled": true
763
   },
764
   "outputs": [
765
    {
766
     "data": {
767
      "text/plain": [
768
       "(5110, 100)"
769
      ]
770
     },
771
     "execution_count": 42,
772
     "metadata": {},
773
     "output_type": "execute_result"
774
    }
775
   ],
776
   "source": [
777
    "model.vectors.shape"
778
   ]
779
  },
780
  {
781
   "cell_type": "code",
782
   "execution_count": 43,
783
   "metadata": {},
784
   "outputs": [
785
    {
786
     "data": {
787
      "text/plain": [
788
       "[('доллар', 'курс', 0.9418648979417067),\n",
789
       " ('доллар', 'новости', 0.961252865976364),\n",
790
       " ('доллар', 'exist', 0.7393588306142083),\n",
791
       " ('курс', 'новости', 0.9320686871264429),\n",
792
       " ('курс', 'exist', 0.8172263099993266),\n",
793
       " ('новости', 'exist', 0.7475044615162911)]"
794
      ]
795
     },
796
     "execution_count": 43,
797
     "metadata": {},
798
     "output_type": "execute_result"
799
    }
800
   ],
801
   "source": [
802
    "model.distance('доллар', 'курс', 'новости', 'exist')"
803
   ]
804
  },
805
  {
806
   "cell_type": "code",
807
   "execution_count": 44,
808
   "metadata": {
809
    "scrolled": true
810
   },
811
   "outputs": [
812
    {
813
     "data": {
814
      "text/plain": [
815
       "[('фейсбук', 0.9973144427134036),\n",
816
       " ('реклама', 0.9967488335032968),\n",
817
       " ('контакт', 0.9937352354865503),\n",
818
       " ('gmail', 0.9913932694292359),\n",
819
       " ('одноклассники', 0.9911915278087111),\n",
820
       " ('мою', 0.988450608859537),\n",
821
       " ('odnoklassniki', 0.9882130270998799),\n",
822
       " ('майл', 0.9866659658020683),\n",
823
       " ('госуслуги', 0.9865898596239959),\n",
824
       " ('vk', 0.985478288550912)]"
825
      ]
826
     },
827
     "execution_count": 44,
828
     "metadata": {},
829
     "output_type": "execute_result"
830
    }
831
   ],
832
   "source": [
833
    "indexes, metrics = model.similar('вконтакте')\n",
834
    "model.generate_response(indexes, metrics).tolist()"
835
   ]
836
  },
837
  {
838
   "cell_type": "code",
839
   "execution_count": 45,
840
   "metadata": {},
841
   "outputs": [
842
    {
843
     "data": {
844
      "text/plain": [
845
       "[('дикого', 0.9660463414472039),\n",
846
       " ('дочь', 0.9654834067319502),\n",
847
       " ('перси', 0.9645626335378448),\n",
848
       " ('запада', 0.9634953006784215),\n",
849
       " ('одна', 0.9626509379556154),\n",
850
       " ('синий', 0.9625325953575207),\n",
851
       " ('папины', 0.9622590861211784),\n",
852
       " ('поли', 0.9617913888840744),\n",
853
       " ('мастер', 0.9613913633302174),\n",
854
       " ('зеленый', 0.9612019929452926)]"
855
      ]
856
     },
857
     "execution_count": 45,
858
     "metadata": {},
859
     "output_type": "execute_result"
860
    }
861
   ],
862
   "source": [
863
    "indexes, metrics = model.similar('замок')\n",
864
    "model.generate_response(indexes, metrics).tolist()"
865
   ]
866
  },
867
  {
868
   "cell_type": "code",
869
   "execution_count": 46,
870
   "metadata": {
871
    "scrolled": true
872
   },
873
   "outputs": [
874
    {
875
     "data": {
876
      "text/plain": [
877
       "[('иллюзия', 0.9746920189283443),\n",
878
       " ('обмана', 0.9739505786654822),\n",
879
       " ('союзники', 0.9726426792215386),\n",
880
       " ('механик', 0.9708741631776523),\n",
881
       " ('возвращайся', 0.9658919454200058),\n",
882
       " ('воскрешение', 0.9658354453664477),\n",
883
       " ('кредо', 0.9636937079052321),\n",
884
       " ('омерзительная', 0.9615733713655767),\n",
885
       " ('всех', 0.9599216386354856),\n",
886
       " ('серого', 0.9594825853024929)]"
887
      ]
888
     },
889
     "execution_count": 46,
890
     "metadata": {},
891
     "output_type": "execute_result"
892
    }
893
   ],
894
   "source": [
895
    "indexes, metrics = model.similar('фильм')\n",
896
    "model.generate_response(indexes, metrics).tolist()"
897
   ]
898
  }
899
 ],
900
 "metadata": {
901
  "kernelspec": {
902
   "display_name": "Python 3 (ipykernel)",
903
   "language": "python",
904
   "name": "python3"
905
  },
906
  "language_info": {
907
   "codemirror_mode": {
908
    "name": "ipython",
909
    "version": 3
910
   },
911
   "file_extension": ".py",
912
   "mimetype": "text/x-python",
913
   "name": "python",
914
   "nbconvert_exporter": "python",
915
   "pygments_lexer": "ipython3",
916
   "version": "3.9.13"
917
  }
918
 },
919
 "nbformat": 4,
920
 "nbformat_minor": 4
921
}
922

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.