代码之家  ›  专栏  ›  技术社区  ›  peter.murray.rust

在(解析)树集合中查找最频繁的子树

  •  1
  • peter.murray.rust  · 技术社区  · 15 年前

    我有一组树,它们的节点被标记(但不是唯一的)。具体来说,这些树来自一组已解析的句子(请参见 http://en.wikipedia.org/wiki/Treebank )我希望从集合中提取最常见的子树-性能还不是问题。我很感激算法(理想的Java)或指向树库的工具的指针。注意,子节点的顺序很重要。

    编辑 @兆焦耳。我们在一个有限的领域(化学)工作,这个领域有一种风格化的语言,所以树的多样性不是很大——可能与儿童读者相似。“猫坐在垫子上”的简单树。

    <sentence>
      <nounPhrase>
        <article/>
        <noun/>
      </nounPhrase>
      <verbPhrase>
        <verb/>
        <prepositionPhrase>
          <preposition/>
          <nounPhrase>
            <article/>
            <noun/>
          </nounPhrase>
        </prepositionPhrase>
      </verbPhrase>
    </sentence>
    

    这里的句子包含两个相同的词类子树部分(实际的标记“cat”)。Mat“在匹配中并不重要)。所以算法需要检测到这一点。请注意,并非所有的名词短语都相同-“大黑猫”可以是:

          <nounPhrase>
            <article/>
            <adjective/>
            <adjective/>
            <noun/>
          </nounPhrase>
    

    句子的长度将更长——在15到30个节点之间。我希望能从1000棵树上得到有用的结果。如果这不超过一天左右,那是可以接受的。

    显然,树越短越频繁,所以名词短语将非常常见。

    编辑 如果要通过展平树来解决这个问题,那么我认为它与最长的公共子串相关,而不是最长的公共序列。但请注意,我不一定只想要最长的——我想要一个足够长的列表,以便“有趣”(标准尚未决定)。

    4 回复  |  直到 10 年前
        1
  •  3
  •   Pete Kirkham    15 年前

    查找集合中最频繁的子树,创建子树的紧凑形式,然后迭代每个子树,并使用哈希集来计算它们的出现次数。对于一个完美的哈希来说,30个节点太大了——每个节点只有一个比特,您需要这么多来指示它是兄弟还是子节点。

    这个问题不是LCS——最常见的序列与最长的公共子序列无关。最常见的子树是发生最多的子树。

    对于长度为l的n个树(假设包含l个节点的子树的测试等式为o(l)),最坏情况下应为o(n l^2)。

        2
  •  3
  •   Steve Cooper    15 年前

    我认为,虽然你说性能还不是问题,但这是一个NP难题,所以它可能永远都不可能快速实现。如果我理解正确,你可以认为这是 Longest common subsequence 问题是,如果你把你的树平放成一个像

    (nounphrase)(DOWN)(article:the)(adjective:big)(adjective:black)(noun:cat)(UP)
    

    那么你的问题就变成LCS了。

    WiKiBooS实现了LCS的Java实现 here

        3
  •  2
  •   sds    14 年前

    这是计算机科学中的一个众所周知的问题,有有效的解决办法。

    以下是一些相关参考资料:

    安倍晋二,川崎信二,浅田拓也,阿里穆拉平冈,阿里卡瓦集硕,半结构化数据的优化子结构发现,过程控制。第六届欧洲数据库知识发现原则与实践会议(PKDD-2002),Lnai 2431,Springer Verlag,1-14,2002年8月。

    Mohammed J.Zaki,《高效开采森林中的常见树木》,第8届ACM SIGKDD知识发现和数据挖掘国际会议,2002年7月。

    或者,如果您只想快速编码,请点击此处: FREQT (将XML转换为S表达式不应该给您带来太多的问题,而应该留给读者作为练习)

        4
  •  1
  •   Vijay_Huddar    10 年前

    在这种情况下,我发现名为gspan的工具非常有用。可在以下网址免费下载 http://www.cs.ucsb.edu/~xyan/software/gSpan.htm . 它的C++版本与MATLAB接口是AT http://www.nowozin.net/sebastian/gboost/