标签聚类

时间:2018-08-21 03:45:42

标签: python scikit-learn nlp cluster-analysis dimensionality-reduction

我有一个数据集(约8万行),其中包含以逗号分隔的标签(技能)列表,例如:

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

有些短至1,其他短至50以上。我想将技能组合在一起(直观上讲,同一群集中的人将具有非常相似的一组技能)

首先,我使用CountVectorizer中的sklearn对单词列表进行矢量化处理,并使用SVD执行降维器缩小,将其降为50维(从500多个)。最后,我用KMeans进行了n=50聚类,但是结果并不是最佳的-聚在一起的技能组似乎没有什么联系。

我应该如何改善结果?我也不确定SVD是否是此用例最合适的降维形式。

2 个答案:

答案 0 :(得分:2)

我将从以下方法开始:

  1. 如果您有足够的数据,请尝试使用诸如word2vec之类的方法为每个标签进行嵌入。您可以使用经过预训练的模型,但由于它具有独特的语义,因此最好对自己的数据进行训练。确保您对没有足够多次出现的标签进行了OOV嵌入。然后使用K-means,聚集层次聚类或其他已知的聚类方法。
  2. 我将构建一个加权无向图,其中每个标签是一个节点,边缘表示2个标签出现在同一列表中的次数。构建图后,我将使用社区检测算法进行聚类。 Networkx是python中一个非常漂亮的库,可让您做到这一点。

对于任何方法(包括您的方法),在进行一些超参数调整之前都不要放弃。也许您只需要一个较小的表示形式,或另一个K(对于KMeans)。

祝你好运!

答案 1 :(得分:2)

所有TF-IDF,余弦等仅适用于很长的文本,在这些文本中可以看到矢量以合理的数值精度对术语频率分布进行建模。对于短文本,这不足以产生有用的簇。

此外,k-means需要将每个记录放入一个群集中。但是,胡说八道的数据呢?说一个只有“克林贡语”技能的人吗?

相反,使用

频繁项集挖掘

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

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