我想知道我可以为NLU使用哪些算法?
例如,假设我想开始一个程序,我有这些句子
“让我们开始吧”
“让他开始”
显然,第一句应该启动程序,而不是第二句(因为它没有意义)。
目前,我正在使用Stanford的NLP API并实现了TokenRegexAnnotator类:
for index in indices:
c[index] = c[index - 1]
所以我的代码“知道”“开始”应该做什么,也就是说,“开始”应该触发/启动程序。但“开始”可以用于任何事情,比如“开车”。在这种情况下,我不想“启动”该程序,因为句子是关于启动汽车,而不是程序。为了解决这个问题,我使用了Stanford的CollapsedDependenciesAnnotation类:
CoreMapExpressionExtractor<MatchedExpression> extractor = CoreMapExpressionExtractor.createExtractorFromFile(env, "tr.txt");
我使用SemanticGraph dependencies = s.get(CollapsedDependenciesAnnotation.class);
Iterable<SemanticGraphEdge> edge_set = dependencies.edgeIterable();
依赖关系来查看主题是否是nsubj
(代词),因为我希望程序仅在主题为PRP
时启动。因此,当我在我的程序中输入“让我们开始”的句子时,程序就开始了。然而,当我输入“启动汽车”这句话时,程序没有启动。一切都运作良好......
但是当我输入句子“让他开始”(如上所述)时,程序也会启动。 (它开始是因为“他”也是代名词)。我输入这句话时不希望程序启动(因为“让他开始”与启动程序无关)。那么该计划将如何知道这一点?我该怎么做才能解决这个问题?是否有算法让计算机区分“让我们开始”和“让他开始”?
关于如何解决这个问题的任何想法?
谢谢!
(我希望我很清楚)
答案 0 :(得分:3)
Stanford CoreNLP可以帮助您的一种方式是TokensRegex功能。使用此工具,您可以编写显式模式,然后在输入文本中标记它们。然后您的代码可以根据某些模式的存在做出反应。
以下是一些包含更多信息的链接:
http://nlp.stanford.edu/software/tokensregex.shtml
http://nlp.stanford.edu/software/regexner/
我建议您确定要处理的常用表达式,这些表达式应该得到明确的响应,然后进行构建,以便您对用户输入的内容进行适当的报道。
例如:
<Border Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.ThumbWidth}"
Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.ThumbHeight}">
显然,你可以将这些规则结合起来,使它们变得越来越复杂。但我认为一种直接的方法是考虑人们可能表达的各种方式,然后用规则来捕捉它。
答案 1 :(得分:0)
如果您可以使用在线API,我可以快速找到解决方案,您可以使用Wit AI的云API轻松实现这一目标:http://wit.ai/。您所做的只是为命令创建意图并指定要提取的数据,并且您可以继续使用。 否则,如果你不是,那么你必须自己编写算法来做http://wit.ai/所做的事情,这就是我最终为我的个人项目做的事情,因为我想要一个独立的系统,即不使用云API 。作为抬头,该算法使用TokensRegex来查找TokenSequencePatterns。