Кластеризация данных с древовидной структурой

Предположим, нам даны данные в полуструктурированном формате в виде дерева. Например, дерево может быть сформировано как действительный документ XML или как действительный документ JSON. Вы можете представить, что это шепелявое S-выражение или (G) алгебраический тип данных в Haskell или Ocaml.

Нам дано большое количество «документов» в древовидной структуре. Наша цель - сгруппировать похожие документы. Под кластеризацией мы подразумеваем способ разделить документы на j групп, так что элементы в каждой выглядят как друг друга.

Я уверен, что есть статьи, в которых описываются подходы, но, поскольку я не очень известен в области ИИ / кластеризации / машинного обучения, я хочу спросить кого-нибудь, кто знает, что искать и где копать.

Мой текущий подход выглядит примерно так:

  • Я хочу преобразовать каждый документ в N-мерный вектор, настроенный для кластеризации K-средних.
  • Для этого я рекурсивно прохожу дерево документа и для каждого уровня I вычислить вектор. Если я нахожусь в вершине дерева, я повторяюсь на всех подвершинах, а затем суммирую их векторы. Кроме того, всякий раз, когда я повторяюсь, применяется коэффициент мощности, поэтому он имеет все меньшее и меньшее значение, чем дальше я иду по дереву. Конечный вектор документа - это корень дерева.
  • В зависимости от данных на листе дерева я применяю функцию, которая переводит данные в вектор.

Но, безусловно, есть подходы лучше. Одна из слабых сторон моего подхода заключается в том, что это будут только деревья кластеров сходства, которые имеют структуру вершины, очень похожую друг на друга. Если сходство присутствует, но встречается дальше по дереву, тогда мой подход, вероятно, не будет работать очень хорошо.

Я полагаю, что есть решения и в полнотекстовом поиске, но я хочу воспользоваться преимуществом полуструктура, присутствующая в данных.

Функция расстояния

Как предполагается, необходимо определить функцию расстояния между документами. Без этой функции мы не сможем применить алгоритм кластеризации.

На самом деле, возможно, вопрос в самой этой функции расстояния и ее примерах. Я хочу, чтобы документы, в которых элементы рядом с корнем совпадали, были сгруппированы близко друг к другу. Чем дальше мы спускаемся по дереву, тем меньше это имеет значение.

Точка зрения на один шаг назад:

Я хочу кластеризовать трассировку стека программ. Это хорошо сформированные древовидные структуры, в которых функция, близкая к корню, является внутренней функцией, которая дает сбой. Мне нужна функция приличного расстояния между трассировками стека, которая, вероятно, возникает из-за того, что в коде произошло то же событие.

17
задан I GIVE CRAP ANSWERS 12 December 2010 в 15:35
поделиться