根据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个)任意分组规则对字母字符串列表进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章

微信通讯录分组/好友排序有啥规则?

python小练习-对序列分组2

按周对多个特征进行聚类

P1680 奇怪的分组(组合数+逆元)

哈希查找

Tidyverse:过滤分组数据框中的 n 个最大组