1

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

例如;

“我要注册”

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

所以我会使用 javascript 来处理这个文本indexOf来寻找需要注册

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

但是如果文本包含字符串中的某处怎么办?当然,我会为无数个案例提供无数个条件。写这种逻辑会很累。

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

4

2 回答 2

2

您正在寻找的概念是自然语言处理,是一个非常广泛的领域。完整的 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
  }
}

这不是一个完整的解决方案:您最终会希望通过真正的分词器甚至可能是完整的解析器来运行字符串,并且可能希望使用规则引擎来简化逻辑。

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

您也可以采用上面的示例并将过滤器替换为白名单(仅包括已知的单词)。这会给您留下一小部分已知标记,但会引入删除有用词和误解命令的可能性,因此您应该在运行任何内容之前与用户确认。

于 2015-08-14T16:31:18.580 回答
1

如果你真的想解析和理解用自然语言表达的句子,你应该研究自然语言处理这个话题。这通常是通过某种经过训练以“理解”句子的不同变体(也称为机器学习)的神经网络来完成的,因为指定语言的所有不同句法和语义规则似乎是一项艰巨的任务。

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

于 2015-08-14T16:32:27.827 回答