Можно например для словаря (фиксированного) построить префиксное и суффиксное деревья, и для конкретного слова находить пересечение множеств слов из словаря с совпадающими суффиксами и префиксами наибольшей длины. После чего найти в этом множестве ближайшее слово перебором, а затем проверить нет ли в оставшихся словах вариантов с меньшим расстоянием (отсекая вычисление расстояния, если оно заведомо больше уже текущего оптимального). Будет в разы быстрее (особенно на словах с ошибкой в середине). Но такой подход все еще линейно зависит от размера словаря и сильно подтармаживает, если в слове есть 2 ошибки: в начале и конце (что впрочем нечасто встречается).
Можно еще попробовать нечеткий вариант: сделать отображение из слова в вектор такое, что расстояние между векторами сильно коррелирует с растоянием Левенштейна (например сетку обучить предсказывать эти расстояния как скалярное произведение эмбеддингов слов). Затем использовать классические методы поиска ближайшего соседа — flann trees или faiss. Такой метод будет очень быстр (порядка O(log N) времени где N — число слов в словаре). Но с какой-то вероятностью будет возвращать не самое близкое слово.
Итересная статья (и ваша и про SESR). Какой-то когнитивный диссонанс возникает при ее прочтении: обычно все теоретические материалы твердят как один, что надо везде вставлять нелинейности, а не то линейные слои схлопнутся в один (ну и зачем учить 2 слоя если по факту это один). А тут специально сделали "плохо" и получилось хорошо.
Правда кажется что тут все исхищрения с перетасовыванием размерностей можно бы заменить последовательным применением сверток к identity-сверточному ядру. Это следует из ассоциативности свертки:
Где A - изображение, C1,...,CN - операции сверток, I - identity свертка (т.е. такая, которая ничего не делает с изображением).
Вроде должно получиться что-то типа такого (не тестил на работоспособность, это чисто чтобы объяснить, что имею ввиду):
Кажется так проще с точки зрения того, что понимание того как устроены веса сверток нужно только на этапе создания identity свертки. А дальше все происходит под капотом pytorch. Собственно так и предлагают делать в самой статье про SESR.
Можно например для словаря (фиксированного) построить префиксное и суффиксное деревья, и для конкретного слова находить пересечение множеств слов из словаря с совпадающими суффиксами и префиксами наибольшей длины. После чего найти в этом множестве ближайшее слово перебором, а затем проверить нет ли в оставшихся словах вариантов с меньшим расстоянием (отсекая вычисление расстояния, если оно заведомо больше уже текущего оптимального). Будет в разы быстрее (особенно на словах с ошибкой в середине). Но такой подход все еще линейно зависит от размера словаря и сильно подтармаживает, если в слове есть 2 ошибки: в начале и конце (что впрочем нечасто встречается).
Можно еще попробовать нечеткий вариант: сделать отображение из слова в вектор такое, что расстояние между векторами сильно коррелирует с растоянием Левенштейна (например сетку обучить предсказывать эти расстояния как скалярное произведение эмбеддингов слов). Затем использовать классические методы поиска ближайшего соседа — flann trees или faiss. Такой метод будет очень быстр (порядка O(log N) времени где N — число слов в словаре). Но с какой-то вероятностью будет возвращать не самое близкое слово.
Итересная статья (и ваша и про SESR). Какой-то когнитивный диссонанс возникает при ее прочтении: обычно все теоретические материалы твердят как один, что надо везде вставлять нелинейности, а не то линейные слои схлопнутся в один (ну и зачем учить 2 слоя если по факту это один). А тут специально сделали "плохо" и получилось хорошо.
Правда кажется что тут все исхищрения с перетасовыванием размерностей можно бы заменить последовательным применением сверток к identity-сверточному ядру. Это следует из ассоциативности свертки:
Где A - изображение, C1,...,CN - операции сверток, I - identity свертка (т.е. такая, которая ничего не делает с изображением).
Вроде должно получиться что-то типа такого (не тестил на работоспособность, это чисто чтобы объяснить, что имею ввиду):
Кажется так проще с точки зрения того, что понимание того как устроены веса сверток нужно только на этапе создания identity свертки. А дальше все происходит под капотом pytorch. Собственно так и предлагают делать в самой статье про SESR.