自然语言理解算法

Algorithms for Natural Language Understanding

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

比如我要启动一个程序,我有这些语句

"Let us start"

"Let him start"

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

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

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

所以我的代码“知道”“开始”应该做什么,也就是说,“开始”应该 trigger/start 程序。但是“Start”可以和任何东西一起使用,比如“Start the car”。在这种情况下,我不想“启动”程序,因为这句话是关于启动汽车的,而不是程序。为了解决这个问题,我使用了斯坦福大学的 CollapsedDependenciesAnnotation class:

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

我使用 nsubj 依赖项来查看主语是否为 PRP(代词),因为我希望程序仅在主语为 PRP 时启动。所以当我在程序中输入“let us start”这句话时,程序就启动了。但是,当我输入“Start the car”这句话时,程序并没有启动。一切正常...

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

关于如何解决这个问题有什么想法吗?

谢谢!

(希望我说清楚了)

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

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...

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