我有一个半结构化的数据集,每一行都属于一个用户:
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模型提供的向量成功地对相似用户的组进行聚类?
答案 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
祝你好运!