1

J'ai généré un modèle word2vec 100D en utilisant mon corpus de texte de domaine, fusionnant des phrases communes, par exemple (au revoir => good_bye). Ensuite, j'ai extrait 1000 vecteurs de mots désirés.Python - Calculer la classification hiérarchique des vecteurs word2vec et tracer les résultats sous forme de dendrogramme

J'ai donc 1000 numpy.array comme ceci:

[[-0.050378,0.855622,1.107467,0.456601,...[100 dimensions], 
[-0.040378,0.755622,1.107467,0.456601,...[100 dimensions], 
... 
...[1000 Vectors] 
] 

et tableau des mots comme ceci:

["hello","hi","bye","good_bye"...1000] 

J'ai couru K-Means sur mes données, et les résultats que j'obtenu fait sens:

X = np.array(words_vectors) 
kmeans = KMeans(n_clusters=20, random_state=0).fit(X) 
for idx,l in enumerate(kmeans.labels_): 
    print(l,words[idx]) 

--- Output --- 
0 hello 
0 hi 
1 bye 
1 good_bye 

0 = message d'accueil 1 =

revoir

Cependant, certains mots m'ont fait penser que clustering hiérarchique est plus approprié pour la tâche. J'ai essayé AgglomerativeClustering, malheureusement ... pour ce Python nobee, les choses se sont compliquées et je me suis perdu.

Comment puis-je regrouper mes vecteurs, donc la sortie serait un dendrogramme, plus ou moins, comme celui trouvé sur la page this wiki? enter image description here

+0

Qu'est-ce qui n'a pas fonctionné avec 'AgglomerativeClustering'? Si vous pouvez fournir un exemple reproductible, ce serait mieux –

+0

Je pensais juste que je devinais autour, et manque de connaissances pour terminer la tâche –

Répondre

2

J'ai eu le même problème jusqu'à maintenant! Après avoir toujours trouvé votre message après l'avoir recherché en ligne (keyword = hierarchy clustering on word2vec). Je devais vous donner une solution peut-être valable.

sentences = ['hi', 'hello', 'hi hello', 'goodbye', 'bye', 'goodbye bye'] 
sentences_split = [s.lower().split(' ') for s in sentences] 

import gensim 
model = gensim.models.Word2Vec(sentences_split, min_count=2) 

from matplotlib import pyplot as plt 
from scipy.cluster.hierarchy import dendrogram, linkage 

l = linkage(model.wv.syn0, method='complete', metric='seuclidean') 

# calculate full dendrogram 
plt.figure(figsize=(25, 10)) 
plt.title('Hierarchical Clustering Dendrogram') 
plt.ylabel('word') 
plt.xlabel('distance') 

dendrogram(
    l, 
    leaf_rotation=90., # rotates the x axis labels 
    leaf_font_size=16., # font size for the x axis labels 
    orientation='left', 
    leaf_label_func=lambda v: str(model.wv.index2word[v]) 
) 
plt.show()