Skip to content

Commit

Permalink
adds all current progress
Browse files Browse the repository at this point in the history
  • Loading branch information
stllfe committed Mar 5, 2023
1 parent 2340792 commit 179288e
Show file tree
Hide file tree
Showing 15 changed files with 4,240 additions and 29 deletions.
Empty file added data/.gitkeep
Empty file.
24 changes: 11 additions & 13 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,29 @@
2. Декодер (уровня символов): получает на вход вектор-контекст слов от энкодера и закодированное слово для замены*

Само слово для декодера решил *кодировать вот так:
abcdef (допустим меняем f на z) -> [2, 0, 0, 0, 0, 0, 1], где 2 — позиция слова в тексте, 1 — маркер символа, 0 — паддинг.
На выход от декодера в таком случае жду вектор [0, 0, 0, 0, 0, 0.75], где 0.75 — вероятность (условно) замены f на z.
abcdef (допустим меняем f на z) -> `[2, 0, 0, 0, 0, 0, 1]`, где 2 — позиция слова в тексте, 1 — маркер символа, 0 — паддинг.
На выход от декодера в таком случае жду вектор `[0, 0, 0, 0, 0, 0.75]`, где 0.75 — вероятность (условно) замены f на z.
Поверх этого бинарная кросс-энтропия и классические метрики классификации. Как я это вижу: «менять ли символ f на z».

Для первого приближения к решению пока могу не рассматривать слова, где символов несколько (в большинстве он все же один).
Не исключаю, что я вообще лажу придумал и перемудрил от незнания, поэтому жду, что опытные товарищи укажут на это…

## Вариант 2
Если все правки, которые нужно внести в текст, сводятся к замене символа на символ (без вставки и удаления), то кажется, что seq2seq для этой задачи overshoot, и с ней вполне сможет справиться более простая модель формата sequence tagging. Конкретно по архитектуре это может быть и cnn, и rnn, и трансформер, смотря насколько сильна и сложна зависимость от контекста.
_(Ответы в чате)_

Если все правки, которые нужно внести в текст, сводятся к замене символа на символ (без вставки и удаления), то кажется, что `seq2seq` для этой задачи overshoot, и с ней вполне сможет справиться более простая модель формата sequence tagging. Конкретно по архитектуре это может быть и CNN, и RNN, и трансформер, смотря насколько сильна и сложна зависимость от контекста.
Подавал в неё я бы тупо последовательность символов (всё предложение), а на выходе каждого токена требовал бы предсказать распределение над теми символами, которые там на самом деле должны быть.

--
Вот к чему-то такому склоняюсь. Смущает только, что по факту из всего предложения может быть 1-2 слова для замены, тогда модели придётся на каждый токен выдавать нулевые векторы. Но согласен, по крайней мере это проще и понятнее, чем мои эвристики по кодированию входа. Спасибо!
_— Смущает только, что по факту из всего предложения может быть 1-2 слова для замены, тогда модели придётся на каждый токен выдавать нулевые векторы. Но согласен, по крайней мере это проще и понятнее, чем мои эвристики по кодированию входа._

--
— Ну и пусть выдает, жалко что ли? Ведь ей же все равно приходится принимать решение, надо ли заменять каждый из этих токенов или нет, так пусть принимает его в явном виде.

Ну и пусть выдает, жалко что ли) ведь ей же все равно приходится принимать решение, надо ли заменять каждый из этих токенов или нет, так пусть принимает его в явном виде.
--
Кстати правильно же понимаю, что в вашем предложении нельзя готовые эмбеддинги для слов поиспользовать, модель должна сама изучить зависимости между цепочками символов?
--
Если очень хочется, можно в этой модели объединить представления слов и символов: например, на первом слое конкатенировать эмбеддинг символа (обучаемый) с эмбеддингом слова (предобученным).
_— Кстати правильно же понимаю, что в вашем предложении нельзя готовые эмбеддинги для слов поиспользовать, модель должна сама изучить зависимости между цепочками символов?_

Но вообще, я не уверен, что при правке текста на уровне символов эмбеддинги слов вообще полезны: во-первых, эмбеддинги слов обычно ничего не знают о написании этих слов (если это не fasttext), а во вторых, при замене символов (чем вы собираетесь заниматься), слово становится другим - и, скорее всего, оно будет OOV для предобученных эмбеддингов.
— Если очень хочется, можно в этой модели объединить представления слов и символов: например, на первом слое конкатенировать эмбеддинг символа (обучаемый) с эмбеддингом слова (предобученным).

Впрочем, я могу ошибаться. Можете привести примеры текстов из вашей задачи?)
Но вообще, я не уверен, что при правке текста на уровне символов эмбеддинги слов вообще полезны: во-первых, эмбеддинги слов обычно ничего не знают о написании этих слов (если это не fasttext), а во вторых, при замене символов (чем вы собираетесь заниматься), слово становится другим - и, скорее всего, оно будет OOV для предобученных эмбеддингов.
Впрочем, я могу ошибаться. Можете привести примеры текстов из вашей задачи?

## Полезные ссылки
* [StressRNN](https://github.com/Desklop/StressRNN)
11 changes: 6 additions & 5 deletions docs/data.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
# Данные для обучения

Модель обучена на данных из русской Википедии. Скрипты для получения данных находятся в директории `scripts`. Текущий датасет собран следующей командой:
Модель обучена на данных из русской Википедии. Скрипты для получения данных находятся в директории `scripts`.

Текущий датасет собран следующей командой:

```shell
python scripts/extract_sentences_from_wiki.py -j 8 -s 50 -n 1000000
```

Затем произведена первичная очистка текста:

```shell
python scripts/preprocess_sentences.py -j 4
```
Финальный датасет собирается следующей командой:
```shell
python scripts/compile_dataset.py
```
188 changes: 188 additions & 0 deletions notebooks/01_Searching_for_Data.ipynb

Large diffs are not rendered by default.

Loading

0 comments on commit 179288e

Please sign in to comment.