Кластеризация списка строк букв в соответствии с 2 (и идеально обобщенными на n) произвольными правилами группировки? - PullRequest
1 голос
/ 23 марта 2019

Я хочу отсортировать набор строк (букв) переменной длины в n группах, основываясь на включении любых / всех / ни одной буквы из n заданных наборов.

Например, здесь я пытаюсь отсортировать все комбинации букв «A, B, P, Q, X» в 2 группы по следующим правилам: group1 должна включать все / любые из «A, P» ( но не 'B, Q'), группа 2 должна включать все / любые из 'B, Q' (но не 'A, P'). Моя конечная цель - создать список, в котором группы должны быть максимально разделены (например, начало и конец) со строками, не содержащими членов какой-либо группы в середине, за которыми следуют члены обеих групп и гибриды между серединой и крайностями. В идеале порядок будет таким: all-1 / none-2, some-1 / none-2, all-1 / some-2, none-1-2 / some-1-2, all-2 / some-1, некоторые-2 / нет-1, все-2 / нет-1.

labels_powerset = ['A','B','P','Q','X',
    'AB','AP','AQ','AX','BP','BQ','BX','PQ','PX','QX',
    'ABP','ABQ','ABX','APQ','APX','AQX','BPQ','BPX','BQX','PQX',
    'ABPQ','ABPX','ABQX','APQX','BPQX','ABPQX']

labels_for_order = []

for length in range(1,len(max(labels_powerset,key=len))+1):
    order = [label for label in labels_powerset if len(label)==length]
    labels_for_order.append(order)

group1 = ['A','P']
group2 = ['B','Q']

all1 = [y for y in[[label for label in order if all(x in label for x in group1) and not any(y in label for y in group2)]
        for order in labels_for_order]if y]

any1 = [y for y in[[label for label in order if any(x in label for x in group1) and not all(x in label for x in group1) and not any(y in label for y in group2)]
        for order in labels_for_order]if y]

all2 = [y for y in[[label for label in order if all(x in label for x in group2) and not any(y in label for y in group1)]
        for order in labels_for_order]if y]

any2 = [y for y in[[label for label in order if any(x in label for x in group2) and not all(x in label for x in group2) and not any(y in label for y in group1)]
        for order in labels_for_order]if y]

none = [y for y in[[label for label in order if not any(x in label for x in group1) and not any(y in label for y in group2)]
        for order in labels_for_order]if y]

both = [y for y in[[label for label in order if any(x in label for x in group1) and any(y in label for y in group2)]
        for order in labels_for_order]if y]

both1 = [both[x] for x in range(0,int(len(both)/2))]

both2 = [both[x] for x in range(int(len(both)/2),len(both))]

sorted_labels = flatten(any1+all1+both1+none+both2+all2+any2)

Цель состоит в том, чтобы список был как можно более симметричным с точки зрения членства и длины строк.

Я довольно новичок в кодировании и кое-что прочитал на k-means, но не могу понять, как применить это к строкам букв.

Как мне сделать это более эффективно и так, чтобы это можно было обобщить на n групп / правил?

1 Ответ

1 голос
/ 24 марта 2019

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

Что вы должны рассмотреть, так это использовать sorting .

Определить функцию оценки. Например, дайте +1 за каждую «хорошую» букву, -1 за каждую «плохую» букву и бонус + -100, если он чистый.

Затем отсортируйте слова на основе этой оценки.

...