2016-12-16 3 views
5

S'il vous plaît aidez-moi à comprendre la différence entre la façon dont TaggedDocument et LabeledSentence de gensim fonctionne. Mon but ultime est la classification de texte en utilisant le modèle Doc2Vec et tout classificateur. Je suis ce blog!Quelle est la différence entre gensim LabeledSentence et 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 

Ma question est model_l.docvecs['some_word'] est la même que model_t.docvecs['some_word']? Pouvez-vous me fournir un lien internet de bonnes sources pour comprendre comment fonctionne le TaggedDocument ou le LabeledSentence.

Répondre

5

LabeledSentence est un ancien nom obsolète pour le même type d'objet simple à encapsuler un exemple de texte qui est maintenant appelé TaggedDocument. Tous les objets qui ont words et tags propriétés, chacun une liste, feront l'affaire. (words est toujours une liste de chaînes, tags peut être un mélange d'entiers et de chaînes, mais dans le cas commun et le plus efficace, est juste une liste avec un seul entier identifiant, à partir de 0.)

model_l et model_t servira les mêmes objectifs, après s'être entraîné sur les mêmes données avec les mêmes paramètres, en utilisant juste différents noms pour les objets. Mais les vecteurs qu'ils retourneront pour les mots-clés individuels (model['some_word']) ou les balises de document (model.docvecs['somefilename_NN']) seront probablement différents - il y a du caractère aléatoire dans l'initialisation Word2Vec/Doc2Vec et l'apprentissage-échantillonnage, et introduit par ordre-jitter de formation multithread.