Равномерно разделить строки на подстроки

Есть список строк, состоящий из цифр. Как распределить эти строки на достаточно равномерные классы/кластеры? Класс -- это какая-то подстрока от начала строки. Чем "уже" класс, тем больше длина его подстроки.

Объясню на примере:

['123', '124', '125', '1', '2', '1256']

Тут строки с первой цифрой 1 встречаются часто, а с первой цифрой 2 - редко. Поэтому 2 будет отдельным классом, а 1 можно поделить на подклассы, чтобы распределение было более равномерным. Так что результат примерно такой (класс и его элементы):

{
'2': ['2'], 
'125': ['125', '1256'],
'12': ['123', '124'],  # 125 не включается, т.к. у него свой более узкий логически класс = более длинная построка
'1': ['1'] # аналогично тут нет 12 и 125
} 

Задача в том, чтобы вот так вот распределить строки на классы, чтобы количество элементов в каждом классе не сильно отличалось. В примере либо 2, либо 1 элемент, т.е. разница 1, что очень хорошо для тысяч строк из моего датасета. Если бы мы разделили просто на 2 класса 1 и 2, то разница была бы 5 против 1, т.е. 4, что уже хуже, чем 1.

Надо это для равномерного распределения данных для машинного обучения.

Приветствуются любые идеи, алгоритм или Python-код.


Ответы (1 шт):

Автор решения: user437092

Постройте префиксное дерево со значениями = частоте встречаемости

→ Ссылка