标签聚类

2024-05-29 06:02:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集(~80k行),其中包含一个逗号分隔的标记列表(skills),例如:

python, java, javascript,
marketing, communications, leadership,
web development, node.js, react
...

有的短至1,有的长达50+技能。我想把一组技能组合在一起(直觉上,同一组的人会有一组非常相似的技能)

首先,我使用CountVectorizerfromsklearn对单词列表进行向量化,并使用SVD执行维数缩减,将其从500+减少到50个维度。最后,我使用KMeans进行KMeans聚类,但是结果不是最优的——聚集在一起的技能组似乎非常不相关。在

我该如何改进结果?我也不确定SVD是否是这个用例中最合适的降维形式。在


Tags: 数据标记web列表技能javajavascriptmarketing
2条回答

所有的TF-IDF、余弦等都只适用于非常长的文本,在这些文本中,可以看到向量以合理的数值精度模拟术语频率分布。对于短文本来说,这不足以产生有用的集群。在

此外,k-means需要将每个记录放入一个集群中。但是,那些胡说八道的数据呢——比如说,只有“克林贡人”的人?在

相反,使用

频繁项集挖掘

这在标签上很有意义。它标识经常一起出现的标签组。因此,一种模式是,例如,“pythonsklearn,numpy”;集群是所有拥有这些技能的用户。在

请注意,这些簇将重叠,有些簇可能不在簇中。这当然很难使用,但对于大多数应用程序来说,记录可以属于多个集群,或者不属于集群,这是有意义的。在

我将从以下方法开始:

  1. 如果有足够的数据,可以尝试类似word2vec的方法来为每个标记获取一个嵌入。您可以使用预先训练过的模型,但可能更好地训练您自己的数据,因为它具有独特的语义。确保你有一个OOV嵌入标记,那些标签出现的次数不够。然后使用K-means、聚集层次聚类或其他已知的聚类方法。在
  2. 我将构造一个加权无向图,其中每个标记是一个节点,边表示两个标记在同一个列表中出现的次数。一旦构建了图,我将使用社区检测算法进行聚类。Networkx是python中的一个非常好的库,它允许您这样做。在

对于任何方法(包括你的),在你做一些超参数调整之前不要放弃。也许你只需要一个更小的表示,或者另一个K(对于KMeans)。在

祝你好运!在

相关问题 更多 >

    热门问题