Предположим, нам даны данные в полуструктурированном формате в виде дерева. Например, дерево может быть сформировано как действительный документ XML или как действительный документ JSON. Вы можете представить, что это шепелявое S-выражение или (G) алгебраический тип данных в Haskell или Ocaml.
Нам дано большое количество «документов» в древовидной структуре. Наша цель - сгруппировать похожие документы. Под кластеризацией мы подразумеваем способ разделить документы на j групп, так что элементы в каждой выглядят как друг друга.
Я уверен, что есть статьи, в которых описываются подходы, но, поскольку я не очень известен в области ИИ / кластеризации / машинного обучения, я хочу спросить кого-нибудь, кто знает, что искать и где копать.
Мой текущий подход выглядит примерно так:
Но, безусловно, есть подходы лучше. Одна из слабых сторон моего подхода заключается в том, что это будут только деревья кластеров сходства, которые имеют структуру вершины, очень похожую друг на друга. Если сходство присутствует, но встречается дальше по дереву, тогда мой подход, вероятно, не будет работать очень хорошо.
Я полагаю, что есть решения и в полнотекстовом поиске, но я хочу воспользоваться преимуществом полуструктура, присутствующая в данных.
Как предполагается, необходимо определить функцию расстояния между документами. Без этой функции мы не сможем применить алгоритм кластеризации.
На самом деле, возможно, вопрос в самой этой функции расстояния и ее примерах. Я хочу, чтобы документы, в которых элементы рядом с корнем совпадали, были сгруппированы близко друг к другу. Чем дальше мы спускаемся по дереву, тем меньше это имеет значение.
Я хочу кластеризовать трассировку стека программ. Это хорошо сформированные древовидные структуры, в которых функция, близкая к корню, является внутренней функцией, которая дает сбой. Мне нужна функция приличного расстояния между трассировками стека, которая, вероятно, возникает из-за того, что в коде произошло то же событие.