我正在寻找一种能够将内容几乎相同的字符串列表分组的算法。
这是一个列表的例子。总共有5个不同的词。
A = ['first', 'second', 'third']B = ['first', 'forth']C = ['second', 'third']D = ['first', 'third']E = ['first', 'fifth']F = ['fourth', 'fifth']
你可以看到A、C和D有很多共同点,B、E和F也是如此。
我在考虑一种聚类算法,能够将几乎相同的列表分配到同一个簇中。
我希望得到两个簇,确保每个词至少在其中一个簇中出现。
在这个例子中,列表A、C和D应该属于簇1
而B、E和F属于簇2。
有没有Python中的算法(或机器学习方法)可以用来解决这种类型的问题?
回答:
这看起来是一个使用潜在Dirichlet分配模型的好案例。
LDA
是一种无监督模型,它能在一组观测中找出相似的群体,然后你可以为每个群体分配一个“主题”。
你可以这样做:
from sklearn.feature_extraction.text import CountVectorizerimport lda
拟合一个CountVectorizer
,从字符串列表中获得一个标记计数矩阵:
l = [' '.join(i) for i in [A,B,C,D,E,F]]vec = CountVectorizer(analyzer='word', ngram_range=(1,1))X = vec.fit_transform(l)
使用lda
,并在CountVectorizer
的结果上拟合一个模型(还有其他一些模块也实现了lda
模型,比如gensim)
model = lda.LDA(n_topics=2, random_state=1)model.fit(X)
并为创建的2
个主题分配一个组号:
doc_topic = model.doc_topic_for i in range(len(l)): print(f'Cluster {i}: Topic ', doc_topic[i].argmax())Cluster 0: Topic 1 # -> ACluster 1: Topic 0Cluster 2: Topic 1 # -> CCluster 3: Topic 1 # -> DCluster 4: Topic 0Cluster 5: Topic 0