2016-12-16 14 views
5

Пожалуйста, помогите мне в понимании разницы между тем, как работает TaggedDocument и LabeledSentence из gensim. Моя конечная цель - текстовая классификация с использованием модели Doc2Vec и любого классификатора. Я следую за этим blog!В чем разница между gensim LabeledSentence и TaggedDocument

class MyLabeledSentences(object): 
    def __init__(self, dirname, dataDct={}, sentList=[]): 
     self.dirname = dirname 
     self.dataDct = {} 
     self.sentList = [] 
    def ToArray(self):  
     for fname in os.listdir(self.dirname):    
      with open(os.path.join(self.dirname, fname)) as fin: 
       for item_no, sentence in enumerate(fin): 
        self.sentList.append(LabeledSentence([w for w in sentence.lower().split() if w in stopwords.words('english')], [fname.split('.')[0].strip() + '_%s' % item_no])) 
     return sentList 


class MyTaggedDocument(object): 
    def __init__(self, dirname, dataDct={}, sentList=[]): 
     self.dirname = dirname 
     self.dataDct = {} 
     self.sentList = [] 
    def ToArray(self):  
     for fname in os.listdir(self.dirname):    
      with open(os.path.join(self.dirname, fname)) as fin: 
       for item_no, sentence in enumerate(fin): 
        self.sentList.append(TaggedDocument([w for w in sentence.lower().split() if w in stopwords.words('english')], [fname.split('.')[0].strip() + '_%s' % item_no])) 
     return sentList 

sentences = MyLabeledSentences(some_dir_name) 
model_l = Doc2Vec(min_count=1, window=10, size=300, sample=1e-4, negative=5,  workers=7) 
sentences_l = sentences.ToArray() 
model_l.build_vocab(sentences_l) 
for epoch in range(15): # 
    random.shuffle(sentences_l) 
    model.train(sentences_l) 
    model.alpha -= 0.002 # decrease the learning rate 
    model.min_alpha = model_l.alpha 

sentences = MyTaggedDocument(some_dir_name) 
model_t = Doc2Vec(min_count=1, window=10, size=300, sample=1e-4, negative=5, workers=7) 
sentences_t = sentences.ToArray() 
model_l.build_vocab(sentences_t) 
for epoch in range(15): # 
    random.shuffle(sentences_t) 
    model.train(sentences_t) 
    model.alpha -= 0.002 # decrease the learning rate 
    model.min_alpha = model_l.alpha 

Мой вопрос model_l.docvecs['some_word'] такой же, как model_t.docvecs['some_word']? Можете ли вы предоставить мне ссылку на хорошие источники, чтобы понять, как работает TaggedDocument или LabeledSentence.

ответ

5

LabeledSentence - это устаревшее, устаревшее имя для одного и того же простого типа объекта для инкапсуляции текстового примера, который теперь называется TaggedDocument. Любые объекты, которые имеют свойства words и tags, будут перечислены все списки. (words всегда список строк, tags может быть сочетание целых чисел и строк, но в общем и наиболее эффективным случае, это просто список с одним целым числом идентификаторов, начиная с 0.)

model_l и model_t будут выполнять те же задачи, обучаясь тем же самым данным с теми же параметрами, используя только разные имена для объектов. Но векторы, которые они вернут для отдельных текстовых токенов (model['some_word']) или тегов документа (model.docvecs['somefilename_NN']), скорее всего, будут разными: в Word2Vec/Doc2Vec инициализация и выборка обучения введена случайность, а также введен порядок джиттера из многопоточного обучения.