我希望将基于任务的口语对话系统作为我项目的一部分来实现。我发现很难为系统构建自然语言理解(NLU)单元。这是用户的话语(话语)被理解的部分。由系统将语音映射到特定动作。这是一个复杂的过程,但如果任何人在构建口语对话系统方面有任何实际经验,那么任何关于如何开始这个问题的想法都会受到高度赞赏。 谢谢!
答案 0 :(得分:3)
这是一个相当广泛的话题,但由于我对这个领域的调查很新,让我分享一下我学到的东西。
通常,第一步是解析句子的语法结构(特别是它的词之间的依赖关系)。这将为您提供如下输出: http://nlp.stanford.edu/software/lex-parser.shtml#Sample
我正在使用这个python包装器连接到Stanford Parser: https://github.com/dasmith/stanford-corenlp-python
第二步,通常是将每个单词映射到“感觉”,执行所谓的词义消歧(WSD)。
一旦你知道每个单词的意义以及它们之间的关系,你就应该能够理解句子并触发所需的动作。
没有开放和免费的系统能够完成所有开箱即用的通用句子。这对口语来说尤其困难。
例如,像Stanford Parser这样的语法分析器通常提供针对报纸文章类型进行培训的语言模型,这与口语有很大不同。您很可能想要训练一种新的语言模型,在训练“树库”中添加您期望在系统中接收的句子类型。 (斯坦福分析师提供这种模型训练师应用程序)。
不幸的是,没有好的通用软件库来制作Word-Sense Disambiguation(WSD)。主要原因是“感官”这个词还没有实际的参考。这个领域的事实上的标准仍然是WordNet,但显然甚至人类在单词和“synset”之间的映射中经常不同意。换句话说,WordNet的含义太精细,无法提供可靠的映射。
通常情况下,您需要建立自己的含义数据库(通常以树形结构),为您的应用程序创建尽可能粗糙的粗粒度。 有许多方法可以将单词映射到如此粗糙的含义,其中最简单但仍然非常有效的是古老的朴素贝叶斯分类器。 我还没有尝试过的另一种方法是使用关于“单词框架”的信息(即某个单词的某些含义与周围的单词有某些关系)。
无论如何,现实是它是一个虽然开放的问题。最初,您应该专注于为特定的子域解决它。