DBSCAN 聚类与名称不同(Python)
Posted
技术标签:
【中文标题】DBSCAN 聚类与名称不同(Python)【英文标题】:DBSCAN Clustering Unlike Names Together (Python) 【发布时间】:2021-09-21 21:27:44 【问题描述】:我正在使用 TF-IDF 和 DBSCAN 在数据库中对相似的人名进行聚类。该项目的目标是能够将属于同一个人但不一定具有相同格式或拼写的名称聚集在一起。例如,John Smith 也可以在数据库中标记为 J. Smith 或 Smith, John。理想情况下,模型能够将这些实例聚集在一起。
我正在使用的数据集有超过 25 万条记录。我了解 DBSCAN 会将噪声记录标记为-1
。但是,该模型还生成了一个额外的集群,其中几乎总是有大约 20 万条记录,其中的绝大多数记录似乎应该在它们自己的单独集群中。发生这种情况是否有原因?我正在考虑在这个大型集群上运行另一个模型,看看会发生什么。
任何建议将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:你称它为“DBSCAN”,我知道你在说什么,因为我现在正在工作中这样做,但你的描述听起来更像是模糊匹配。查看下面的链接,看看这是否有助于您完成游戏。
https://medium.com/analytics-vidhya/matching-messy-pandas-columns-with-fuzzywuzzy-4adda6c7994f
另外,下面是一个 DBSCAN 规范示例的链接,但我不认为这是您真正想要做的。
https://towardsdatascience.com/dbscan-clustering-for-data-shapes-k-means-cant-handle-well-in-python-6be89af4e6ea
【讨论】:
【参考方案2】:首先,当您拥有的集群数量未知时,DBSCAN 是一种合理的监督聚类方法。
您需要为要聚类的每个字符串传递一个距离矩阵。你用什么string similarity metric是你的选择。这是 Levenstein 距离的示例,其中 names
是用于聚类的字符串列表或数组:
import Levenshtein as Lev
import numpy as np
from sklearn.cluster import DBSCAN
lev_similarity = 1 * np.array([[Lev.distance(v1, v2) for v1 in names] for v2 in names])
dbscan = DBSCAN(eps=5, min_samples=1)
dbscan.fit(lev_similarity)
因为我们使用的是 lev 距离,所以 eps 将是将一个字符串转换为另一个字符串的替换次数。为您的用例调整它。最大的担忧是更长的名称被缩短('malala yousafzai'
与 'malala y.'
比 'jane doe'
到 'jane d.'
的替换更多)
关于为什么您当前的代码将大部分数据集聚集在一起,我的假设是:您的 eps
值调得太高了。
【讨论】:
以上是关于DBSCAN 聚类与名称不同(Python)的主要内容,如果未能解决你的问题,请参考以下文章