我经常遇到一个问题(在数据分析或人工智能的广泛领域)。但是我不能说出它的名字,可能是因为我没有正式的 CS 背景。请多多包涵,我举两个例子:
想象一下自然语言解析:
The flower eats the cow.
你有一个程序,它接受每个单词,并确定它的类型和它们之间的关系。这句话有两种解读方式:
1) flower (substantive) -- eats (verb) --> cow (object)
使用通常的 SVO 词序,或
2) cow (substantive) -- eats (verb) --> flower (object)
使用更具诗意的世界秩序。该程序将排除其他可能性,例如“flower”作为动词,因为它跟在“the”之后。然后它会对剩余的可能性进行排名:1) 比 2) 具有更自然的词序,因此它得到更多的分数。但包括花不能吃牛的世界知识,2)还是赢了。所以它可能会返回两个假设,并给出 1)30 分和 2)70 分。
然后,它会记住这两个假设并继续解析文本,然后分支。一个分支假设 1),一个分支 2)。如果一个分支达到矛盾,或者排名为~0,则将其丢弃。最后,它再次提出了排名假设,但针对整个文本。
举一个不同的例子,想象一下光学字符识别:
** **
** ** *****
** *******
******* **
* ** **
** **
我可以看看笔画,然后说,确定这是一个“H”。在识别出 H 之后,我注意到它周围有污迹,并给它打了一个稍差的分数。
或者,我可以先运行我的污迹识别,并注意到水平线看起来像一个伪影。删除后,我认出这是ll
or Il
,并给它一些排名。
处理整幅图像后,可以是Hlumination
,lllumination
或Illumination
。使用字典和总排名,我决定它是最后一个。
- 一般问题总是某种解析/理解。例子:
- 自然语言或歧义语言
- 光学字符识别
- 寻找路径
- 处理模棱两可或不完整的用户输入——哪些解释是有意义的,哪些是最合理的?
- 我是递归的。
- 它可以提前退出(当分支/解释没有意义时,或者肯定会以 0 分结束)。所以这可能是某种回溯。
- 考虑到歧义,它会牢记所有选项。
- 它基于底部的简单规则
can_eat(cow, flower) = true
。 - 它保持解释的合理性排名。
- 它在元级别上是递归的:它可以分叉/分支到不同的“世界”,在处理下一部分数据时假设不同的假设。
- 它将个人排名(可能使用贝叶斯概率)转发到相关假设。
- 在实践中,会有方法来训练这个东西,确定排名系数,如果树变得太大,就会有截断。
我不知道这叫什么。有人可能会猜测“决策树”或“递归下降”,但我知道这些术语的含义不同。
我知道 Prolog 可以解决这个简单的案例,比如家谱和找出谁是谁的叔叔。但是您必须在代码中提供所有数据,对于我的现实生活案例来说,这样做似乎不够方便或强大。
我想知道,这个问题叫什么,有解决这个问题的常用策略吗?有没有关于这个话题的好文献?是否有理想的 C(++)、Python 库,你是否可以定义一堆规则,并计算出所有的排名和假设?