您正在寻找的概念是自然语言处理,是一个非常广泛的领域。完整的 NLP 非常复杂和复杂,有各种各样的问题。
我建议从一个更简单的解决方案开始,将您的输入拆分为单词。您可以使用该String.prototype.split
方法进行一些调整。过滤掉您不关心且不参与命令的标记,例如“the”、“a”、“an”。取出剩余的标记,寻找否定(“not”,“don't”)和关键字。如果您有一些两字命令,您可能需要组合相邻的标记。
这可能看起来像:
var user_text = message.text;
var tokens = user_text.split(' '); // split on spaces, very simple "word boundary"
tokens = tokens.map(function (token) {
return token.toLowerCase();
});
var remove = ['the', 'a', 'an'];
tokens = tokens.filter(function (token) {
return remove.indexOf(token) === -1; // if remove array does *not* contain token
});
if (tokens.indexOf('register') !== -1) {
// User wants to register
} else if (tokens.indexOf('enable') !== -1) {
if (tokens.indexOf('not') !== -1) {
// User does not want to enable
} else {
// User does want to enable
}
}
这不是一个完整的解决方案:您最终会希望通过真正的分词器甚至可能是完整的解析器来运行字符串,并且可能希望使用规则引擎来简化逻辑。
如果您可以限制您需要理解的输入(有限数量的句子形式和名词/动词),您可能只需使用带有一些规则的简单解析器来处理大多数命令。在删除文章的情况下强制执行可预测的句子结构将使您的生活更轻松。
您也可以采用上面的示例并将过滤器替换为白名单(仅包括已知的单词)。这会给您留下一小部分已知标记,但会引入删除有用词和误解命令的可能性,因此您应该在运行任何内容之前与用户确认。