首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自然语言理解算法

自然语言理解算法
EN

Stack Overflow用户
提问于 2015-08-05 23:46:08
回答 2查看 1.9K关注 0票数 2

我想知道我能为NLU使用什么算法?

例如,假设我想启动一个程序,我有以下几个句子

“让我们开始” “让他开始”

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

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

代码语言:javascript
复制
CoreMapExpressionExtractor<MatchedExpression> extractor = CoreMapExpressionExtractor.createExtractorFromFile(env, "tr.txt");

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

代码语言:javascript
复制
SemanticGraph dependencies = s.get(CollapsedDependenciesAnnotation.class);
Iterable<SemanticGraphEdge> edge_set = dependencies.edgeIterable();

我使用nsubj依赖项来查看主题是否是PRP (代词),因为我希望程序只有在主题为PRP时才能启动。所以当我在我的程序中输入“让我们开始”这个句子时,程序就开始了。然而,当我输入“启动汽车”这个句子时,程序没有启动。一切顺利..。

但是当我输入句子“让他开始”(如上所述)时,程序也会启动。(开头是因为他也是代名词)。当我输入这个句子时,我不希望程序开始(因为“让他开始”与启动程序没有任何关系)。那么程序怎么会知道这个呢?我能做些什么来解决这个问题?是否有算法可以让计算机区分“让我们开始”和“让他开始”?

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

谢谢!

(我希望我说得很清楚)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-06 23:21:47

斯坦福大学CoreNLP可以帮助你的一个方法是它的TokensRegex功能。使用此工具,您可以编写显式模式,然后在输入文本中标记它们。然后,您的代码可以根据某些模式的存在做出反应。

以下是一些与更多信息的链接:

http://nlp.stanford.edu/software/tokensregex.shtml

http://nlp.stanford.edu/software/regexner/

我建议找出您想要处理的需要明确响应的通用表达式,并建立起来,这样您就可以得到用户输入内容的适当覆盖。

例如:

代码语言:javascript
复制
Let us (start|begin).
(Start|begin) the (program|software)
I'm ready to (start|begin)
etc...

显然,你可以把这些规则结合起来,使它们变得越来越复杂。但我认为,一种直截了当的方法是考虑各种表达方式,他们想要开始,然后用规则来捕捉这一点。

票数 3
EN

Stack Overflow用户

发布于 2015-08-06 12:14:12

我有一个快速的解决方案,如果您可以使用在线API,您可以很容易地通过Wit的cloud:http://wit.ai/来实现这一点。您所做的只是为您的命令创建意图,并指定您想要提取的数据,这样就可以了。否则,如果您不这样做,那么您将不得不自己编写算法来执行http://wit.ai/所做的事情,这正是我在我的个人项目中所做的,因为我想要一个独立的系统,即不使用云API。作为一个提示,该算法使用TokensRegex查找TokenSequencePatterns。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31844602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档