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

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

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

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

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

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

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

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

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

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

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

Точка зрения «сделай один шаг назад»:

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


person I GIVE CRAP ANSWERS    schedule 12.12.2010    source источник
comment
Чтобы выполнить кластеризацию, вам сначала нужно определить функцию расстояния, основанную на том, что, по вашему мнению, похоже друг на друга, что означает...   -  person Victor Nicollet    schedule 12.12.2010
comment
Ах, спасибо. Это определенно точит меч.   -  person I GIVE CRAP ANSWERS    schedule 12.12.2010


Ответы (2)


Учитывая характер вашей проблемы (трассировка стека), я бы свел ее к проблеме сопоставления строк. Представление трассировки стека в виде дерева сопряжено с некоторыми накладными расходами: для каждого элемента в трассировке стека у вас есть только один родитель.

Если сопоставление строк действительно больше подходит для вашей проблемы, вы можете просмотреть свои данные, сопоставить каждый узел с хешем и создать для каждого «документа» его n-граммы.

Пример:

Отображение:

  • Исключение А -> 0
  • Исключение Б -> 1
  • Исключение С -> 2
  • Исключение D -> 3

Док А: 0-1-2 Док Б: 1-2-3

2 грамма для документа А: X0, 01, 12, 2X

2 грамма для документа B: X1, 12, 23, 3X

Используя n-граммы, вы сможете кластеризовать похожие последовательности событий независимо от корневого узла (в этом примере событие 12).

Однако, если вы все еще убеждены, что вам нужны деревья, а не строки, вы должны принять во внимание следующее: найти сходство для деревьев намного сложнее. Вы захотите найти похожие поддеревья, с поддеревьями, которые похожи на большей глубине, что приведет к лучшему показателю сходства. Для этого вам нужно будет обнаружить закрытые поддеревья (поддеревья, которые являются базовыми поддеревьями для деревьев, которые его расширяют). Чего вам не нужно, так это набора данных, содержащего поддеревья, которые встречаются очень редко или присутствуют в каждом обрабатываемом вами документе (что вы получите, если не будете искать частые шаблоны).

Вот несколько советов:

Когда у вас есть частые поддеревья, вы можете использовать их так же, как вы используете n-граммы для кластеризации.

person jvdbogae    schedule 13.12.2010

Здесь вы можете найти документ, который кажется тесно связанным с вашей проблемой .

Из аннотации:

This thesis presents Ixor, a system which collects, stores, and analyzes stack traces in distributed Java systems. When combined with third-party clustering software and adaptive cluster filtering, unusual executions can be identified.

person Dr. belisarius    schedule 13.12.2010