c++ - 解析自然语言

标签 c++ string artificial-intelligence

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

设“字符串”为 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/

相关文章:

c++ 找到了一个关于拆分字符串的例子,试图弄清楚为什么改变它会改变结果

ruby - 获取名字并删除字符串中的其余部分

c# - 按大写字母拆分字符串(不包括带连字符的单词)

artificial-intelligence - 如何识别任意神经网络中的循环连接

artificial-intelligence - 最佳优先搜索是最优和完整的吗?

c++ - 如何获得忘记算术运算的警告?

c++ - Win32代码异常

java - 交织字符串

artificial-intelligence - 如何编写人工神经网络(井字游戏)?

c++ - STL 容器和内存管理——对象列表与对象指针列表