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

Ссылка скопирована
1 ответ

Нужно сделать так что бы бот считывал команду

<<!пинг>>

даже при ошибки в контексте, например:

<<панг>>, <<пунг>> и т.п

Сейчас команда считывается при помощи RegExp
Тобежь:

bot.hear(/^(?:пинг)/i, async (message) =&gt; {  //код ex: return message.send("ПоНг") });

bot.hear(/^(?:пинг)/i, async (message) =&gt; { //код 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 &gt; m:         # Make sure n &lt;= 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] &lt;= 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 &gt; m: # Make sure n &lt;= 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] &lt;= levenstein_gap

Реализация расчёта расстояния Левенштейна. Функция две строки и сравнивает их. Грубо говоря если "расстояние" между двумя строками не больше чем levenstein_gap, то строки считаются похожими

  • Подробнее тут
    https://habr.com/ru/articles/777686/
  • Даниил Гладыш, в моем примере используется RegExp, и мне не оч хочется использовать неудобный метод поимки события и сравнения с текстом той или иной команды, тобежь решение должно быть как выше, но только что бы не прогназировать где пользователь может допустить ошибку.

    И да вопрос был по JS а не по Python, как решение ответить не могу

  • Семен Nemo Dev, Дело конечно ваше, хотя я могу предложить хранить где то список команд, которые пользователь может использовать и сделать функцию, которая проходит по всем командам, сравнивает с тем что ввёл пользователь, та, что подходит больше всего, (расстояние Левенштейна как раз позволяет это сделать), возвращается функцией и далее используется как вам нужно.

    вопрос был по JS а не по Python

    А какая разница?) Алгоритм то не зависит от языка

  • Семен Nemo Dev, vk io hear не позволяет сделать такое, вам нужно писать собственную реализацию команд)

    Можете, как сказали выше, проходить циклом по командам и при помощи алгоритма сравнивать, а затем, как вариант, кешировать совпадение, чтобы при каждом запросе не проходиться по массиву еще раз. Конечно, кеширование должно быть временным

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для реализации функционала, при котором бот будет сравнивать введенную команду с предопределенными и исполнять похожую при неправильном написании, можно использовать алгоритм сравнения строк.

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

Затем, при получении команды от пользователя, необходимо сравнить ее с каждой предопределенной командой из массива. Для этого можно воспользоваться алгоритмами сравнения строк, такими как расстояние Левенштейна или алгоритм сравнения последовательностей.

Если найдено сходство между введенной командой и одной из предопределенных, то бот может выполнить соответствующее действие. В случае, если введенная команда не совпадает с предопределенными, можно использовать алгоритмы для поиска наиболее похожей команды и выполнить ее.

Пример реализации на PHP:

$commands = [
    'привет' =&gt; 'echo "Привет, пользователь!";',
    'время' =&gt; 'echo date("H:i:s");',
    'погода' =&gt; 'echo "Сегодня солнечно";',
    // Добавьте другие предопределенные команды здесь
];
 
$user_command = strtolower($_POST['command']);
 
foreach ($commands as $key =&gt; $value) {
    similar_text($user_command, $key, $similarity);
    if ($similarity &gt; 80) { // Устанавливаем порог сходства
        eval($value);
        exit;
    }
}
 
echo "Команда не найдена. Попробуйте другую команду.";

$commands = [ 'привет' =&gt; 'echo "Привет, пользователь!";', 'время' =&gt; 'echo date("H:i:s");', 'погода' =&gt; 'echo "Сегодня солнечно";', // Добавьте другие предопределенные команды здесь ]; $user_command = strtolower($_POST['command']); foreach ($commands as $key =&gt; $value) { similar_text($user_command, $key, $similarity); if ($similarity &gt; 80) { // Устанавливаем порог сходства eval($value); exit; } } echo "Команда не найдена. Попробуйте другую команду.";

Этот код будет сравнивать введенную команду с предопределенными, и если найдено сходство более 80%, то будет выполнять соответствующее действие. Если сходство не достигнуто, будет выведено сообщение о том, что команда не найдена.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно