自然语言理解的算法

时间:2015-08-05 23:46:09

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

我想知道我可以为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时启动。因此,当我在我的程序中输入“让我们开始”的句子时,程序就开始了。然而,当我输入“启动汽车”这句话时,程序没有启动。一切都运作良好......

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

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

谢谢!

(我希望我很清楚)

2 个答案:

答案 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。