>

현재 고대 언어의 어휘를 공부할 수있는 모듈을 만들려고하고 있는데, 그 때문에 사용자의 답변이 데이터베이스의 답변과 일치하는지 여부를 확인하는 도구가 필요합니다.

이를 구현하고 싶은 방법은 (보다 효율적인 솔루션이 있다면 알려주세요) 문자를 세고 (문구가없는 소문자 문자열 또는 배열 일 것입니다) 유사성의 백분율을 확인하십시오.

이 작업을 수행하는 방법이 있습니까?

로 무언가를 시도했습니다. 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

    같은 문자를 계산할 수 있습니다. 첫 번째는 첨예하지 않고 두 번째는 덧셈을 계산하여 합계의 절대 값을 취합니다.

    그러면 유사성을 반환합니다.

    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));
    
    

관련 자료

  • 이전 Amazon Sagemaker를 통한 텍스트 데이터의 자동 라벨링
  • 다음 c - 동적으로 할당 된 포인터를 pthread에 전달하는 올바른 방법은 무엇입니까