【发布时间】:2011-01-10 20:09:34
【问题描述】:
我通常很擅长算法,但我在这里有一个非常抽象的问题,这可能是某人在某个地方的博士项目,并且接近于 NP 完整性。但也许这是一个比我想象的更常见的问题。
我有一个包含 25000 个字符串的列表,是使用一堆下拉列表和文本字段创建的。所以,为了简化讨论,假设这是,呃,单向图:
{我的猫/我的狗} 有 {小猫,小狗}。
所以,这就像一个树形结构,它的 4 条路径代表 4 个可能的句子。
如何从(可能不完整的)句子列表中对树结构进行逆向工程?
即
所以从
我的猫生了小猫
我的猫有小狗
我的狗生了小猫, 您仍然可以重新创建原始语法树。
显然有 25000 个字符串,这需要一段时间。但是有没有软件可以做到这一点?或者,这是一个足够普遍的问题,是否有已知的算法可以做到这一点?
本质上它看起来像是一个正则表达式解析器,但我不知道从哪里开始。我在工作中处理这个问题,每次我发现一个新模式时,我都会自己分析句子来解析另外 500 条左右。但是我认为如果我有树结构,我可以做到剁剁。
有什么想法吗? 谢谢
【问题讨论】:
-
如果它不完整,我对人工智能的了解还不够,无法弄清楚它如何重建缺失的链接。从您给出的示例中,尚不清楚狗是否可以生小狗-除非它们有一个相同的孩子,否则它们的所有孩子都相同?规则是什么,这是如何表现的?
-
如果它不完整,你怎么知道其中有 "had" 这个词的 任何 句子并不指向那个特定的 “had” - 节点,并且证明它的其余句子不只是缺失?
-
如果你不能容忍任何误报,这显然是不可能的。即使可以,在我看来,您也必须为任何类型的语法发现算法提供反例。否则,很容易制作一个过于接受的语法 - 例如,在您的情况下,
/(My|Cat|Dog|had|kittens|puppies)*或就此而言只是/.*/。