使用 javascript 的日常聊天中的字符串逻辑

String logic in everyday chat using javascript

我正在为 Telegram Bot 构建 AI,目前我正在尝试像人类一样处理文本并响应用户。

例如;

"I want to register"

作为人类,我们理解用户想要注册。

所以我会使用 javascript 的 indexOf 来处理此文本以查找 wantregister

var user_text = message.text;
if (user_text.indexOf('want') >= 0) {
    if (user_text.indexOf('register') >= 0) {
        console.log('He wants to register?')
    }
}

但是如果文本在字符串的某处包含 而不是 怎么办?当然,对于无数个案例,我会有无数个条件。写这种逻辑会很累

我的问题是 — 还有其他优雅的方法可以做到这一点吗?我真的不知道 Google 这个关键字...

您要查找的概念是 natural language processing,这是一个非常广泛的领域。 Full NLP非常的复杂,各种问题。

我建议从一个更简单的解决方案开始,将您的输入拆分为单词。您可以使用 String.prototype.split method 进行一些调整来做到这一点。过滤掉您不关心且对命令没有贡献的标记,例如 "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
  }
}

这不是一个完整的解决方案:您最终会希望 运行 字符串通过一个真正的分词器,甚至可能 a full parser, and may want to employ a rule engine 来简化逻辑。

如果你能限制你需要理解的输入(有限数量的句子形式和 nouns/verbs),你可能只使用一个简单的解析器和一些规则来处理大多数命令。在移除冠词的情况下强制执行可预测的句子结构将使您的生活 更轻松。

您也可以采用上面的示例,将过滤器替换为白名单(只包括已知的词)。这会给您留下一小组已知的标记,但会带来剥离有用词和误解命令的可能性,因此您应该在 运行 进行任何操作之前与用户确认。

如果你真的想解析和理解用自然语言表达的句子,你应该看看natural language processing的主题。这通常是通过某种神经网络完成的 "understand" 句子的不同变体(也称为机器学习),因为指定语言的所有不同句法和语义规则似乎是一项艰巨的任务。

但是如果这些句子的变体数量有限,那么您可以以常用词组合的形式指定一些规则,在最简单的情况下甚至可能使用正则表达式。