Предсказать JavaScript строку из не найденного ввода - PullRequest
0 голосов
/ 30 марта 2020

Я сейчас программирую бота Discord, и мне было интересно, можно ли предсказать требуемую команду, если ввод неправильный.

Например, у меня есть этот список команд: ['help','meme','ping'], и если пользователь введет «hepl», можно ли как-то перенаправить их в команду справки?

Надеюсь, у вас будет ответ для меня:)

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Один из вариантов - найти команду, у которой расстояние Левенштейна от входа равно 2 или меньше:

// https://gist.github.com/andrei-m/982927
const getEditDistance=function(t,n){if(0==t.length)return n.length;if(0==n.length)return t.length;var e,h,r=[];for(e=0;e<=n.length;e++)r[e]=[e];for(h=0;h<=t.length;h++)r[0][h]=h;for(e=1;e<=n.length;e++)for(h=1;h<=t.length;h++)n.charAt(e-1)==t.charAt(h-1)?r[e][h]=r[e-1][h-1]:r[e][h]=Math.min(r[e-1][h-1]+1,Math.min(r[e][h-1]+1,r[e-1][h]+1));return r[n.length][t.length]};

const commands = ['help','meme','ping'];
const getCommand = (input) => {
  if (commands.includes(input)) return input;
  return commands.find(command => getEditDistance(input, command) <= 2);
};
console.log(getCommand('hepl'));

(2 - просто число, не стесняйтесь выбирать желаемый допуск - чем он выше, тем больше будет угадываться команд, но тем больше ложных срабатываний будет)

1 голос
/ 30 марта 2020

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

const words = ["help", "meme", "ping"];
const getHits = (word, wordToMatch, hits = 0) => {
  if (!word.length || !wordToMatch.length) return hits;
  let charW = word.slice(0, 1);
  let index = wordToMatch.indexOf(charW);
  if (index !== -1) {
    return getHits(
      word.slice(1),
      String(wordToMatch.slice(0, index) + wordToMatch.substr(index + 1)),
      hits + 1
    );
  }
  return getHits(word.slice(1), wordToMatch, hits);
};
const getMatch = mword => {
  return words.reduce((m, word) => {
    m[word] = getHits(mword, word);
    return m;
  }, {});
};
const sort = obj => {
  return Object.entries(obj).sort(
    ([_, value1], [__, value2]) => value2 - value1
  );
};
console.log(getMatch("help"));
console.log(sort(getMatch("help")));

console.log(getMatch("me"));
console.log(sort(getMatch("me")));
.as-console-row {color: blue!important}
...