【问题标题】:Algorithms for Natural Language Understanding自然语言理解算法
【发布时间】:2015-10-28 22:37:58
【问题描述】:

我想知道哪些算法可以用于 NLU?

比如说我要启动一个程序,我有这几句话

“让我们开始吧”

“让他开始”

很明显,第一句应该启动程序,而不是第二句(因为它没有意义)。

现在,我正在使用斯坦福的 NLP API 并实现了 TokenRegexAnnotator 类:

CoreMapExpressionExtractor<MatchedExpression> extractor = CoreMapExpressionExtractor.createExtractorFromFile(env, "tr.txt");

所以我的代码“知道”“开始”应该做什么,即“开始”应该触发/启动程序。但是“开始”可以与任何内容一起使用,例如“启动汽车”。在这种情况下,我不想“启动”程序,因为这句话是关于启动汽车,而不是程序。为了解决这个问题,我使用了斯坦福的 CollapsedDependenciesAnnotation 类:

SemanticGraph dependencies = s.get(CollapsedDependenciesAnnotation.class);
Iterable<SemanticGraphEdge> edge_set = dependencies.edgeIterable();

我使用nsubj 依赖项来查看主题是否为PRP(代词),因为我希望程序仅在主题为PRP 时启动。所以当我在程序中输入“让我们开始”这句话时,程序就启动了。但是,当我输入句子“启动汽车”时,程序没有启动。一切正常...

但是当我输入句子“让他开始”时,程序也会启动(如上所述)。 (它开始是因为“他”也是一个代词)。我不希望程序在我输入这句话时启动(因为“让他启动”与启动程序无关)。那么程序如何知道这一点呢?我能做些什么来解决这个问题?是否有算法可以让计算机区分“让我们开始”和“让他开始”?

关于如何解决这个问题的任何想法?

谢谢!

(我希望我很清楚)

【问题讨论】:

    标签: pattern-matching nlp semantics stanford-nlp lexical-analysis


    【解决方案1】:

    Stanford CoreNLP 可以帮助您的一种方式是它的 TokensRegex 功能。使用此工具,您可以编写显式模式,然后在输入文本中标记它们。然后您的代码可以根据某些模式的存在做出反应。

    以下是一些包含更多信息的链接:

    http://nlp.stanford.edu/software/tokensregex.shtml

    http://nlp.stanford.edu/software/regexner/

    我建议您找出您想要处理的、值得明确回应的常见表达方式,并建立起来,以便您可以很好地了解用户输入的内容。

    例如:

    Let us (start|begin).
    (Start|begin) the (program|software)
    I'm ready to (start|begin)
    etc...
    

    显然,您可以将这些规则结合起来,让它们变得越来越复杂。但我认为直接的方法是考虑人们可能表达他们想要开始的各种方式,然后用规则来捕捉它。

    【讨论】:

    • K,非常感谢@stanfordNLPHelp。我正在这样做。但我也将尝试通过所有依赖项来真正“理解”用户的输入:Iterable&lt;SemanticGraphEdge&gt; edge_set = dependencies.edgeIterable();
    • 也许有一个使用规则来捕获常见用户输入的第一层是有意义的,然后如果您的规则没有找到用户输入,您可以在依赖关系树中查找模式。谈到你的具体例子,似乎一个好方法是有一个地图来区分你想要的代词和你不需要的代词,这应该很容易实现。
    • 是的。对不起。我忘了提那个。我就是这么做的。和你说的一样!我在 TokenRegex 中有一堆规则,用于第一、第二和第三人称,然后我正在处理依赖关系。再次,非常感谢!
    【解决方案2】:

    如果您可以使用在线 API,我有一个快速的解决方案,您可以使用 Wit AI 的云 API 轻松实现此目的:http://wit.ai/。您所做的只是为您的命令创建意图并指定您要提取的数据,您就可以开始了。 否则,如果您不是,那么您将不得不自己编写算法来完成 http://wit.ai/ 所做的事情,这就是我最终为我的个人项目所做的事情,因为我想要一个独立的系统,即不使用云 API。作为提示,该算法使用 TokensRegex 来查找 TokenSequencePatterns。

    【讨论】:

    • @ubezOniner。谢谢你。你使用什么算法?有具体的吗?
    • 他们的平台是用 Clojure 编写的,我认为他们在内部开发了自己的 NLP 引擎,因为他们没有这方面的具体细节。 [来源:wit.ai/jobs]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多