首页 > 解决方案 > 逐词比较两个句子并返回考虑不同词形的词匹配数

问题描述

感谢Nina,我有一个代码可以逐字比较两个句子并返回单词匹配的数量,如下所示:

function includeWords(wanted, seen) {
    var wantedMap = wanted.split(/\s+/).reduce((m, s) => m.set(s, (m.get(s) || 0) + 1), new Map),
        wantedArray = Array.from(wantedMap.keys()),
        count = 0;

    seen.split(/\s+/)
        .forEach(s => {
            var key = wantedArray.find(t => s === t || s.length > 3 && t.length > 3 && (s.startsWith(t) || t.startsWith(s)));
            if (!wantedMap.get(key)) return;
            console.log(s, key)
            ++count;
            wantedMap.set(key, wantedMap.get(key) - 1);
        });

    return count;
}

let matches = includeWords('i was sent to earth to protect you introduced', 'they\'re were protecting him i knew that i was aware introducing');

console.log('Matched words: ' + matches);

代码运行良好,但仍然存在一个问题:

如果我们也想为introducedand返回一个匹配introducing项怎么办?

标签: javascript

解决方案


如果您希望程序将“介绍”和“介绍”这两个词视为匹配,则相当于“模糊”匹配(非二进制逻辑)。一种简单的方法需要更多的代码,其算法可能类似于

  1. 取 2 个你想匹配的词,标记成有序的字母列表
  2. 比较各个字母的位置,即匹配 a[0]==b[0]?a[1]==b[1] 其中 a[0] 表示第一个单词的第一个字母, b[0] 表示第一个标记化的字母/字符潜在匹配候选
  3. 保留此类位置匹配的滚动数字计数。在这种情况下,它是 8(介绍)。
  4. 除以 a = 8/9 的字长称之为 f
  5. 除以 b = 8/11 的字长称之为 g

  6. 提供一个阈值,超过该阈值程序将认为匹配。例如。如果您在 f 和 g 中说出任何高于 70% 的内容都可以视为匹配 - 中提琴,您有答案!

请注意,还需要进行一些规范化以防止低长度单词成为误报。您可以添加一个约束,即上述计算适用于至少有 5 个字母的单词(或类似的东西!

希望这可以帮助!!问候, SR


推荐阅读