Кластеризация предложений Doc2Vec

У меня есть несколько документов, содержащих несколько предложений. Я хочу использовать 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()

По сути, сейчас я тренируюсь по каждому помеченному предложению в документе. Однако если есть представление, что это можно было бы сделать более простым способом.

В конце концов, предложения, содержащие похожие слова, должны быть сгруппированы вместе и распечатаны. На этом этапе обучение каждого документа отдельно не выявляет никакой логики внутри кластеров.

Надеюсь, кто-нибудь сможет направить меня в правильном направлении. Спасибо.


person Boyos123    schedule 18.04.2017    source источник
comment
Я знаю, что это немного поздно, но вы можете попробовать другие методы кластеризации, такие как иерархическая кластеризация, а также DBSCAN, чтобы увидеть, улучшит ли это что-нибудь. Если у вас получилось что-то еще, поделитесь, пожалуйста, и этим на благо всех. Спасибо!   -  person StatguyUser    schedule 17.01.2018


Ответы (2)


  • Вы смотрели на получаемые словесные векторы (используйте настройку алгоритма DM = 1)? Есть ли у них хорошее сходство, когда вы их осматриваете?
  • Я бы попытался использовать tSNE, чтобы уменьшить ваши размеры, как только у вас будут работать несколько разумно выглядящих похожих векторов слов. Вы можете сначала использовать PCA, чтобы уменьшить размер, скажем, до 50 или около того, если вам нужно. Думаю, оба в склеарне. Затем посмотрите, образуют ли ваши документы отдельные группы или нет.
  • также посмотрите на векторы документа most_similar () и попробуйте infer_vector () на известном обученном предложении, и вы должны получить очень близкое сходство с 1, если все в порядке. (infer_vector () всегда каждый раз немного отличается от результата, поэтому никогда не бывает идентичным!)
person Luke Barker    schedule 19.04.2017
comment
Да, я тоже посмотрел на векторы слов. В качестве альтернативы я обучил модель, основанную на всех документах, как указано в thn, и использовал infer_vector (), который показывает более многообещающие результаты. Кроме того, я рассматриваю LDA для определения тем, которые можно использовать в качестве кластеров. Также попытаюсь включить PCA для повторного определения размерности! - person Boyos123; 19.04.2017

Для вашего варианта использования все предложения во всех документах должны быть обучены вместе. По сути, вы должны рассматривать предложение как мини-документ. Тогда все они используют один и тот же словарный запас и семантическое пространство.

person THN    schedule 19.04.2017
comment
Итак, это в основном означает, что для каждого документа мне нужно обучать новую модель doc2vec и использовать эту конкретную модель для кластеризации? На мой взгляд, это не приводит к логической группировке предложений, поскольку я не вижу семантических различий между кластерами. - person Boyos123; 19.04.2017
comment
Нет, вы не тренируете новую модель doc2vec для каждого документа. Вы обучаете 1 модель doc2vec для всех предложений во всех документах. Как это не ясно из моего ответа? - person THN; 19.04.2017
comment
вам нужно будет использовать все предложения для обучения одной модели, как сказано в thn. Затем для новых невидимых предложений вы можете infer_vector (), используя свою модель, а затем определить, к какому кластеру он принадлежит в вашей кластеризации sklearn. - person Luke Barker; 19.04.2017