使用 python 聚类字符串的最佳方法

Best way for clustering strings using python

我有 3200000 个字符串(字母表的所有可能组合 = 'ACDEFGHIKLMNPQRSTVWY')。 数据小例子:

['AAAAA', 'AAAAC', 'AAAAD', 'AAAAE', 'AAAAF', 'AAAAG', 'AAAAH',
 'AAAAI', 'AAAAK', 'AAAAL', 'AAAAM', 'AAAAN', 'AAAAP', 'AAAAQ',
 'AAAAR', 'AAAAS', 'AAAAT', 'AAAAV', 'AAAAW', 'AAAAY', 'AAACA',
 'AAACC', 'AAACD', 'AAACE', 'AAACF', 'AAACG', 'AAACH', 'AAACI',
 'AAACK', 'AAACL', 'AAACM', 'AAACN', 'AAACP', 'AAACQ', 'AAACR',
 'AAACS', 'AAACT', 'AAACV', 'AAACW', 'AAACY'...]

我用这段代码来构造小字符串的大列表。

def get_all_possible_kmers(alphabet, k):
    return [''.join(char) for char in itertools.product(alphabet, repeat=k)]

我的意图是将所有字符串聚集成 shared/similar 个字符组合的组,即那些是单个字符串的排列。会有不同的组,例如: a1b1c1d1e1 , a1b1c1d2 , a1b2c2 .... a5 。每个集群都必须包含 a1b4、b1a4、a1c4 等组合。 因此,每个集群将包括所有字符串,这些字符串是给定字符串组合的排列,例如abbbb、babbb 等 我可以使用任何 python 工具来进行这种聚类吗? 我在考虑使用某种距离度量,如汉明距离或 levenshtein 距离。

你们有什么适合开始的方向吗?

谢谢你的时间和知识。

保罗

您可以使用 collections.Counter 生成簇哈希并更新字典中的集合。

例如:

from collections import Counter, defaultdict

clusters = defaultdict(set)
for item in get_all_possible_kmers(alphabet, k):
    clusters[str(Counter(item))].add(item)

您还可以将 str(Counter(item)) 格式化为您需要的格式 (a1b4...)

此外,您可以通过在获得下一个 kmer 时更新聚类来简化计算。