2015-08-14 33 views
1

我有点建立一个电报机器人人工智能,目前我正在尝试处理文本并对用户作出响应,就像人类一样。在使用javascript日常聊天中的字符串逻辑

例如;

“我要注册”

据我们了解用户希望注册人。

所以我想处理使用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?') 
    } 
} 

但是,如果文本包含某个字符串中?当然,我会为数十亿个案例提供数十个条件。编写这种逻辑会很累人。

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

回答

2

您正在寻找的概念是natural language processing,是一个非常广泛的领域。完整的NLP非常复杂且复杂,涉及各种问题。

我建议先从一个更简单的解决方案开始,将您的输入分解为单词。你可以使用String.prototype.split method做一些调整。过滤掉你不关心的令牌,不要对命令做出贡献,比如“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 
    } 
} 

这不是一个完整的解决方案:你最终要运行通过一个真实的标记生成器和串甚至可能a full parser,并且可能需要使用a rule engine简化逻辑。

如果您可以限制需要了解的输入(数量有限的句子形式和名词/动词),那么您可以使用一个简单的解析器和几条规则来处理大多数命令。强制一个可预测的句子结构与删除的文章将使您的生活更容易

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

+0

这是一个很好的方向。我喜欢! – rolodex

+0

我也有兴趣在这样的Siri,柯塔娜和谷歌确认并了解我们的命令。就像你所说的那样,我将在命令中向用户确认,并记录文本以让我的程序在下次学习该指令。我会从小开始。再次 感谢您的见解。有价值! – rolodex

1

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

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