我有一组树,其节点被标记(但不是唯一的)。具体来说,这些树来自一组已解析的句子(参见http://en.wikipedia.org/wiki/Treebank)。我希望从集合中提取最常见的子树——性能(还)不是问题。我会感谢算法(最好是 Java)或指向为树库执行此操作的工具的指针。请注意,子节点的顺序很重要。
编辑@mjv。我们在一个有限的领域(化学)中工作,它有一种程式化的语言,所以树木的种类并不多——可能类似于儿童读者。“猫坐在垫子上”的简单树。
<sentence>
<nounPhrase>
<article/>
<noun/>
</nounPhrase>
<verbPhrase>
<verb/>
<prepositionPhrase>
<preposition/>
<nounPhrase>
<article/>
<noun/>
</nounPhrase>
</prepositionPhrase>
</verbPhrase>
</sentence>
这里句子包含两个相同的词性子树(实际标记“cat”。“mat”在匹配中并不重要)。所以算法需要检测到这一点。请注意,并非所有名词短语都是相同的——“the big black cat”可能是:
<nounPhrase>
<article/>
<adjective/>
<adjective/>
<noun/>
</nounPhrase>
句子的长度会更长——在 15 到 30 个节点之间。我希望从 1000 棵树中获得有用的结果。如果这不会超过一天左右,那是可以接受的。
显然树越短越频繁,所以名词短语会很常见。
编辑如果这要通过展平树来解决,那么我认为它与最长公共子串有关,而不是最长公共序列。但请注意,我不一定只想要最长的 - 我想要一个足够长的列表以“有趣”(标准尚未确定)。