2017-08-09 170 views
1

什么是解析自然语言的最有效方式?解析自然语言

令 “串” 是含map<string, void (*func)(int,char**)>字符串如:

Set the alarm for *. 
Call *. 
Get me an * at * for *. 

和它们相应的功能。现在假设“输入”是string包含类似的句子:

Call David. 

如何实现的功能,如parse它会使用“输入”和与之相匹配,以在地图的一个字符串。然后调用其相应的函数,并将argc和argv传递给包含所有通配符的字符串(*中的字符串)。什么是最有效的方式来实现这样的功能?

+1

如果你有一个预定义列表带有固定占位符的命令不是真实的ly是一种自然语言,但更像域特定语言或至多是一种正式语言(谷歌DSL - 域特定语言)。因此,您可以定义一组正则表达式来匹配命令并提取占位符。但是你的问题很容易回答。 – xander

+0

风格评论:既然C++ 11,我们会写'std :: function >)'。 – MSalters

回答

1

不知道为什么这个问题得到了downvote。它是一个非平凡的构思。

解析有很多学术方法,主要是退化语法所需的。 “自然语言”可能不是一个明确定义的术语,而自然语言确实有一些不明确的地方,但是这些受限制的子集并没有问题。

在这个特定的例子中,我们看到不同的生产规则(地图条目)不是相互不明确的。事实上,第一个标记足以消除歧义。而且由于std::map已排序,我们可以对该标记进行高效的O(logN)搜索。

因此,我们只需要导出替换。再次,我们将忽略退化情况。没有人会用"Get me an at at at for at打扰。“`,即使它解析明确。

相反,你只需收集令牌,直到你得到预期的下一个标记替代。Get me an * at * for *.意味着第一个*得到所有令牌高达at,第二*收集令牌高达for,并最终*获取所有剩余的符号。

你看那个不需要回溯。如果解析失败,根本不匹配。