解析自然语言

时间:2017-08-09 09:07:40

标签: c++ string artificial-intelligence

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

让“strings”成为包含字符串的map<string, void (*func)(int,char**)>,如:

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

及其相应的功能。现在假设“输入”是包含如下句子的string

Call David.

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

1 个答案:

答案 0 :(得分:1)

不确定为什么这个问题得到了一个downvote。这是一个非常重要的问题。

解析有很多学术方法,这些方法主要用于退化语法。 “自然语言”可能不是一个明确定义的术语,自然语言确实有一些模糊性,但这种受约束的子集并不成问题。

在这个具体的例子中,我们看到不同的生产规则(地图条目)不是相互模糊的。实际上,第一个令牌足以消除歧义。由于std::map已排序,我们可以对该令牌进行有效的O(log N)搜索。

因此,我们只需要推导出替换。同样,我们将忽略退化案例。没有人会打扰"Get me an at at at for at。“`,即使它明确地解析。

相反,对于替换,您只需收集令牌,直到获得预期的下一个令牌。 Get me an * at * for *.表示第一个*获取所有令牌最多at,第二个*收集令牌最多for,最后*得到所有剩余的代币。

你看,不需要回溯。如果解析失败,则根本就没有匹配。