2017-04-18 170 views
4

我有多個包含多個句子的文檔。我想通過使用sklearn來使用doc2vec聚類(例如,k-均值)句子向量。Doc2Vec句子聚類

因此,這個想法是,類似的句子被分組在一起成幾個集羣。但是,我不清楚是否必須單獨訓練每個單獨的文檔,然後對句子向量使用聚類算法。或者,如果我可以從doc2vec推斷句子矢量,而不需要訓練每個新句子。

現在這是我的代碼片段:

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() 

基本上,我在做什麼,現在是在文檔中的每個標記句子訓練。但是,如果有這樣的想法,這可以用更簡單的方式完成。

最後,包含相似單詞的句子應聚集在一起並打印出來。此時分別對每個文檔進行訓練,並未清楚地顯示集羣內的任何邏輯。

希望有人能引導我走向正確的方向。 謝謝。

+0

我知道這有點晚,但你可以嘗試其他聚類技術,如層次聚類以及DBSCAN看看它是否改善了一切。如果有其他事情爲你效勞,請分享這一點,也爲了大家的利益。謝謝! – Enthusiast

回答

0
  • 你看過你得到的單詞向量(使用DM = 1算法設置)嗎?當你檢查它們時,它們顯示出很好的相似性嗎?
  • 我會嘗試使用tSNE減少你的尺寸,一旦你有一些合理的看起來類似的詞向量工作。如果需要,您可以首先使用PCA來減少50個左右的尺寸。認爲兩者都在sklearn。然後看看你的文件是否形成了不同的羣體或不是那樣。
  • 還會查看您的most_similar()文檔向量並嘗試已知受過訓練的句子中的infer_vector(),如果一切正常,您應該得到與1非常接近的相似度。 (infer_vector()總是有點不同的結果每次,所以永遠不會相同!)
+0

是的,我也查看了單詞向量。或者,我也根據所有文檔訓練了一個模型,並使用infer_vector(),它顯示了更有希望的結果。此外,我正在考慮LDA推斷可以用作羣集的主題。也將嘗試將PCA納入維度評估! – Boyos123