javascript - 逐词比较两个句子并返回考虑不同词形的词匹配数
问题描述
感谢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);
代码运行良好,但仍然存在一个问题:
如果我们也想为introduced
and返回一个匹配introducing
项怎么办?
解决方案
如果您希望程序将“介绍”和“介绍”这两个词视为匹配,则相当于“模糊”匹配(非二进制逻辑)。一种简单的方法需要更多的代码,其算法可能类似于
- 取 2 个你想匹配的词,标记成有序的字母列表
- 比较各个字母的位置,即匹配 a[0]==b[0]?a[1]==b[1] 其中 a[0] 表示第一个单词的第一个字母, b[0] 表示第一个标记化的字母/字符潜在匹配候选
- 保留此类位置匹配的滚动数字计数。在这种情况下,它是 8(介绍)。
- 除以 a = 8/9 的字长称之为 f
除以 b = 8/11 的字长称之为 g
提供一个阈值,超过该阈值程序将认为匹配。例如。如果您在 f 和 g 中说出任何高于 70% 的内容都可以视为匹配 - 中提琴,您有答案!
请注意,还需要进行一些规范化以防止低长度单词成为误报。您可以添加一个约束,即上述计算适用于至少有 5 个字母的单词(或类似的东西!
希望这可以帮助!!问候, SR
推荐阅读
- python - 无法使用 xpath 从 href 标记中提取文本
- javascript - 通过 Axios post 发送带有 formdata 的文本数据
- acpi - ACPI的控制方法调用机制
- powershell - 读取日志文件的 PowerShell 脚本中的条件
- c++ - 如何解码 h264 流
- solidity - Module._compile (internal/modules/cjs/loader.js:1063:30)
- python - 如何使用 Class 装饰器包装器?
- ios - UITableView swift上没有出现自定义xib单元格
- docker - 如何在 VSCode 开发容器内外使用 docker-compose 挂载卷?
- apache-kafka - 为什么 Clickhouse 不支持向 kafka 表添加列