解析自然语言的最有效方法是什么?
设“字符串”为 map<string, void (*func)(int,char**)>
包含字符串,例如:
Set the alarm for *.
Call *.
Get me an * at * for *.
及其对应的函数。现在假设“输入”是一个 string
包含像这样的句子:
Call David.
如何实现 parse
等功能这将采用“输入”并将其与 map 中的字符串之一匹配。然后调用其相应的函数,将包含所有通配符(* 在字符串中)的 argc 和 argv 传递给它。实现此类功能的最有效方法是什么?
最佳答案
不确定为什么这个问题遭到否决。它适定且不平凡。
有很多学术解析方法,这些方法主要用于退化语法。 “自然语言”也许不是一个定义明确的术语,自然语言确实有一些歧义,但这种受限的子集没有问题。
在这个具体的例子中,我们看到不同的生产规则(映射条目)并不相互模糊。事实上,第一个标记足以消除歧义。由于 std::map
已排序,我们可以高效地搜索该标记。
因此,我们只需要导出替换。同样,我们将忽略退化的情况。没有人会为 "Get me an at at for at
."烦恼,即使它解析明确。
相反,对于替换,您只需收集 token ,直到获得预期的下一个 token 。 Get me an * at * for *.
表示第一个 *
获取所有标记到 at
,第二个 *
收集到 for
的 token ,最后的 *
得到所有剩余的 token 。
您会发现不需要回溯。如果解析失败,则根本没有匹配项。
关于c++ - 解析自然语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45586245/