Ну DOM является древовидной структурой (грубо говоря, частный случай графа). Вопрос в том, как представить этот граф в удобном виде?
В простейшем случае: взять массив из N на N элементов, где N - число элементов DOM, и представить этот граф в виде
матрицы смежности. Ну а сами элементы и их атрибуты можно представить в виде вектора из N элементов, где каждый элемент будет категориальным (название тэга). Если нужно учитывать атрибуты этих тегов, то в векторе из N элементов, элементами сделать другие вектора, которые будут состоять из категориального названия тэга, из каких-нибудь там названий классов, основных атрибутов и т.п. Зависит от того, какие атрибуты считать значимыми и учитывать как ML-фичи, а какие можно проигнорировать.
Ну а сам процесс формирования, это обход DOM-дерева и заполнение соответствующих структур данных.
А ещё, лет 10 назад я делал такое решение:
- фильтровал html, оставлял структуру и значимые для меня атрибуты, остальное откидывал
- заменял контент в тегах и значения атрибутов на некоторые значения по умолчанию (важна была только структура, а не сам контент)
- при обходе такого отфильтрованного DOM брал хеш от html в строковом представлении каждой обойдённой ноды со всеми дочерними элементами, и накапливал частоту встречаемости таких хешей с разных сайтов
В итоге в БД у меня получился список хешей, частота встречаемости и сам html-шаблон из которого этот хеш был сформирован. Но помимо шаблонов я ещё собирал дополнительную инфу, кол-во слов, язык, некоторые значения атрибутов и т.п. Но это уже для более тонкой настройки фильтров.