【问题标题】:Create a user assistant using NLP使用 NLP 创建用户助理
【发布时间】:2015-12-22 14:20:14
【问题描述】:

我在 Coursera 上学习名为“自然语言处理”的课程,虽然课程内容丰富,但我想知道所提供的内容是否符合我的要求。

基本上我想实现一个文本版本Cortana 或 Siri 现在作为一个项目,即用户可以在其中以自然语言为计算机输入命令,这些命令将被处理并翻译成适当的操作系统命令。我的问题是

  • 在处理语音之后,上述应用程序的一般步骤顺序是什么?他们是标记文本然后解析它,还是有其他方法?

  • 它属于 NLP 的哪个应用程序?有人可以引用我的一些好的资源吗?我唯一的疑问是,我现在所遵循的,是否会对我的目标起到任何重要作用?
  • 【问题讨论】:

    • 嗯,这并不容易,因为它涉及的不仅仅是基于文本的 NLP,它还涉及语音和许多东西,你实际上是在创建一个机器人,请参阅docs.google.com/presentation/d/…

    标签: machine-learning nlp artificial-intelligence linguistics


    【解决方案1】:

    您想要创建的内容可以被认为是一个受到严格限制的聊天机器人,除非您不是试图与用户进行一般性对话,而是处理特定的自然语言输入并将其映射到特定的命令或操作。

    本质上,您需要一种工具,可以对各种用户输入进行模式匹配,提取或至少识别各种重要的主题或主题元素,然后决定如何处理这些数据。

    我不会对自然语言处理进行抽象讨论,而是提出建议。 使用 ChatScript。它是一个免费的开源工具,用于创建最近在 Loebner 聊天机器人比赛中获得第一名的聊天机器人,过去曾多次获奖:

    http://chatscript.sourceforge.net/

    该工具是用 C++ 编写的,但您无需接触源代码即可创建 NLP 应用程序;只需使用该工具提供的脚本语言。虽然最初是为聊天机器人编写的,但它已扩展为一个非常对程序员友好的工具,用于执行任何类型的 NLP 应用程序。

    最重要的是,您不受工具理念的限制或工具提供的框架的限制。它具有大多数脚本语言的所有功能,因此您不会发现自己在完成应用程序的过程中走了很长一段路,只是在最后一英里发现了一些压倒性的限制,从而使您的应用程序失败或至少严重削弱了它。

    它还包括大量本体,可以显着启动您的开发工作,并且它的内置预处理器进行词性解析,输入一致性 以及许多其他对编写脚本至关重要的任务,这些脚本可以很容易地泛化以处理用户输入的巨大变化。它还具有与 WordNet 同义词集数据库的完整接口。 ChatScript 中还有许多其他重要的特性可以让 NLP 开发变得更加容易,这里就不一一列举了。它可以在 Linux 或 Windows 上作为可以使用 TCP-IP 套接字连接访问的服务器运行。

    以下是一些 ChatScript 脚本代码的小而过于简单的示例:

    # Define the list of available devices in the user's household.
    concept: ~available_devices( green_kitchen_lamp stove radio )
    
    #! Turn on the green kitchen lamp.
    #! Turn off that damn radio!
    u: ( turn _[ on off ] *~2 _~available_devices )
        # Save off the desired action found in the user's input.  ON or OFF.
        $action = _0
    
        # Save off the name of the device the user wants to turn on or off.
        $target_device = _1
    
        # Launch the utility that turns devices on and off.
        ^system( devicemanager $action $target_device )
    

    以上是典型的 ChatScript 规则。你的应用会有很多这样的规则。这条规则是寻找来自用户的命令来打开和关闭房子里的各种设备。 # 字符表示一行是注释。以下是规则head的细分:

    • 它由前缀 u: 组成。这告诉 ChatScript 一个规则,该规则接受 statementquestion 格式的用户输入。
    • 它由匹配模式组成,即括号之间的内容。此匹配模式在句子中的任何位置查找单词 turn。接下来,它会寻找所需的用户操作。方括号告诉 ChatScript 匹配单词 on 单词 off。方括号前面的 下划线 告诉 ChatScript 捕获匹配的文本,就像括号在正则表达式中所做的一样。 ~2 标记是范围受限的通配符。它告诉 ChatScript 在词 turn 和名为 ~available_devices 的概念集之间最多允许 2 个插入词。 ~available_devices 是一个概念集。它在规则上方定义,包含用户可以打开和关闭的一组已知设备。概念集名称前面的下划线告诉 ChatScript 捕获用户在其输入中指定的设备名称。

    如果规则模式匹配当前用户输入,它会“触发”,然后规则的body 会执行。该规则正文的内容相当明显,每行上方的 cmets 应该可以帮助您了解该规则在被触发时的作用。它将从用户输入中捕获的所需操作和所需目标设备保存到变量中。 (ChatScript 变量名前面有一个单或双美元符号。)然后它向操作系统发送 shell 以执行一个名为 devicemanager 的程序,该程序实际上将打开 on 或 关闭所需的设备。

    我想指出 ChatScript 的众多功能之一,这些功能使其成为强大的工业级 NLP 工具。如果您查看规则上方,您会看到两个句子,前面有一个由字符 #! 组成的字符串。这些不是 cmets,而是验证句。您可以在 verify 模式下运行 ChatScript。在 verify 模式下,它会在你的脚本中找到所有的验证语句。然后它会将每个验证语句应用到紧随其后的规则。如果规则模式与验证语句不匹配,则会将错误消息写入日志文件。这使得每个验证语句都成为一个很小的、易于实现的单元测试。因此,稍后当您对脚本进行更改时,您可以在 verify 模式下运行 ChatScript 并查看是否破坏了任何内容。

    【讨论】: