我试图根据字符串相似性将包含40.000行字符串数据的列聚类为x个聚类。我发现了DBSCAN适当的算法,因为我不知道预期的簇数或要比较的单词。 Levenshtein最适合作为基于字符串相似性的聚类的距离度量。代码如下。
运行算法时出现内存错误:我的RAM爆炸了。可扩展性似乎是dbscan的问题。在10个字符串上运行dbscan对于我的笔记本电脑来说已经存在问题,在7 + / 8 GB RAM上运行此计算。有人建议将Ball_Tree指数作为解决方案;在下面的代码中你可以看到我试过,但同样的内存问题。
我在不同的posts中看到了类似的问题。我可以找到dbscan的变体,即NG-DBSCAN和dbscan-multiplex,但我无法找到实现这些方法的方法。另一个提议的解决方案是在Java中使用ELKI,但我希望能够使用Python来实现解决方案。
我需要帮助找到内存问题的解决方法,这样我就可以运行dbscan算法并在我的数据文件中聚集40k字符串。
这是我写的代码:
df4 = df1[['Omschrijving2']].copy()
data = df4.values
def lev_metric(x, y):
i, j = int(x[0]), int(y[0]) # extract indices
return pylev.levenshtein(data[i], data[j])
X = np.arange(len(data)).reshape(-1, 1)
dbscan(X, eps=2, min_samples=50, metric=lev_metric, metric_params=None,
algorithm="auto", leaf_size=100, sample_weight=None, n_jobs=1)
eps=2
tree = BallTree(X, leaf_size=30, metric=lev_metric)
tree.query_radius(X, r=eps)