# Klasifikace časových tokenů

## Prerekvizity
### Virtualenv

```
$ python3 -m venv virtualenv
$ source virtualenv/bin/activate
$ pip install --upgrade pip setuptools
```

```
$ pip install -r requirements.txt
```

### Small-e-czech
```
$ git clone https://github.com/seznam/small-e-czech.git
```


## Příprava datasetu
Pro vytvoření datasetu je možné využít skript `prepare_dataset.py`.
Skript umožňuje zpracovat 1..N oanotovaných JSON souborů a 0..M neanotovaných souborů.
Dotazy v neanotovaných souborech jsou defaultně považovány za dotazy, které neobsahují čas.

Skript umožňuje mergeování v rámci více anotovaných souborů - shoda probíhá na základě shodných tokenů. To samé platí i pro neanotované soubory.

V případě že se vyskytne dotaz jak v anotovaných datech tak v neanotovaných, tak je preference anotovaného dotazu.

Výstupem skriptu je `csv` soubor, který má následující formát:

```
has_time   query   tokens   weight  annotations
```
Oddělovač: `TAB`

```
prepare_dataset.py -a 22-04-23_updated_annotations.json 22-01-24_revize_negativnich.json -u 21-09-01_not_matching_unused.min.json -o 22-04-24_dataset.csv
```


## Trénování modelu
Skript `train_model.py`

## Vytvoření onnx modelu a kvantizace
Skript `export_onnx_model.py`.


V případě prostředí virtualenv, je `net_drawer.py` skript umístěn zde `virtualenv/lib/python3.8/site-packages/onnx/tools/net_drawer.py`.
```
python net_drawer.py --input electra_fp32.onnx --output fp32.dot --embed_docstring
dot -Tsvg fp32.dot -o fp32.svg

```

Parametrem `-l` lze zvolit kolik vrstev modelu nemá být kvantizováno.
Rozsah vrstev pro vyloučení z kvantizace: <0, 11>

| Parametr `-l` | Význam |
|---|---|
| 0 | Kompletní kvantizace |
| 1 | Nekvantizované vrstvy: 1 |
| 2 | Nekvantizované vrstvy: 1, 2 |
| ... | |
| 11 | Nekvantizované vrstvy: 1..10 |

### Aktuální hodnoty
|Model | Precision | Recall | F1-score |
|---|---|---|---|
|fp32 | 95.4% | 97.1% | 96.2% |
| uint8 (`-l 0`) | 93.4% | 97.6% | 95.5% |
| ... | ... | ... | ... |
| uint8 (`-l 7`) | 94.4% | 97.7% | 96.0% |
| uint8 (`-l 8`) | 94.5% | 97.7% | 96.1% |
| ... | ... | ... | ... |
| uint8 (`-l 11`) | 94.6% | 97.7% | 96.1% |

Jako kompromis byl zvolen částečně kvantizovaný model vytvořený pomocí parametru `-l 8` (2022-02-03).


## Vyhodnocení modelu
Skript `eval_model.py`


