标签聚类
Clustering of Tags
我有一个数据集(~80k 行),其中包含以逗号分隔的标签(技能)列表,例如:
python, java, javascript,
marketing, communications, leadership,
web development, node.js, react
...
有的短到1个,有的长到50+技能。我想将技能组聚集在一起(直觉上,同一组中的人会有一组非常相似的技能)
首先,我使用 sklearn
中的 CountVectorizer
来矢量化单词列表,并使用 SVD
执行降维,将其降维到 50 维(从 500+)。最后,我使用 n=50
执行 KMeans
聚类,但结果不是最佳的——聚类在一起的技能组似乎非常不相关。
我应该如何改善结果?我也不确定 SVD
是否是该用例最合适的降维形式。
我将从以下方法入手:
- 如果您有足够的数据,请尝试使用 word2vec 之类的方法来为每个标签获取嵌入。您可以使用预先训练的模型,但可能更好地训练您自己的数据,因为它具有独特的语义。确保为出现次数不足的标签嵌入 OOV。然后使用 K-means、Agglomerative Hierarchical Clustering 或其他已知的聚类方法。
- 我会构建一个加权无向图,其中每个标签都是一个节点,边表示 2 个标签出现在同一列表中的次数。构建图形后,我将使用社区检测算法进行聚类。 Networkx 是 python 中一个非常好的库,可以让您做到这一点。
对于任何方法(包括您的方法),在进行一些超参数调整之前都不要放弃。也许您只需要一个更小的表示,或者另一个 K(对于 KMeans)。
祝你好运!
所有 TF-IDF、余弦等仅适用于非常长的文本,其中可以看到向量以合理的数字精度对词频分布进行建模。对于短文本,这不足以生成有用的集群。
另外,k-means需要把每条记录都放到一个簇中。但是无意义的数据呢 - 说一个只有技能 "Klingon" 的人?
改为使用
频繁项集挖掘
这在标签上非常有意义。它识别经常一起出现的标签组。因此,一种模式是 "python sklearn, numpy";集群是所有拥有这些技能的用户。
请注意,这些集群将 重叠 ,有些可能不在任何集群中。这当然更难使用,但对于大多数应用程序来说,记录可以属于多个或不属于集群是有意义的。
我有一个数据集(~80k 行),其中包含以逗号分隔的标签(技能)列表,例如:
python, java, javascript,
marketing, communications, leadership,
web development, node.js, react
...
有的短到1个,有的长到50+技能。我想将技能组聚集在一起(直觉上,同一组中的人会有一组非常相似的技能)
首先,我使用 sklearn
中的 CountVectorizer
来矢量化单词列表,并使用 SVD
执行降维,将其降维到 50 维(从 500+)。最后,我使用 n=50
执行 KMeans
聚类,但结果不是最佳的——聚类在一起的技能组似乎非常不相关。
我应该如何改善结果?我也不确定 SVD
是否是该用例最合适的降维形式。
我将从以下方法入手:
- 如果您有足够的数据,请尝试使用 word2vec 之类的方法来为每个标签获取嵌入。您可以使用预先训练的模型,但可能更好地训练您自己的数据,因为它具有独特的语义。确保为出现次数不足的标签嵌入 OOV。然后使用 K-means、Agglomerative Hierarchical Clustering 或其他已知的聚类方法。
- 我会构建一个加权无向图,其中每个标签都是一个节点,边表示 2 个标签出现在同一列表中的次数。构建图形后,我将使用社区检测算法进行聚类。 Networkx 是 python 中一个非常好的库,可以让您做到这一点。
对于任何方法(包括您的方法),在进行一些超参数调整之前都不要放弃。也许您只需要一个更小的表示,或者另一个 K(对于 KMeans)。
祝你好运!
所有 TF-IDF、余弦等仅适用于非常长的文本,其中可以看到向量以合理的数字精度对词频分布进行建模。对于短文本,这不足以生成有用的集群。
另外,k-means需要把每条记录都放到一个簇中。但是无意义的数据呢 - 说一个只有技能 "Klingon" 的人?
改为使用
频繁项集挖掘
这在标签上非常有意义。它识别经常一起出现的标签组。因此,一种模式是 "python sklearn, numpy";集群是所有拥有这些技能的用户。
请注意,这些集群将 重叠 ,有些可能不在任何集群中。这当然更难使用,但对于大多数应用程序来说,记录可以属于多个或不属于集群是有意义的。