[Python] NLTK memory error.

2017-07-31 Thread Massimiliano Modena

Buongiorno a tutti.

Premetto le limitazioni che ho (leggasi chi paga vuole cosi).

Piattaforma : WIndows 7 64 bit.

Ho implementato un programma che, a partire da un database di frasi 
classificate ne effettua l'apprendimento per poi provare ad indovinare 
la classificazione per nuove frasi inserite dall'utente.


P.e.

/Il computer non si accende, lo schermo rimane nero/ - CLASSE: alimentazione

/Il computer continua a dare schermata blu/ - CLASSE: avaria driver


etc.

Il mio programma prende circa 300.000 voci gia' classificate (300 per 
ogni categoria) e crea un file di apprendimento (che persisto con pickle).


Stando alla documentazione di NLTK su windows dice esplicitamente AVOID 
Python 64 bit. Il problema e' che (provando comunque col 64 bit) 
raggiungo un utilizzo di ram di circa 7Gb (che col 32 bit sono 
ovviamente un problema).


Esiste qualche workaround o qualche ottimizzazione possibile, che voi 
sappiate?


Massimiliano.



___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] NLTK memory error.

2017-07-31 Thread Valerio Maggio
Ciao Massimiliano.

2017-07-31 10:53 GMT+02:00 Massimiliano Modena :

> Il mio programma prende circa 300.000 voci gia' classificate (300 per ogni
> categoria) e crea un file di apprendimento (che persisto con pickle).
>
> Stando alla documentazione di NLTK su windows dice esplicitamente AVOID
> Python 64 bit. Il problema e' che (provando comunque col 64 bit) raggiungo
> un utilizzo di ram di circa 7Gb (che col 32 bit sono ovviamente un
> problema).
>
> Esiste qualche workaround o qualche ottimizzazione possibile, che voi
> sappiate?
>
il workaround è evitare pickle :)
Perché non utilizzare un altro formato ? Ad esempio, HDF5:
http://www.h5py.org
Oppure: se capisco bene quello che persisti è l'oggetto "classificatore" -
aka: oggetto Python con i parametri risultanti dal training.
Cosa più leggera potrebbe essere salvarti esclusivamente i valori dei
parametri e ogni volta ricreare oggetto con i parametri giusti.. per questo
basterebbe un formato qualsiasi a tua scelta.. da csv a JSON a whatever ;)

HTH
Valerio
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] NLTK memory error.

2017-07-31 Thread Valerio Maggio
2017-07-31 11:07 GMT+02:00 Massimiliano Modena :

>
>
> Il 31/07/2017 10:58, Valerio Maggio ha scritto:
>
> Oppure: se capisco bene quello che persisti è l'oggetto "classificatore" -
> aka: oggetto Python con i parametri risultanti dal training.
> Cosa più leggera potrebbe essere salvarti esclusivamente i valori dei
> parametri e ogni volta ricreare oggetto con i parametri giusti.. per questo
> basterebbe un formato qualsiasi a tua scelta.. da csv a JSON a whatever ;)
>
> HTH
> Valerio
>
>
> Il problema si presenta ben prima di arrivare a fare
> *pickle.dump(classifier, f).*
>

ok, allora non ho capito io il problema... oppure non ti sei spiegato :D


> Json non e' un formato adatto, troppo overhead, potrei provare jsonB. Ma
> al momento, non e' questa l'urgenza.
>

Io sto parlando della memorizzazione dei **soli** parametri (e valori) non
dell'oggetto Python... per cui, non capisco JSONB... parliamo di cose che
starebbero in un file di testo...


> Vedo se riesco a creare un mokup del programma che ho fatto e postarlo
> (devo stare attento perché sui dati ho firmato un NDA).
>

direi che non serve, se ci spieghi *bene* quale sia il tuo problema
allora.. leggendo avevo capito che il tuo problema era con Pickle (cosa
alquanto probabile...)

Ciao,
Valerio

P.s. Manteniamo la discussione sulla ML.

-- 
# valerio
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] NLTK memory error.

2017-07-31 Thread Massimiliano Modena



Il 31/07/2017 12:08, Valerio Maggio ha scritto:



2017-07-31 11:07 GMT+02:00 Massimiliano Modena >:




Il 31/07/2017 10:58, Valerio Maggio ha scritto:

Oppure: se capisco bene quello che persisti è l'oggetto
"classificatore" - aka: oggetto Python con i parametri risultanti
dal training.
Cosa più leggera potrebbe essere salvarti esclusivamente i valori
dei parametri e ogni volta ricreare oggetto con i parametri
giusti.. per questo basterebbe un formato qualsiasi a tua
scelta.. da csv a JSON a whatever ;)

HTH
Valerio


Il problema si presenta ben prima di arrivare a fare
/pickle.dump(classifier, f).
/


ok, allora non ho capito io il problema... oppure non ti sei spiegato :D

La procedura e':
Ottengo i dati dal database:
trainbase=[]
for item in 
session.query(Nltrainingdatum).filter(Nltrainingdatum.group==pcategory).order_by(Nltrainingdatum.category):

tokens = nltk.word_tokenize(item.description)
words_filtered = [e.lower() for e in tokens if len(e) >= 1]
trainbase.append((words_filtered, item.category))

che costruisce il trainbase.
Terminato questo, applico i calcoli statistici:
training_set = nltk.classify.apply_features(extract_features, trainbase)
extract_features e' un metodo.

in ultimo creo l'oggetto classificatore:
classifier = nltk.NaiveBayesClassifier.train(training_set)
quest'ultima operazione e' quella che va in errore. L'ho appena 
terminata su una workstation piu' performante, ci ha messo 30 minuti 
generando un oggetto di 1.5gb. L'uso della ram si attestava attorno ai 
20gb per tutto il tempo. \

Dopo di questa operazione ne effettuo il pickle ma non ci arrivo.
f = open(config[categoria], 'wb')
pickle.dump(classifier, f)
f.close()
che mi permette di NON rieffettuare il training, dato che i dati hanno 
validita' di una settimana (ed infatti, anche i 30 minuti di 
elaborazione, non sono un problema).




//Json non e' un formato adatto, troppo overhead, potrei provare
jsonB. Ma al momento, non e' questa l'urgenza.


Io sto parlando della memorizzazione dei **soli** parametri (e valori) 
non dell'oggetto Python... per cui, non capisco JSONB... parliamo di 
cose che starebbero in un file di testo...

Questi stanno gia' su database, e cosi' mi basta.


Vedo se riesco a creare un mokup del programma che ho fatto e
postarlo (devo stare attento perché sui dati ho firmato un NDA).


direi che non serve, se ci spieghi *bene* quale sia il tuo problema 
allora.. leggendo avevo capito che il tuo problema era con Pickle 
(cosa alquanto probabile...)

Ciao,
Valerio

P.s. Manteniamo la discussione sulla ML.
scusa, ho fatto rispondi senza guardare, convinto che rispondesse in 
automatico alla mailing list. Mea culpa.


___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python