2013-04-13 6 views
5

Sto lavorando su un problema di classificazione Web relativamente grande basato sul testo e sto pensando di utilizzare il classificatore multinomiale di Naive Bayes in sklearn in python e il framework scrapy per la scansione . Tuttavia, sono un po 'preoccupato che sklearn/python potrebbe essere troppo lento per un problema che potrebbe coinvolgere classificazioni di milioni di siti web. Ho già addestrato il classificatore su diverse migliaia di siti web da DMOZ. La struttura di ricerca è la seguente:Uso di sklearn e Python per una grande applicazione classificazione/raschiamento esercizio

1) Il crawler atterra su un nome di dominio e cancella il testo da 20 link sul sito (di profondità non più grande di uno). (Il numero di parole tokenizzate qui sembra variare tra poche migliaia fino a 150K per un'esecuzione campione del crawler) 2) Esegui il classificatore sklearn multionmial NB con circa 50.000 funzioni e registra il nome di dominio a seconda del risultato

La mia domanda è se un classificatore basato su Python sarebbe all'altezza del compito per un'applicazione di così larga scala o dovrei provare a riscrivere il classificatore (e magari anche il raschiatore e il tokenizzatore di parole) in un ambiente più veloce? Se sì, quale potrebbe essere quell'ambiente? O forse Python è sufficiente se accompagnato da qualche parallelizzazione del codice? Grazie

risposta

5

Utilizzare i HashingVectorizer e uno dei moduli di classificazione lineari che supportano le API partial_fit per esempio SGDClassifier, Perceptron o PassiveAggresiveClassifier per imparare in modo incrementale il modello senza dover vectorize e caricare tutti i dati in memoria in anticipo e non si dovrebbe avere qualsiasi problema nell'apprendimento di un classificatore su centinaia di milioni di documenti con centinaia di migliaia di funzioni (con hash).

È tuttavia necessario caricare un piccolo sottocampione che si adatta alla memoria (ad esempio documenti 100k) e parametri di ricerca della griglia validi per il vectorizer utilizzando un oggetto Pipeline e la classe RandomizedSearchCV del ramo master. È anche possibile mettere a punto il valore del parametro di regolarizzazione (ad esempio C per PassiveAggressiveClassifier o alpha per SGDClassifier) ​​utilizzando lo stesso RandomizedSearchCV o un set di dati pre-vettorializzato più grande che si adatta alla memoria (ad esempio un paio di milioni di documenti).

anche modelli lineari possono essere mediati (media del coef_ e intercept_ di 2 modelli lineari) in modo che è possibile partizionare il set di dati, imparare modelli lineari in modo indipendente e poi la media dei modelli per ottenere il modello finale.

3

Fondamentalmente, se ci si basa su numpy, scipy e sklearn, Python non sarà un collo di bottiglia poiché le parti più critiche di tali librerie sono implementate come estensioni C.

Ma, dal momento che stai raschiando milioni di siti, sarai limitato dalle capacità della tua singola macchina. Vorrei prendere in considerazione l'utilizzo di un servizio come PiCloud [1] o Amazon Web Services (EC2) per distribuire il carico di lavoro su molti server.

Un esempio potrebbe essere quello di incanalare il tuo scraping tramite Cloud Queues [2].

[1] http://www.picloud.com

[2] http://blog.picloud.com/2013/04/03/introducing-queues-creating-a-pipeline-in-the-cloud/