2017-04-18 3 views
4

J'ai plusieurs documents contenant plusieurs phrases. Je souhaite utiliser doc2vec pour regrouper (par exemple k-means) les vecteurs de phrase en utilisant sklearn.Clustering de phrases Doc2Vec

Ainsi, l'idée est que des phrases similaires sont regroupées en plusieurs groupes. Cependant, il n'est pas clair pour moi si je dois former chaque document séparément et ensuite utiliser un algorithme de clustering sur les vecteurs de phrase. Ou, si je pouvais déduire un vecteur de phrase de doc2vec sans entraîner chaque nouvelle phrase.

En ce moment, c'est un extrait de mon code:

sentenceLabeled = [] 
for sentenceID, sentence in enumerate(example_sentences): 
    sentenceL = TaggedDocument(words=sentence.split(), tags = ['SENT_%s' %sentenceID]) 
    sentenceLabeled.append(sentenceL) 

model = Doc2Vec(size=300, window=10, min_count=0, workers=11, alpha=0.025, 
min_alpha=0.025) 
model.build_vocab(sentenceLabeled) 
for epoch in range(20): 
    model.train(sentenceLabeled) 
    model.alpha -= 0.002 # decrease the learning rate 
    model.min_alpha = model.alpha # fix the learning rate, no decay 
textVect = model.docvecs.doctag_syn0 

## K-means ## 
num_clusters = 3 
km = KMeans(n_clusters=num_clusters) 
km.fit(textVect) 
clusters = km.labels_.tolist() 

## Print Sentence Clusters ## 
cluster_info = {'sentence': example_sentences, 'cluster' : clusters} 
sentenceDF = pd.DataFrame(cluster_info, index=[clusters], columns = ['sentence','cluster']) 

for num in range(num_clusters): 
    print() 
    print("Sentence cluster %d: " %int(num+1), end='') 
    print() 
    for sentence in sentenceDF.ix[num]['sentence'].values.tolist(): 
     print(' %s ' %sentence, end='') 
     print() 
    print() 

En fait, ce que je fais est en ce moment une formation sur chaque phrase étiquetée dans le document. Cependant, si vous avez l'idée que cela pourrait être fait d'une manière plus simple.

Éventuellement, les phrases contenant des mots similaires doivent être regroupées et imprimées. À ce stade, la formation de chaque document séparément, ne révèle clairement aucune logique au sein des groupes.

J'espère que quelqu'un peut me diriger dans la bonne direction. Merci.

+0

Je sais que c'est un peu en retard, mais vous pouvez essayer d'autres techniques de clustering telles que la classification hiérarchique ainsi que DBSCAN pour voir si améliore tout. Si quelque chose d'autre a fonctionné pour vous, s'il vous plaît partager cela aussi pour le bénéfice de tout le monde. Merci! – Enthusiast

Répondre

0
  • avez-vous regardé les vecteurs de mots que vous obtenez (utiliser DM = 1 réglage de l'algorithme)? Est-ce qu'ils montrent de bonnes similitudes lorsque vous les inspectez?
  • J'essaierais d'utiliser tSNE pour réduire vos dimensions une fois que vous aurez obtenu des vecteurs de mots semblables à l'apparence raisonnable. Vous pouvez utiliser PCA d'abord pour réduire cela à 50, si vous en avez besoin. Pensez que les deux sont en sklearn. Ensuite, voyez si vos documents forment des groupes distincts ou non.
  • regardez également vos vecteurs de document most_similar() et essayez infer_vector() sur une phrase entraînée connue et vous obtiendrez une similarité très proche de 1 si tout va bien. (infer_vector() est toujours un résultat différent à chaque fois, donc jamais identique!)
+0

Oui, j'ai aussi regardé les mots vecteurs. Alternativement, j'ai formé un modèle basé sur tous les documents comme indiqué par thn, et j'ai utilisé infer_vector(), qui montre des résultats plus prometteurs. En outre, je considère l'ADL pour déduire des sujets qui pourraient être utilisés comme des grappes. Va aussi essayer d'incorporer PCA pour la dimension de la reudction! – Boyos123