Как сделать так чтобы при неправильном написании бот сравнивал с командой и исполнял похожую?
Нужно сделать так что бы бот считывал команду
<<!пинг>>
даже при ошибки в контексте, например:
<<панг>>, <<пунг>> и т.п
Сейчас команда считывается при помощи RegExp
Тобежь:
bot.hear(/^(?:пинг)/i, async (message) => { //код ex: return message.send("ПоНг") }); |
bot.hear(/^(?:пинг)/i, async (message) => { //код ex: return message.send("ПоНг") });
При этом используется модули: vk-io и vk-io@hear
Дополнительно:
Как-то так: /^(?:п[а-яйё]нг)/i.
Встречный вопрос. У вас бот для кого? Возможны ошибки в слове из 4 букв?
- Бот чат-менеджер, немного не так сформулировал вопрос, суть в том чтобы не думать о том где может быть ошибка, а на уровне ии или что то типо того, что бы ошибка могла быть где угодно а не только во второй букве. Отмечу пока что как решение ведь как таковой ответ на вопрос последовал.
Ответы:
def Levenshtein_distance(a, b, levenstein_gap=2): a, b = a.lower(), b.lower() "Calculates the Levenshtein distance between a and b." n, m = len(a), len(b) if n > m: # Make sure n <= m, to use O(min(n, m)) space a, b = b, a n, m = m, n current_row = range(n + 1) # Keep current and previous row, not entire matrix for i in range(1, m + 1): previous_row, current_row = current_row, [i] + [0] * n for j in range(1, n + 1): add, delete, change = previous_row[j] + 1, current_row[j - 1] + 1, previous_row[j - 1] if a[j - 1] != b[i - 1]: change += 1 current_row[j] = min(add, delete, change) return current_row[n] <= levenstein_gap |
def Levenshtein_distance(a, b, levenstein_gap=2): a, b = a.lower(), b.lower() "Calculates the Levenshtein distance between a and b." n, m = len(a), len(b) if n > m: # Make sure n <= m, to use O(min(n, m)) space a, b = b, a n, m = m, n current_row = range(n + 1) # Keep current and previous row, not entire matrix for i in range(1, m + 1): previous_row, current_row = current_row, [i] + [0] * n for j in range(1, n + 1): add, delete, change = previous_row[j] + 1, current_row[j - 1] + 1, previous_row[j - 1] if a[j - 1] != b[i - 1]: change += 1 current_row[j] = min(add, delete, change) return current_row[n] <= levenstein_gap
Реализация расчёта расстояния Левенштейна. Функция две строки и сравнивает их. Грубо говоря если "расстояние" между двумя строками не больше чем levenstein_gap, то строки считаются похожими
- Подробнее тут
https://habr.com/ru/articles/777686/ - Даниил Гладыш, в моем примере используется RegExp, и мне не оч хочется использовать неудобный метод поимки события и сравнения с текстом той или иной команды, тобежь решение должно быть как выше, но только что бы не прогназировать где пользователь может допустить ошибку.
И да вопрос был по JS а не по Python, как решение ответить не могу
- Семен Nemo Dev, Дело конечно ваше, хотя я могу предложить хранить где то список команд, которые пользователь может использовать и сделать функцию, которая проходит по всем командам, сравнивает с тем что ввёл пользователь, та, что подходит больше всего, (расстояние Левенштейна как раз позволяет это сделать), возвращается функцией и далее используется как вам нужно.
вопрос был по JS а не по Python
А какая разница?) Алгоритм то не зависит от языка
- Семен Nemo Dev, vk io hear не позволяет сделать такое, вам нужно писать собственную реализацию команд)
Можете, как сказали выше, проходить циклом по командам и при помощи алгоритма сравнивать, а затем, как вариант, кешировать совпадение, чтобы при каждом запросе не проходиться по массиву еще раз. Конечно, кеширование должно быть временным
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для реализации функционала, при котором бот будет сравнивать введенную команду с предопределенными и исполнять похожую при неправильном написании, можно использовать алгоритм сравнения строк.
Прежде всего, необходимо создать набор предопределенных команд и соответствующих им действий. Для этого можно использовать массив, где ключом будет являться предопределенная команда, а значением - соответствующее действие или функция.
Затем, при получении команды от пользователя, необходимо сравнить ее с каждой предопределенной командой из массива. Для этого можно воспользоваться алгоритмами сравнения строк, такими как расстояние Левенштейна или алгоритм сравнения последовательностей.
Если найдено сходство между введенной командой и одной из предопределенных, то бот может выполнить соответствующее действие. В случае, если введенная команда не совпадает с предопределенными, можно использовать алгоритмы для поиска наиболее похожей команды и выполнить ее.
Пример реализации на PHP:
$commands = [ 'привет' => 'echo "Привет, пользователь!";', 'время' => 'echo date("H:i:s");', 'погода' => 'echo "Сегодня солнечно";', // Добавьте другие предопределенные команды здесь ]; $user_command = strtolower($_POST['command']); foreach ($commands as $key => $value) { similar_text($user_command, $key, $similarity); if ($similarity > 80) { // Устанавливаем порог сходства eval($value); exit; } } echo "Команда не найдена. Попробуйте другую команду.";
Этот код будет сравнивать введенную команду с предопределенными, и если найдено сходство более 80%, то будет выполнять соответствующее действие. Если сходство не достигнуто, будет выведено сообщение о том, что команда не найдена.