如何在Word2Vec上执行群集

时间:2018-08-28 03:07:33

标签: python nlp cluster-analysis data-mining word2vec

我有一个半结构化的数据集,每一行都属于一个用户:

id, skills
0,"java, python, sql"
1,"java, python, spark, html"
2, "business management, communication"

为什么半结构化是因为只能从580个唯一值的列表中选择以下技能。

我的目标是聚集用户,或根据相似的技能组找到相似的用户。我尝试使用Word2Vec模型,该模型为识别相似的技能组提供了很好的结果-例如。

model.most_similar(["Data Science"])

给我-

[('Data Mining', 0.9249375462532043),
 ('Data Visualization', 0.9111810922622681),
 ('Big Data', 0.8253220319747925),...

这为我提供了一个很好的模型,用于识别个人技能而不是技能组。如何利用Word2Vec模型提供的向量成功地对相似用户的组进行聚类?

1 个答案:

答案 0 :(得分:3)

您需要使用Word2Vec模型将字符串向量化。 您可以像这样:

model = KeyedVectors.load("path/to/your/model") 
w2v_vectors = model.wv.vectors # here you load vectors for each word in your model
w2v_indices = {word: model.wv.vocab[word].index for word in model.wv.vocab} # here you load indices - with whom you can find an index of the particular word in your model 

然后您可以通过这种方式使用:

def vectorize(line): 
    words = []
    for word in line: # line - iterable, for example list of tokens 
        try:
            w2v_idx = w2v_indices[word]
        except KeyError: # if you does not have a vector for this word in your w2v model, continue 
            continue
        words.append(w2v_vectors[w2v_idx])
        if words: 
            words = np.asarray(words)
            min_vec = words.min(axis=0)
            max_vec = words.max(axis=0)
            return np.concatenate((min_vec, max_vec))
        if not words:
            return None 

然后您将收到一个代表行(文档等)的向量。

收到每行的所有矢量后,需要进行聚类,然后可以使用sklearn中的DBSCAN进行聚类。

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(metric='cosine', eps=0.07, min_samples=3) # you can change these parameters, given just for example 
cluster_labels = dbscan.fit_predict(X) # where X - is your matrix, where each row corresponds to one document (line) from the docs, you need to cluster 

祝你好运!