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?