2017-08-23 4 views
0
from gensim.parsing import PorterStemmer 
from gensim.models import Word2Vec, Phrases 

class SentenceClass(object): 
    def __init__(self, dirname): 
     self.dirname = dirname 

    def __iter__(self): 
     for fname in os.listdir(self.dirname): 
      with open(os.path.join(self.dirname,fname), 'r') as myfile: 
       doc = myfile.read().replace('\n', ' ') 
       for sent in tokenize.sent_tokenize(doc.lower()): 
        yield [Stemming.stem(word)\ 
        for word in word_tokenize(re.sub("[^A-Za-z]", " ",sent))\ 
        if word not in stopwords] 

maintenant des deux approches:
1)Problème avec gensim.models.Phrases

model = Word2Vec(SentenceClass(data_dir_path), size=100, window=5, min_count=1, workers=4) 

celui ci-dessus fonctionne vraiment bien sans avertissement

2)

bigram_transformer = Phrases(SentenceClass(data_dir_path), min_count=1) 
model = Word2Vec(bigram_transformer[SentenceClass(data_dir_path)], size=100, window=5, min_count=1, workers=4) 

produit l'avertissement:

WARNING:gensim.models.word2vec:train() called with an empty iterator (if not intended, be sure to provide a corpus that offers restartable iteration = an iterable). 
WARNING:gensim.models.word2vec:supplied example count (0) did not equal expected count (30) 

Maintenant, je comprends la différence entre le générateur et itérateurs, et je suis itérateurs passant, ce qui est vérifié par l'impression des commandes ci-dessous plusieurs fois:

print(list(SentenceClass(data_dir_path))) 
print(list(SentenceClass(data_dir_path))) 
print(list(bigram_transformer[SentenceClass(data_dir_path)])) 
print(list(bigram_transformer[SentenceClass(data_dir_path)])) 

Et il imprime belle chose, mais je ne suis toujours pas sûr pourquoi l'avertissement de "itérateur vide" pour le deuxième cas, suis-je manquer quelque chose ici?

Répondre

0

Je réalise que les phrases & phrases sont tous deux font qu'un générateur et la classe suivante était nécessaire

from gensim.models import Word2Vec, Phrases, phrases 

class PhraseItertor(object): 

    def __init__(self, my_phraser, data): 
     self.my_phraser, self.data = my_phraser, data 

    def __iter__(self): 
     return self.my_phraser[self.data] 

my_sentences = SentenceClass(data_dir_path) 
my_phrases = Phrases(my_sentences, min_count=1) 
bigram = phrases.Phraser(my_phrases) 
my_corpus = PhraseItertor(bigram,my_sentences) 

model = Word2Vec(my_corpus, size=100, window=5, min_count=1, workers=4)