我想知道 NLU 可以使用哪些算法?
例如,假设我想启动一个程序,我有这些句子
"Let us start"
"Let him start"
显然,第一句话应该启动程序,但第二句话不应该启动(因为它没有意义)。
现在,我正在使用斯坦福大学的 NLP API 并实现了 TokenRegexAnnotator 类:
CoreMapExpressionExtractor<MatchedExpression> extractor = CoreMapExpressionExtractor.createExtractorFromFile(env, "tr.txt");
所以我的代码“知道”“Start”应该做什么,也就是说,“Start”应该触发/启动程序。但“Start”可以与任何内容一起使用,例如“Start the car”。在这种情况下,我不想“启动”程序,因为这句话是关于启动汽车,而不是程序。为了解决这个问题,我使用了斯坦福大学的 CollapsedDependencyAnnotation 类:
SemanticGraph dependencies = s.get(CollapsedDependenciesAnnotation.class);
Iterable<SemanticGraphEdge> edge_set = dependencies.edgeIterable();
我使用 nsubj
依赖项来查看主语是否是 PRP
(代词),因为我希望程序仅在主语是 PRP 时启动
。所以当我在程序中输入“让我们开始”这句话时,程序就启动了。然而,当我输入“启动汽车”这句话时,程序没有启动。一切运行良好...
但是当我输入“让他开始”这句话时,程序也会启动(如上所述)。 (它开始是因为“他”也是一个代词)。我不希望程序在输入这句话时启动(因为“让他启动”与启动程序无关)。那么程序如何知道这一点呢?我可以做什么来解决这个问题?是否有算法可以让计算机区分“让我们开始”和“让他开始”?
关于如何解决这个问题有什么想法吗?
谢谢!
(我希望我说得清楚)
最佳答案
Stanford CoreNLP 可以帮助您的一种方式是其 TokensRegex 功能。使用此工具,您可以编写显式模式,然后在输入文本中标记它们。然后您的代码可以根据某些模式的存在使用react。
以下是一些包含更多信息的链接:
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...
显然,您可以组合这些规则并使它们变得越来越复杂。但我认为一种直接的方法是考虑人们可能表达他们想要开始的各种方式,然后用规则来捕捉它。
关于pattern-matching - 自然语言理解算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31844602/