Как найти самый похожий String в Array
мне нужно найти самый похожий String в Array,что-то типа:
const arr = ["toster","tester","tescer"]
const str = "tescor"
compare(arr,str) /// return "tescer"
Можно ли это сделать,если да то как?
Ответы (2 шт):
Выбор способа вычисления близости строк очень сильно зависит от решаемой задачи.
Классическим подходом является вычисление расстояния Левенштейна.
Расстояние Левенштейна (редакционное расстояние, дистанция редактирования) — метрика, измеряющая разность между двумя последовательностями символов. Она определяется как минимальное количество односимвольных операций (а именно вставки, удаления, замены), необходимых для превращения одной последовательности символов в другую. В общем случае, операциям, используемым в этом преобразовании, можно назначить разные цены. Широко используется в теории информации и компьютерной лингвистике.
const levenshtein = require('fast-levenshtein');
function compare(str, arr) {
return arr.sort((a, b) => levenshtein.get(str, a) - levenshtein.get(str, b))[0];
}
const arr = ['toster','tester','tescer'];
const str = 'tescor';
console.log(compare(str, arr)); // tescer
Но существуют подходы к вычислению расстояния, которые лучше подходят для задач, связанных с естественными языками. Рекомендую ознакомиться с документацией к модулю natural.
const natural = require('natural');
function compareJaroWinkler(str, array) {
return arr.sort((a, b) => natural.JaroWinklerDistance(str, b) - natural.JaroWinklerDistance(str, a))[0];
}
const arr = ['концерт в омске', 'концерт в комске', 'концерт в москве'];
const str = 'концерт в томске';
console.log('->', str);
console.log('<-', compareJaroWinkler(str, arr));
-> концерт в томске
концерт в омске 0.9874999999999999
концерт в комске 0.9483333333333334
концерт в москве 0.9616666666666668
<- концерт в омске
Я нашёл немного больше подходящею либу: https://www.npmjs.com/package/find-most-similar
const findMostSimilar = require('find-most-similar');
const source = 'book';
const words = ['lock', 'block', 'back', 'hack'];
findMostSimilar(source, words); // returns 'back'