Как найти самый похожий String в Array

мне нужно найти самый похожий String в Array,что-то типа:

const arr = ["toster","tester","tescer"] 
const str = "tescor"
compare(arr,str) /// return "tescer"

Можно ли это сделать,если да то как?


Ответы (2 шт):

Автор решения: nörbörnën

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

Классическим подходом является вычисление расстояния Левенштейна.

Расстояние Левенштейна (редакционное расстояние, дистанция редактирования) — метрика, измеряющая разность между двумя последовательностями символов. Она определяется как минимальное количество односимвольных операций (а именно вставки, удаления, замены), необходимых для превращения одной последовательности символов в другую. В общем случае, операциям, используемым в этом преобразовании, можно назначить разные цены. Широко используется в теории информации и компьютерной лингвистике.

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
<- концерт в омске
→ Ссылка
Автор решения: KristalkillPlay

Я нашёл немного больше подходящею либу: 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'
→ Ссылка