Как выполнить кластеризацию на Word2Vec

1

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

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

Теги:
nlp
word2vec
cluster-analysis
data-mining

1 ответ

1

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

Удачи!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню