更好的解释用户文本输入的方法

时间:2013-09-07 08:19:30

标签: java android logic nlp

我的应用中有一个文本框,用户可以输入任何内容。我正在创建一个控制器,它根据关键字解释一些命令。

用户可以选择是否设置密码。根据这一点,我的翻译将要么输入密码。

例如,如果设置了密码并且用户输入:“password1 show list”。 解释器在第一个单词中检查密码,然后在命令(show)中检查密码,然后检查参数(列表)。

如果未设置密码,用户输入“show list”并解释员理解。

我目前的代码是:

// 'words' is a String array which contains the user input.

if (passwordEnabled()==true) {

    if (words[0].contentEquals(getPassword())
                    && words[1].contentEquals("show")
                    && words[2].contentEquals("list")) {

        // Perform action

    }
}
else {

    if (words[0].contentEquals("show")
                    && words[1].contentEquals("list")) {

        // Perform action

    }

}

我的问题是,是否有更有效/更好的方法来处理命令?我确信我的做法非常粗糙。

3 个答案:

答案 0 :(得分:2)

如果用户能够记住命令的语法,那么你的方式(或任何基于语法的方法)都可以。

如果您想要了解用户使用不受限制的自然语言表达意图时,您需要执行一些Natural Language Understanding

Wit(http://wit.ai)之类的东西可能会为你完成这项工作。它基于机器学习。它使用用户意图和规范化参数将自由文本句子转换为JSON。

答案 1 :(得分:1)

如果您正在尝试设计基于“语言”的系统,在那里提出命令,您应该根据系统复杂性考虑两种可能的方法:

  • 构建系统的有限自动机。你的if语句是这种结构的最基本形式,但是将它定义为一个实际的自动化,你有状态,命令将你带到另一个状态 - 是一个非常干净和通用的方法。
  • 构建语法+解释器/编译器。将正确的命令定义为语法(+编译器)规则可以更好地表达可能的命令和操作。

当然这些不是交替的解决方案 - 为语言构建语法是一件非常广泛的事情,应该用于解析命令,而有限状态自动化则用作内部存储器和可能行为的定义。

答案 2 :(得分:1)

建立语法或有限自动化是正确的方法,同意。

如果您想要一种简单的方法,可以简化代码:

if (passwordEnabled()) {
    if  (! words.get(0).contentEquals(getPassword()))
    {
        // wrong password
        return;
    }
    words.remove(0); // skip password
}

if (words.get(0).contentEquals("show")
                && words.get(1).contentEquals("list")) {

    // Perform action

}

假设您对ArrayList使用words