我在编码/ JavaScript方面并不是真正的高级,所以我雇了一个人来编写一个功能,该功能应该检查SMS消息(在名为Twilio的Web服务中),并确定它是否包含肯定或否定词。
他写了下面的代码。但是,问题在于此代码仅检测到子字符串,而不检测到单词。
在这种情况下,“ No”和“ Nowhere”或“ Yes”和“ Yesterday”一词之间没有区别。因此,我需要它仅检查单词,而不仅仅是字母。
有人可以帮我吗?
这是代码:
var event = {
Body: 'this is a test with some words'
};
var str = event.Body.toLowerCase();
var positive_pattern = ['yes', 'yeah', 'sure', 'of course', 'yup', 'i do', 'i have', 'certainly', 'yep', 'you bet'];
var negative_pattern = ['no', 'nope', 'stop'];
function contains(target, pattern) {
var value = 0;
pattern.forEach(function(word) {
value = value + target.includes(word);
});
return (value > 0);
}
var positive = contains(str, positive_pattern);
var negative = contains(str, negative_pattern);
console.log({
positive,
negative
});
callback = (_, msg) => console.log(msg);
if (positive === true && negative === false)
callback(null, 'positive');
else if (positive === false && negative === true)
callback(null, 'negative');
else if (positive === true && negative === true)
callback(null, 'negative');
else if (positive === false && negative === false)
callback(null, 'unknown');
答案 0 :(得分:0)
您可以使用正则表达式单词边界\b
。
function contains(target, pattern) {
var value = 0;
pattern.forEach(function(word) {
value = value + new RegExp("\\b" + word + "\\b")).test(target);
});
return (value > 0);
}
由于只需要匹配一个单词,就可以使用Array#some
。
function contains(target, pattern) {
return pattern.some(word=>new RegExp("\\b" + word + "\\b")).test(target));
}
如果单词可能包含正则表达式元字符,则可以将target
拆分为空白字符,并检查结果数组是否包含每个单词。
function contains(target, pattern){
const parts = target.split(/\s+/);
return pattern.some(word=>parts.includes(word));
}
答案 1 :(得分:0)
我们需要确保整个单词匹配,这可以通过将目标字符串按空格分开来实现。
var positive_pattern = ['yes', 'yeah', 'sure', 'of course', 'yup', 'i do', 'i have', 'certainly', 'yep', 'you bet'];
var negative_pattern = ['no', 'nope', 'stop'];
function contains(target, patterns) {
// at least one match?
return patterns.filter(
word => target.split(/\s+/).includes(word)
).length > 0;
}
function Test(callback, str) {
var positive = contains(str, positive_pattern);
var negative = contains(str, negative_pattern);
if (positive === true && negative === false)
callback(null, 'positive');
else if (positive === false && negative === true)
callback(null, 'negative');
else if (positive === true && negative === true)
callback(null, 'negative');
else if (positive === false && negative === false)
callback(null, 'unknown');
}
const testCallback = (_, msg) => console.log(msg);
const tests = [
'yesterday nowhere', // unknown
'yes', // positive
'yes no yeah', // negative (mixed)
'nope' // negative
];
for (const testString of tests)
Test(testCallback, testString);