【发布时间】:2020-01-20 18:25:56
【问题描述】:
感谢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 和 introducing 怎么办?
【问题讨论】:
-
这很模糊:“introduced”是否匹配“introduction”、“introductory”、“intro”……?都有些什么样的规矩?您是否有一个应被视为“相同”的单词的封闭列表?
-
你可能有一些代码可以检查单词的常见共轭词尾,比如
.*(ed|ing)...但是考虑到英语是多么古怪,我想你最终会得到非常复杂的代码处理所有异常的异常。 -
研究Levenshtein距离/算法
-
考虑到
protecting和protected,在protecting和protected之间有7个字母匹配(考虑字母顺序)......如果我们包含这些单词的一半以上它们的长度与其他单词匹配!!! -
@Dexygen 不是一个坏主意...但它使代码太慢...
标签: javascript