[DS NLP] Как сгенерировать кроссворд при помощи deep learning? (Natural Language Processing)

Вопрос от коллег: вопрос про кроссворд, все когда-то пытались их решать. Слова случайно пересекают друг друга в 1 и более местах по общим буквам. В качестве дано могут даваться некоторые буквы на пересечениях слов или же просто в случайных местах (а может и вобще их не быть в кроссворде), помимо этого даются фразы-задания для каждого слова (обычно не больше 3-5 слов). Конечно помимо этого известны ответы, в качестве таргета.
Подобная задача является крайне интересной с точки зрения применения генеративных NLP моделей. По данным все оказалось весьма грустно, хотя обнаружил что полгода назад на HuggingFaces появился довольно обширный датасет кроссвордов из New York Times - https://huggingface.co/datasets/cryptonite (может кому будет интересно, у них и статья на arxiv есть).
Возник вопрос, как можно грамотно incorporate подобные данные (расположение слов очевидно имеет значение). Конечно подобную задачу можно попробовать решать простым файн-тьюном условного T5 на парах вопрос-ответ, но врятли это резонный метод для такой задачи (как минимум не учитывается контекст всего кроссворда + информация о других словах и вопросах может помочь модели отвечать правильно).
Для меня решение подобной, отчасти мультимодальной задачи, кажется весьма нетривиальным. Хотелось бы понять как такие задачи можно вобще архитектурно решить или хотя бы сформулировать (особый вид эмбедингов или может какой-то сложный трансформер).

Тема: Обработка естественного языка (Natural Language Processing, NLP, Data Science)

Ответы от коллег:

1) BERT Mask-filling + перебор вариантов, как бейзлайн.

2) Можно зафайнтюнить T5, подавая на вход вопрос и шаблон для слова типа **а****п* . Шаблоны при обучении можно генерировать самостоятельно, заменяя в слове большую часть букв (или все) на звёздочки или какой-то ещё символ, ну а во время реального применения формировать шаблоны на основе уже известных слов.

(автор вопроса) Подавать на вход имеется ввиду склеивая через сепаратор? Похоже на рабочий подход. При файнтьюнинге кстати хотелось бы не потерять знания нейронки из условной википедии, можете немного развить мысль в эту сторону, как это можно было бы сделать?

Да, через сепаратор. Дополнить обучающий датасет определениями из этой самой Википеди.

(автор вопроса) А что делать если в таргете например должны быть буквы которые уже есть в строке для ответа? Как можно обучатся подобному или какой тут нужен алгоритм генерации чтобы учитывать и буквы и длину слова нужную?

- И буквы, и длину слова можно учитывать в маске, состоящей из неизвестных букв (заменённых на звёздочки) и известных букв. Нейросеть до дообучения не будет знать, как пользоваться этой маской, но в ходе обучения научится делать это хотя бы приблизительно. Можно сэмплить (случайно или с помощью beam search) 
- Чтобы контроль длины слова был не приблизительно, а точно, в huggingface можно написать собственный logits processor (https://huggingface.co/docs/transformers/internal/generation_utils), который бы в beam search'e обнулял бы вероятность генерации слишком длинных слов.
- Полный алгоритм для работы со всем кроссвордом я плохо представляю, т.к. не очень понятно, в какой последовательности заполнять слова кроссворда, но, наверное, это должен быть какой-то simulated annealing, где слова сначала сэмплятся из модели с высокой степенью случайности, и некоторые слова могут "выкидывать" другие слова, с которыми они плохо согласуются, а по мере заполнения кроссворда мы всё больше концентрируемся на словах, которые модель угадала достаточно уверенно. Или можно пойти по жадному пути пути, когда модель генерирует для каждого вопроса список слов-кандидатов, и мы заполняем слот с самым уверенным кандидатом, потом перегенерируем слова-соседи с учётом уже сгенерированных букв, и повторяем это до тех пор, пока не заполним всё.

3) Интересно, составляют ли уже кроссворды автоматически? или все еще руками?

(автор вопроса) Натыкался только на такое https://github.com/riverrun/genxword


Источник: ODS slack
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

Комментариев нет :

Отправить комментарий