Мне нужно сравнить две строки (или массивы) и вернуть их% сходства независимо от их порядка - PullRequest
2 голосов
/ 06 апреля 2019

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

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

Есть ли способ сделать это?

Я пытался что-то сделать с .match () , но, к сожалению, это не сработало.

// these are the variables

let p = 'The lazy dog jumps over the quick brown fox. It barked.';
p = p.toLowerCase();
p = p.replace(/\s/g, '');
p = p.replace('.', '');
p = p.replace('.', '');

let a = 'The quick brown fox jumps over the lazy dog. It barked.';
a = a.toLowerCase();
a = a.replace(/\s/g, '');
a = a.replace('.', '');
a = a.replace('.', '');

let c = 'The quick black ostrich jumps over the lazy dog. It barked.';
c = c.toLowerCase();
c = c.replace(/\s/g, '');
c = c.replace('.', '');
c = c.replace('.', '');

// this is what should happen: 

compare(p,a); // should return 100%
compare(p,c); // should return 72% (if my math is correct)

1 Ответ

1 голос
/ 06 апреля 2019

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

Тогда верните сходство.

function compare(a, b) {
    var count = {}, delta;
    
    a = clean(a);
    b = clean(b);
    
    getCount(a, count, 1);
    getCount(b, count, -1);

    delta = Object.values(count).reduce((s, v) => s + Math.abs(v), 0);
    
    return (b.length - delta) / a.length;
}

function getCount(string, count = {}, inc = 1) {
    Array.from(string).forEach(c => count[c] = (count[c] || 0) + inc);
    return count;
}

const
    clean = s => s.toLowerCase().replace(/[\s.,]+/g, '');

var p = 'The lazy dog jumps over the quick brown fox. It barked.',
    a = 'The quick brown fox jumps over the lazy dog. It barked.',
    c = 'The quick black ostrich jumps over the lazy dog. It barked.';

console.log(compare(p, a));
console.log(compare(p, c));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...