## 2.3 Теоретические задачи: Векторная модель текста

### Предустановка необходимых библиотек


```python
!pip install sympy
```

    Collecting sympy
      Downloading sympy-1.10-py3-none-any.whl (6.4 MB)
    [2K     [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m6.4/6.4 MB[0m [31m8.2 MB/s[0m eta [36m0:00:00[0mm eta [36m0:00:01[0m[36m0:00:01[0m
    [?25hCollecting mpmath>=0.19
      Downloading mpmath-1.2.1-py3-none-any.whl (532 kB)
    [2K     [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m532.6/532.6 KB[0m [31m3.3 MB/s[0m eta [36m0:00:00[0m[36m0:00:01[0m[36m0:00:01[0m
    [?25hInstalling collected packages: mpmath, sympy
    Successfully installed mpmath-1.2.1 sympy-1.10


### Импорт необходимых библиотек


```python
from sympy.parsing import sympy_parser
from sympy import diff, symbols, log, exp
```

### [Найдите в общем виде производную функции потерь (бинарная кросс-энтропия) по w.](https://stepik.org/lesson/261086/step/2?unit=241830)


```python
x, y, w, b = symbols("x y w b")
```


```python
y_pred = 1 / (1 + exp(-w * x - b))
```


```python
d = -y * log(y_pred) - (1 - y) * log(1 - y_pred)
```


```python
d_res = diff(d, w).simplify()
```


```python
str(d_res)
```




    'x*(-y*exp(b + w*x) - y + exp(b + w*x))/(exp(b + w*x) + 1)'



### [Найдите в общем виде производную функции потерь (бинарная кросс-энтропия) по b.](https://stepik.org/lesson/261086/step/3?unit=241830)


```python
x, y, w, b = symbols("x y w b")
```


```python
y_pred = 1 / (1 + exp(-w * x - b))
```


```python
d = -y * log(y_pred) - (1 - y) * log(1 - y_pred)
```


```python
d_res_2 = diff(d, b).simplify()
```


```python
str(d_res_2)
```




    '(-y*exp(b + w*x) - y + exp(b + w*x))/(exp(b + w*x) + 1)'



### [Найдите в общем виде производную функции потерь (бинарная кросс-энтропия с L2-регуляризацией) по w.](https://stepik.org/lesson/261086/step/4?unit=241830)


```python
x, y, w, b, c = symbols("x y w b c")
```


```python
y_pred = 1 / (1 + exp(-w * x - b))
```


```python
d = -y * log(y_pred) - (1 - y) * log(1 - y_pred)
```


```python
f = d + c * (w**2 + b**2)
```


```python
d_res_3 = diff(f, w).simplify()
```


```python
str(d_res_3)
```




    '(2*c*w*exp(b + w*x) + 2*c*w - x*y*exp(b + w*x) - x*y + x*exp(b + w*x))/(exp(b + w*x) + 1)'



### [Используя формулу производной функции потерь (бинарная кросс-энтропия с L2-регуляризацией), запишите формулу для обновления веса w с помощью стохастического градиентного спуска (размер минибатча равен 1)](https://stepik.org/lesson/261086/step/5?unit=241830)


```python
x, y, w, b, c, t = symbols("x y w b c t")
```


```python
y_pred = 1 / (1 + exp(-w * x - b))
```


```python
d = -y * log(y_pred) - (1 - y) * log(1 - y_pred)
```


```python
f = d + c * (w**2 + b**2)
```


```python
d_res_3 = diff(f, w).simplify()
```


```python
f_grad = w - d_res_3 * t
```


```python
str(f_grad)
```




    '-t*(2*c*w*exp(b + w*x) + 2*c*w - x*y*exp(b + w*x) - x*y + x*exp(b + w*x))/(exp(b + w*x) + 1) + w'



### [Напишите функцию для вычисления точечной взаимной информации двух случайных событий (PMI).](https://stepik.org/lesson/261086/step/7?unit=241830)


```python
import numpy as np
```


```python
def calculate_pmi(a, b):
    return np.log(
        np.array([1 for a_el, b_el in zip(a, b) if (a_el == 1 and b_el == 1)]).sum()
        / len(a)
        / ((a.sum() / len(a)) * (b.sum() / len(b)))
    )
```


```python
a, b = np.array([1, 0, 0, 1, 1, 0]), np.array([1, 0, 0, 0, 1, 0])
```


```python
calculate_pmi(a, b)
```




    0.6931471805599453



### [Найдите количество слов, которые встречаются менее, чем в 10 из 10000 документов, если предполагать, что вероятность встретить слово в документе распределена по Ципфу с параметром s = 2, количество слов в словаре N = 1000. Ранги нумеруются с 1.](https://stepik.org/lesson/261086/step/8?unit=241830)




```python
def get_Z(N, s):
    return sum([i ** (-s) for i in range(1, N + 1)])


def get_zipf_prob(rank, s, Z):
    return 1 / (Z * rank**s)
```


```python
N, s = 1000, 2
```


```python
Z = get_Z(N, s)
```


```python
Z
```




    1.6439345666815615




```python
sum([1 for rank in range(1, N + 1) if get_zipf_prob(rank, s, Z) < 0.001])
```




    976




```python

```

4b6af5b40eacacecfbdcb34c4913151051c97c41
ipynb
Jupyter Notebook
theor_tasks/theor_task_2.3_word_embeddings_for_text.ipynb
arturburiev/stepik-dl-nlp
749022169a379da8076d562783700c2064c4e0e8
MIT
2022-03-09T13:05:32.000Z
2022-03-09T13:05:32.000Z
theor_tasks/theor_task_2.3_word_embeddings_for_text.ipynb
arturburiev/stepik-dl-nlp
749022169a379da8076d562783700c2064c4e0e8
MIT
theor_tasks/theor_task_2.3_word_embeddings_for_text.ipynb
arturburiev/stepik-dl-nlp
749022169a379da8076d562783700c2064c4e0e8
MIT
Qwen/Qwen-72B
1. YES
2. YES