Если вы довольны своим подходом, самый простой способ может быть, если вы сможете обучить свой LSTM обратным последовательностям так, чтобы он обучался, чтобы придать вес предыдущему слову, а не следующему. В таком случае вы можете использовать метод, который вы уже используете, за исключением того, что первое подмножество слов будет удовлетворять последнему ограничению гласных. Я не верю, что это гарантированно даст лучший результат.
Теперь, если это изменение невозможно или если после прочтения моего ответа вы обнаружите, что это не находит лучшего решения, затем я предлагаю использовать алгоритм поиска пути, аналогичный обучению с подкреплением, но не статистический, поскольку веса, вычисленные с помощью обученного LSTM, являются детерминированными c. То, что вы в настоящее время используете, это, по сути, глубина вначале жадный поиск , который, в зависимости от вывода LSTM, может быть даже оптимальным. Скажите, если LSTM дает вам гарантированное монотонное увеличение суммы, которая не сильно варьируется между приемлемыми последовательными словами (поскольку разница между N-1 и N последовательностью намного больше, чем разница между различными вариантами N-го слова) , В общем случае, когда нет четкого heuristi c, чтобы помочь вам, вам придется выполнить исчерпывающий поиск. Если вы можете придумать допустимую heuristi c, вы можете использовать A * вместо Dijkstra's алгоритм в первом варианте ниже, и он будет работать быстрее, тем лучше вы heuristi c is.
Полагаю, это понятно, но на всякий случай связность вашего графа определяется последовательностью ограничений. Начальный узел (последовательность длиной 0 без слов) связан с любым словом в вашем фрейме данных, которое соответствует началу вашей последовательности ограничений. Таким образом, у вас нет графика в качестве структуры данных, просто это сжатое описание в качестве этого ограничения.
РЕДАКТИРОВАТЬ В соответствии с запросом в комментарии здесь дополнительные детали. Вот несколько вариантов:
Применить алгоритм Дейкстры несколько раз. Поиск Дейкстры находит кратчайший путь между 2 известными узлами, в то время как в вашем случае у нас есть только начальный узел (последовательность 0 длины без слов), а последние слова неизвестны.
- Найдите все приемлемые последние слова (те, которые удовлетворяют ограничениям на шаблон и гласные).
- Примените поиск Дейкстры для каждого из них, найдя наибольшую весовую сумму последовательности слов для каждого из них.
- Алгоритм Дейкстры адаптирован к поиску кратчайшего пути, поэтому, чтобы применить его напрямую, вам придется сбрасывать веса на каждом шаге и выбирать наименьший из тех, которые еще не посещались. .
- Найдя все решения (предложения, заканчивающиеся одним из тех последних слов, которые вы определили изначально), выберите наименьшее решение (это будет как раз самая большая весовая сумма среди всех решений).
Измените существующий поиск в глубину, чтобы выполнить исчерпывающий поиск.
- Выполните операцию поиска, как описано в OP, и найдите решение, если последнее шаг дает единицу (если последнее слово с правильным гласным доступно вообще), запишите вес
- Откат на Шаг к предыдущему слову и выберите второй лучший вариант среди предыдущих слов. Вы могли бы отказаться от всех слов одинаковой длины на предыдущем шаге, если решения не было вообще. Если было решение, это зависит от того, предоставляет ли ваш LSTM различные веса в зависимости от предыдущего слова. Вероятно, так и есть, и в этом случае вы должны выполнить эту операцию для всех слов на предыдущем шаге.
- Когда у вас заканчиваются слова на предыдущем шаге, переместитесь на один шаг вверх и перезапустите оттуда.
- Вы сохраняете текущего победителя все время, а также список не посещенных узлов. на каждом шагу и выполнять исчерпывающий поиск. В конце концов, вы найдете лучшее решение.