2016-09-08 8 views
3

Я исправлен следующий код из примеров, которые я нашел через Интернет:doc2vec Как группируются DocvecsArray

# gensim modules 
from gensim import utils 
from gensim.models.doc2vec import LabeledSentence 
from gensim.models import Doc2Vec 
from sklearn.cluster import KMeans 

# random 
from random import shuffle 

# classifier 

class LabeledLineSentence(object): 
    def __init__(self, sources): 
     self.sources = sources 

     flipped = {} 

     # make sure that keys are unique 
     for key, value in sources.items(): 
      if value not in flipped: 
       flipped[value] = [key] 
      else: 
       raise Exception('Non-unique prefix encountered') 

    def __iter__(self): 
     for source, prefix in self.sources.items(): 
      with utils.smart_open(source) as fin: 
       for item_no, line in enumerate(fin): 
        yield LabeledSentence(utils.to_unicode(line).split(), [prefix + '_%s' % item_no]) 

    def to_array(self): 
     self.sentences = [] 
     for source, prefix in self.sources.items(): 
      with utils.smart_open(source) as fin: 
       for item_no, line in enumerate(fin): 
        self.sentences.append(LabeledSentence(utils.to_unicode(line).split(), [prefix + '_%s' % item_no])) 
     return self.sentences 

    def sentences_perm(self): 
     shuffle(self.sentences) 
     return self.sentences 

sources = {'test.txt' : 'DOCS'} 
sentences = LabeledLineSentence(sources) 

model = Doc2Vec(min_count=1, window=10, size=100, sample=1e-4, negative=5, workers=8) 
model.build_vocab(sentences.to_array()) 

for epoch in range(10): 
    model.train(sentences.sentences_perm()) 

print(model.docvecs) 

мой файл test.txt содержит пункт в каждой строке.

код прекрасно работает и генерирует DocvecsArray для каждой строки текста

моя цель состоит в том, чтобы иметь выход, как так:

кластера 1: [DOC_5, DOC_100, ... DOC_N]
кластера 2: [DOC_0, DOC_1 ... DOC_N]

Я нашел following Answer, но вывод:

кластер 1: [слово, слово ... слово]
кластер 2: [слово, слово ... слово]

Как я могу изменить код и получить кластеры документов?

ответ

4

Итак, похоже, что вы почти там.

Вы выводите набор векторов. Для пакета sklearn вам нужно поместить их в массив numpy - использование функции numpy.toarray(), вероятно, было бы лучше всего. The documentation для KMeans действительно звездный и даже во всей библиотеке это хорошо.

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

В обеих ссылках есть примеры кода с комментариями.

+0

классный, я посмотрю .. Вы внедрили кластеризацию документов? –

+0

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

+0

http://hdbscan.readthedocs.io/en/latest/comparing_clustering_algorithms.html выглядит действительно интересно –

Смежные вопросы