2013-05-09 11 views
5

Desidero creare un modello tf-idf basato su un corpus che non può essere contenuto nella memoria. Ho letto il tutorial, ma il corpus sembra essere caricato in una volta:TfidfVectorizer per corpi che non possono essere contenuti nella memoria

from sklearn.feature_extraction.text import TfidfVectorizer 
corpus = ["doc1", "doc2", "doc3"] 
vectorizer = TfidfVectorizer(min_df=1) 
vectorizer.fit(corpus) 

Mi chiedo se posso caricare i documenti in memoria uno per uno invece di caricare tutti loro.

+0

Quando si lavora con grandi corpora, potrebbe essere una buona idea di utilizzare una versione di sviluppo recente, piuttosto che una versione stabile, come 'TfidfVectorizer' è stato revisionato per l'utilizzo della memoria ridotto e una maggiore velocità. –

risposta

11

Sì, è possibile, basta rendere il proprio corpus un iteratore. Ad esempio, se i tuoi documenti risiedono su un disco, puoi definire un iteratore che prende come argomento l'elenco dei nomi di file e restituisce i documenti uno per uno senza caricare tutto in memoria contemporaneamente.

from sklearn.feature_extraction.text import TfidfVectorizer 

def make_corpus(doc_files): 
    for doc in doc_files: 
     yield load_doc_from_file(doc) #load_doc_from_file is a custom function for loading a doc from file 

file_list = ... # list of files you want to load 
corpus = make_corpus(file_list) 
vectorizer = TfidfVectorizer(min_df=1) 
vectorizer.fit(corpus) 
+0

Ho intenzione di provarlo. Può funzionare senza trasformare? –

+0

Eventuali soluzioni se anche la rappresentazione vettoriale di Tfidf non si adatta alla memoria? – mchangun

Problemi correlati