Как выполнить кластеризацию на Word2Vec - PullRequest
0 голосов
/ 28 августа 2018

У меня есть полуструктурированный набор данных, каждая строка принадлежит одному пользователю:

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 голосов
/ 28 августа 2018

Вам нужно векторизовать ваши строки, используя вашу модель 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 

Удачи!

...