【问题标题】:Syntax discovery, or, sentence tree builder语法发现或句子树构建器
【发布时间】:2011-01-10 20:09:34
【问题描述】:

我通常很擅长算法,但我在这里有一个非常抽象的问题,这可能是某人在某个地方的博士项目,并且接近于 NP 完整性。但也许这是一个比我想象的更常见的问题。

我有一个包含 25000 个字符串的列表,是使用一堆下拉列表和文本字段创建的。所以,为了简化讨论,假设这是,呃,单向图:

{我的猫/我的狗} {小猫,小狗}

所以,这就像一个树形结构,它的 4 条路径代表 4 个可能的句子。

如何从(可能不完整的)句子列表中对树结构进行逆向工程?

所以从
我的猫生了小猫
我的猫有小狗
我的狗生了小猫
, 您仍然可以重新创建原始语法树。

显然有 25000 个字符串,这需要一段时间。但是有没有软件可以做到这一点?或者,这是一个足够普遍的问题,是否有已知的算法可以做到这一点?

本质上它看起来像是一个正则表达式解析器,但我不知道从哪里开始。我在工作中处理这个问题,每次我发现一个新模式时,我都会自己分析句子来解析另外 500 条左右。但是我认为如果我有树结构,我可以做到剁剁。

有什么想法吗? 谢谢

【问题讨论】:

  • 如果它不完整,我对人工智能的了解还不够,无法弄清楚它如何重建缺失的链接。从您给出的示例中,尚不清楚狗是否可以生小狗-除非它们有一个相同的孩子,否则它们的所有孩子都相同?规则是什么,这是如何表现的?
  • 如果它不完整,你怎么知道其中有 "had" 这个词的 任何 句子并不指向那个特定的 “had” - 节点,并且证明它的其余句子不只是缺失?
  • 如果你不能容忍任何误报,这显然是不可能的。即使可以,在我看来,您也必须为任何类型的语法发现算法提供反例。否则,很容易制作一个过于接受的语法 - 例如,在您的情况下,/(My|Cat|Dog|had|kittens|puppies)* 或就此而言只是 /.*/

标签: algorithm graph


【解决方案1】:

templatemaker 对你来说是朝着正确方向迈出的一步吗?它的目标是推断出格式相似的字符串背后的模板,稍后允许您使用此模板从其他字符串中提取数据。

【讨论】:

  • 谢谢,看起来不错。我刚刚意识到,无论使用什么算法 diff 可能也是我正在寻找的。​​span>
  • @djb: templatemaker 使用一种 diff 的超集 - 即相同的最长公共子串构建块
【解决方案2】:

但也许这是一个比我想象的更常见的问题。

我相信这被称为grammar inference or grammar induction

【讨论】:

    【解决方案3】:

    这可能属于学习有限自动机的标题,在这种情况下,这确实是一个难题,至少在该领域的标准假设下是这样。但是,我怀疑您的情况比大多数情况更容易,因为您知道机器在开始时处于单个启动状态,如果每个字符串。

    如果查找学习有限自动机太令人沮丧,您可以获取一些用于拟合隐马尔可夫模型的代码,放开它,并希望最好。

    【讨论】:

      【解决方案4】:

      您对正则表达式的直觉可能是正确的。 这是语法归纳的典型设置:induce("find") 一组允许您生成/识别一组字符串的规则

      通常,树是可视化和操作此类规则的良好结构。

      第一个问题是:你的字符串有规律吗? (这个问题的答案并不那么容易,一种可行的方法是尝试通过人工检查来查看推断的语法是否满足您的目标)。 如果您的示例结构的简单性暗示了这种方法,那么您可以采用常规的语法归纳。

      对于一些即用型库,请参阅:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多