我想知道我能为NLU使用什么算法?
例如,假设我想启动一个程序,我有以下几个句子
“让我们开始” “让他开始”
显然,第一句应该开始程序,而不是第二句(因为它没有意义)。
现在,我正在使用斯坦福的NLP并实现了TokenRegexAnnotator类:
CoreMapExpressionExtractor<MatchedExpression> extractor = CoreMapExpressionExtractor.createExtractorFromFile(env, "tr.txt");所以我的代码“知道”"Start“应该做什么,也就是说,"Start”应该触发/启动程序。但是“开始”可以和任何东西一起使用,比如“发动汽车”。在这种情况下,我不想“启动”程序,因为句子是关于启动一辆汽车,而不是程序。为了解决这个问题,我使用了斯坦福的CollapsedDependenciesAnnotation类:
SemanticGraph dependencies = s.get(CollapsedDependenciesAnnotation.class);
Iterable<SemanticGraphEdge> edge_set = dependencies.edgeIterable();我使用nsubj依赖项来查看主题是否是PRP (代词),因为我希望程序只有在主题为PRP时才能启动。所以当我在我的程序中输入“让我们开始”这个句子时,程序就开始了。然而,当我输入“启动汽车”这个句子时,程序没有启动。一切顺利..。
但是当我输入句子“让他开始”(如上所述)时,程序也会启动。(开头是因为他也是代名词)。当我输入这个句子时,我不希望程序开始(因为“让他开始”与启动程序没有任何关系)。那么程序怎么会知道这个呢?我能做些什么来解决这个问题?是否有算法可以让计算机区分“让我们开始”和“让他开始”?
对于如何解决这个问题,有什么想法吗?
谢谢!
(我希望我说得很清楚)
发布于 2015-08-06 23:21:47
斯坦福大学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...显然,你可以把这些规则结合起来,使它们变得越来越复杂。但我认为,一种直截了当的方法是考虑各种表达方式,他们想要开始,然后用规则来捕捉这一点。
发布于 2015-08-06 12:14:12
我有一个快速的解决方案,如果您可以使用在线API,您可以很容易地通过Wit的cloud:http://wit.ai/来实现这一点。您所做的只是为您的命令创建意图,并指定您想要提取的数据,这样就可以了。否则,如果您不这样做,那么您将不得不自己编写算法来执行http://wit.ai/所做的事情,这正是我在我的个人项目中所做的,因为我想要一个独立的系统,即不使用云API。作为一个提示,该算法使用TokensRegex查找TokenSequencePatterns。
https://stackoverflow.com/questions/31844602
复制相似问题