У меня есть коллекция деревьев, узлы которых помечены (но не однозначно). В частности, деревья взяты из набора проанализированных предложений (см. http://en.wikipedia.org/wiki/Treebank). Я хочу извлечь наиболее общие поддеревья из коллекции - производительность еще не проблема. Я был бы благодарен за алгоритмы (в идеале Java) или указатели на инструменты, которые делают это для treebanks. Обратите внимание, что порядок дочерних узлов важен.Поиск наиболее частых поддеревьев в коллекции деревьев (синтаксический анализ)
EDIT @mjv. Мы работаем в ограниченном домене (химии), который имеет стилизованный язык, поэтому разновидность деревьев не огромна - вероятно, подобна детским читателям. Простой древо «кошка сидела на коврике».
<sentence>
<nounPhrase>
<article/>
<noun/>
</nounPhrase>
<verbPhrase>
<verb/>
<prepositionPhrase>
<preposition/>
<nounPhrase>
<article/>
<noun/>
</nounPhrase>
</prepositionPhrase>
</verbPhrase>
</sentence>
Здесь предложение содержит два идентичных частичные из речи поддерев (фактические лексемы «кошки». «Мат» не важны в согласовании). Таким образом, алгоритм должен будет обнаружить это. Обратите внимание, что не все nounPhrases одинаковы - «большая черная кошка» может быть:
<nounPhrase>
<article/>
<adjective/>
<adjective/>
<noun/>
</nounPhrase>
Длина предложений будет больше - от 15 до 30 узлов. Я ожидал получить полезные результаты от 1000 деревьев. Если это не займет больше дня или около того, это приемлемо.
Очевидно, что чем короче дерево, тем чаще происходит nounPhrase.
EDIT Если это нужно решить, сглаживая дерево, я думаю, что это будет связано с самой длинной общей подстрокой, а не самой длинной общей последовательностью. Но обратите внимание, что я не обязательно хочу самого длинного - мне нужен список всех тех, кто достаточно длинный, чтобы быть «интересным» (критерий еще предстоит решить).
Питер, можете ли вы дать указание порядка величины для различных измерений проблемы: приблизительное количество деревьев в коллекции; количество узлов в среднем (и в большом/максимальном) дереве, ожидание размера самой длинной, относительно частая последовательность поддерева и т. д. Причина этого в том, что некоторые решения/алгоритмы могут иметь большие накладные расходы для настройки вещей но следует учитывать, если количество деревьев и/или размер деревьев значительны. – mjv
Это, безусловно, не может быть сопоставлено с проблемой самой большой общей подстроки. Некоторый данный nounPhrase может быть экземпляром какого-либо другого типа дерева nounPrase, даже если он содержит дополнительные узлы (скажем, прилагательные), отсутствующие в исходном. Это будет соответствовать определению проблемы. См. Мой ответ ниже для общего решения этой проблемы. – sds