使用javascript在日常聊天中的string逻辑

我为Telegram Bot创build了一个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?') } } 

但是,如果文本包含在string中的某个地方呢? 当然,我会为数十亿个案例提供数十个条件。 写这种逻辑会很累人。

我的问题是 – 有没有其他优雅的方式来做到这一点? 我真的不知道关键字谷歌这…

你正在寻找的概念是自然语言处理 ,是一个非常广泛的领域。 完整的NLP是非常复杂和复杂的,有各种各样的问题。

我build议从一个简单得多的解决scheme开始,把你的意见分解成单​​词。 你可以使用String.prototype.split方法做一些调整。 过滤掉你不关心的令牌,不要参与命令,比如“the”,“a”,“an”。 拿其余的令牌,寻找否定(“不”,“不”)和关键字。 如果您有两个字的命令,您可能需要组合相邻的令牌。

这可能看起来像这样:

 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 } } 

这不是一个完整的解决scheme:你最终想要通过一个真正的标记器,甚至可能是一个完整的parsing器来运行string,并可能希望使用规则引擎来简化逻辑。

如果您可以限制需要了解的input(数量有限的句子forms和名词/动词),则可以使用简单的parsing器和几条规则来处理大多数命令。 执行一个可预测的句子结构与文章删除将使你的生活容易。

你也可以拿上面的例子,用白名单replacefilter(只包含已知的单词)。 这会给你带来一小部分已知的标记,但是会引入剥去有用的单词和误解命令的可能性,所以你应该在运行之前和用户确认一下。

如果你真的想分析和理解用自然语言expression的句子,你应该看看自然语言处理的主题。 这通常是通过训练某种neural network来“理解”不同的句子变体(aka机器学习)来完成的,因为指定语言的所有不同的句法和语义规则似乎是一项压倒一切的任务。

如果这些句子的变化量是有限的,那么你可以用常用的词组合的forms来指定一些规则,甚至在最简单的情况下,甚至可能会用正则expression式。