У меня есть полуструктурированный набор данных, каждая строка относится к одному пользователю:
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, для успешной группировки групп похожих пользователей?
Вам нужно векторизовать строки, используя вашу модель 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
Затем вы получаете вектор, который представляет вашу строку (документ и т.д.).
После того, как вы получили все ваши векторы для каждой из строк, вам нужно сгруппировать, вы можете использовать DBSCAN из sklearn для кластеризации.
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
Удачи!