J'ai un corpus d'articles de Wikipédia. J'ai identifié les 10 000 mots les plus fréquents, trouvé leurs vecteurs Word2Vec, et utilisé des moyennes k sphériques sur les vecteurs pour regrouper les mots en 500 groupes en fonction de la similarité de signification. J'ai repéré 3 des groupes de mots et ai converti les mots en leurs vecteurs de mot. Chaque vecteur de mot est un tableau de 300 valeurs, donc j'ai appliqué PCA (de sklearn) sur chacun d'eux pour les convertir en 2D. Puis je comploté:PCA et K-means pour le regroupement de mots
Chaque point représente un mot, chaque couleur représente 1 groupe. Le problème est que ces groupes ne devraient pas se chevaucher. Un cluster a des mots liés à l'ordinateur, un autre cluster a des mots liés à la race, et le dernier cluster a des mots liés aux relations. J'ai ajouté le mot «poulet» à la grappe avec des mots informatiques, mais une fois tracé, son point était juste à côté du point pour «clavier».
Je ne suis pas sûr de ce qui ne va pas ici. Y a-t-il quelque chose qui ne va pas avec mon approche? Voici mon code PCA:
for words in theList: #theList is an array of my 3 clusters
lexicalUnitVectors = load_bin_vec("GoogleNews-vectors-negative300.bin", words) #convert words to Word2Vec vectors
lexicalUnitVectors = list(lexicalUnitVectors.values())
lexicalUnitVectors = pca.fit(lexicalUnitVectors).transform(lexicalUnitVectors) #apply pca
print(lexicalUnitVectors) #this shows a bunch of 2D points; all x and y values are close to 0 for some reason
xs = [i*1 for i in lexicalUnitVectors[:, 0]] #ignore this
ys = [i*1 for i in lexicalUnitVectors[:, 1]] #ignore this
plt.scatter(xs, ys, marker = 'o')
plt.show()