根据2个(理想情况下推广到n个)任意分组规则对字母字符串列表进行聚类?
Posted
技术标签:
【中文标题】根据2个(理想情况下推广到n个)任意分组规则对字母字符串列表进行聚类?【英文标题】:Clustering of a list of strings of letters according to 2 (and ideally generalized to n) arbitrary grouping rules? 【发布时间】:2019-08-14 02:19:32 【问题描述】:我想根据包含 n 个给定集合的任何/所有/无字母,对 n 个组中的一组可变长度的字符串(字母)进行排序。
例如,在这里我尝试使用以下规则对 2 个组中的字母“A、B、P、Q、X”的所有组合进行排序:组 1 必须包含“A、P”的所有/任何一个(但不是 'B,Q'),group2 必须包括所有/任何 '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, some-2/none-1,all-2/none-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】:K-means 适用于多元连续数据,聚类并不试图建立平衡的组。
你应该考虑的是使用排序。
定义一个评分函数。例如,给每个“好”字母 +1,给每个“坏”字母 -1,如果是纯字母,则奖励 +-100。
然后根据这个分数对单词进行排序。
【讨论】:
如果我想将字符串分成 3 组,这种方法会起作用吗?以上是关于根据2个(理想情况下推广到n个)任意分组规则对字母字符串列表进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章