Равномерно разделить строки на подстроки
Есть список строк, состоящий из цифр. Как распределить эти строки на достаточно равномерные классы/кластеры? Класс -- это какая-то подстрока от начала строки. Чем "уже" класс, тем больше длина его подстроки.
Объясню на примере:
['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 шт):
Постройте префиксное дерево со значениями = частоте встречаемости