У меня есть несколько документов, содержащих несколько предложений. Я хочу использовать doc2vec для кластеризации (например, k-средних) векторов предложений с помощью sklearn.
Таким образом, идея состоит в том, что похожие предложения сгруппированы в несколько кластеров. Однако мне не ясно, нужно ли мне обучать каждый документ отдельно, а затем использовать алгоритм кластеризации по векторам предложений. Или, если бы я мог вывести вектор предложений из 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()
По сути, сейчас я тренируюсь по каждому помеченному предложению в документе. Однако если есть представление, что это можно было бы сделать более простым способом.
В конце концов, предложения, содержащие похожие слова, должны быть сгруппированы вместе и распечатаны. На этом этапе обучение каждого документа отдельно не выявляет никакой логики внутри кластеров.
Надеюсь, кто-нибудь сможет направить меня в правильном направлении. Спасибо.