使用DBSCAN(sklearn)进行单词聚类的Buggy结果

时间:2017-05-05 08:05:12

标签: python scikit-learn dbscan

我正在尝试使用DveCan(sklearn)将Levenshtein距离作为距离度量来聚类相似的外观。我需要将类似的单词(拼写错误)聚集在一起,如下所示:

Sundar Residency
Sndar Residency
Sundhar Residency

我的代码:

# Distance metric
def lev_metric(x, y):
    i, j = int(x[0]), int(y[0])
    return (editdistance.eval(b1[i], b1[j]))

# Loading data
b1 = debug_data['b1']
b1 = b1.tolist()
X1 = np.arange(len(b1)).reshape(-1, 1)    

# Defining DBSCAN Parameters and clustering
db = DBSCAN(eps = 2, min_samples = 2, metric = lev_metric)
predictions = db.fit_predict(X1)

# Printing results 
tmp = pd.DataFrame({'b1': b1, 'cluster_id': predictions})
tmp.sort_values(by = ['cluster_id'], ascending = True, inplace = True)
print (tmp)

结果好坏参半。当我的eps为2时,我假设是我的集群中任意两点之间的Levenshtein距离,所有点都聚集在一个集群中。而当它设置为1时,聚类更好。但是,任何两点之间的Levenshtein距离仍然不是1.

Results with eps == 2
Results with eps == 1

有人能解释这里发生了什么吗? 谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

DBSCAN使用传递闭包。

因此,一个群集中的点距离 大于epsilon 。它保证存在序列 a,b,c,d,e,f ...,x,使得每个最多为epsilon,但没有限制关于步数。

您可以尝试Leader群集,但我宁愿不使用群集,但将其视为更简单的相似性搜索问题 - 您希望找到类似的对象,而不是复杂的结构化群组。