Forum >> Principianti >> python 2.7 porzioni incrementali

Pagina: 1

ciao, sto usando python 2.7 per analizzare un testo, ogni 1000 parole del testo vorrei stampare

- la lunghezza del testo in quel momento

- il relativo vocabolario che ottengo tramite len(set(testo)), ad esempio:

1000 parole : 365 tipi

2000 parole : 457 tipi

3000 parole : 590 tipi

ecc...

così finché non raggiungo la fine del testo.

Vorrei capire come ottenere questo risultato utilizzando un ciclo for invece del ciclo while, e se possibile NON creando una lista ovvero non utilizzando lista.append e stampando i relativi elementi

grazie in anticipo

len(set(testo)), ad esempio:
8<-----8<-----8<-----8<-----8<-----8<-----
se possibile NON creando una lista
Direi che sono due affermazioni contraddittorie. Per poter analizzare i dati si dovrà memorizzarli in oggetti iterabili. Se non sono liste, allora saranno il loro simile set(). Forse molto meno indicato usare dei dizionari.

Con set() potrai risolvere rapidamente le unioni e le differenze di parole comuni. Altrimenti dovresti catalogare ogni parola e durante l' iterazione trovare quante altre sono uguali o simili.

Quindi la prima passata, forse una basta, cominciare a raggruppare le parole per la loro uguaglianza o similitudine. Forse potresti usare le regex per estrarre le singole parole, ma dovranno alla fine essere salvate in liste. Dalle liste si troverà quelle che sono da raggruppare.

grazie! mi scuso se non mi spiego bene, il mio problema non consiste tanto nell'identificazione delle parole diverse quanto nella stampa del risultato ogni 1000 parole.
set() mi restituisce effettivamente una lista, a me quello che interessa è la lunghezza di questa lista che vorrei stampare accanto al numero di parole del testo per porzioni di 1000.
ho provato con la funzione range(), ovvero:


>>> for x in range(0,len(testo),1000):

>>> ... print len(testo), len(set(testo))

ma non mi rende il risultato che vorrei ottenere, credo che il problema quindi sia proprio nell'iterazione che in questo modo è sbagliata ma non riesco a capire come poter fare altrimenti.


Non vuoi usare un lista perché sei allergico? ;)

Faresti prestissimo invece, usando due righe hai praticamente fatto tutto, ad esempio trasformando il testo in lista con un semplice:
lista_asettica = [i for i in testo.split()]
Otterresti così una lista con una parola per ogni elemento e potresti manipolarla a piacere.

A questo punto un'altra feature di Python ti viene incontro, ed è lo slicing. Infatti con questa tecnica riusciresti a partizionare il tuo oggetto ed inserendolo nel giusto contesto (ciclo), otterresti quello che vuoi. Un esempio di slicing per capirci è lista_asettica[start:stop], che ti mostra solo le prime n parole che hai definito e parlo di parole perché la nostra lista è composta di parole, ricordi? A questo punto non dovresti fare che applicare i tuoi conteggi in un contesto controllato. Lavorerei semplicemente così, senza stare ad impazzire troppo. Metterei certo un controllo su start e stop del mio slicing, così da averne il controllo ad ogni passaggio del mio ciclo.

Ragionando per concetti:
1a. Otterrei una lista con ogni singola parola per elemento, a questo punto saprei quante parole ci sono e quanti giri dovrei fare (semplici calcoli matematici);
1b. Attenzione perché i giri vanno arrotondarli al numero superiore. Ad esempio se fosse 3.2 giri, dovrei arrotondare a 4 e non 3, un bel math.ceil() aiuterà di certo;
2a. Limiterei start e stop nello slicing a seconda del giro;
2b. Farei attenzione, con un if magari, quando si raggiunge l'ultimo giro del ciclo perché a quel punto lo stop sarà la lunghezza della lista_asettica.
3. Stamperei ad ogni passaggio le informazioni volute o le metterei in un qualsiasi oggetto (a gusti).

Il gioco è fatto, tempo tecnico diciamo 10 minuti?

Poi vedi tu, se mi dai un buon motivo per non usare una lista ti seguo senza indugi. Ah, come hai visto niente append(). ;)

Cya
Mi sono divertito a fare una prova per curiosità:

>>> text= '''A questo punto un'altra feature di Python ti viene incontro, ed è lo slicing.
Infatti con questa tecnica riusciresti a partizionare il tuo oggetto ed inserendolo nel 
giusto contesto (ciclo), otterresti quello che vuoi. Un esempio di slicing per capirci è 
lista_asettica[start:stop], che ti mostra solo le prime n parole che hai definito e parlo
 di parole perché la nostra lista è composta di parole, ricordi? A questo punto non dovresti
 fare che applicare i tuoi conteggi in un contesto controllato. Lavorerei semplicemente così,
senza stare ad impazzire troppo. Metterei certo un controllo su start e stop del mio slicing,
 così da averne il controllo ad ogni passaggio del mio ciclo. '''
>>> testlist = text.split()
>>> len(testlist)
111
>>> testlist
['A', 'questo', 'punto', "un'altra", 'feature', 'di', 'Python', 'ti', 'viene', 'incontro,', \
'ed', '\xc3\xa8', 'lo', 'slicing.', 'Infatti', 'con', 'questa', 'tecnica', 'riusciresti', \
'a', 'partizionare', 'il', 'tuo', 'oggetto', 'ed', 'inserendolo', 'nel', 'giusto', 'contesto',\
 '(ciclo),', 'otterresti', 'quello', 'che', 'vuoi.', 'Un', 'esempio', 'di', 'slicing', 'per', \
'capirci', '\xc3\xa8', 'lista_asettica[start:stop],', 'che', 'ti', 'mostra', 'solo', 'le',\
 'prime', 'n', 'parole', 'che', 'hai', 'definito', 'e', 'parlo', 'di', 'parole',\
 'perch\xc3\xa9', 'la', 'nostra', 'lista', '\xc3\xa8', 'composta', 'di', 'parole,', \
'ricordi?', 'A', 'questo', 'punto', 'non', 'dovresti', 'fare', 'che', 'applicare', 'i',\
 'tuoi', 'conteggi', 'in', 'un', 'contesto', 'controllato.', 'Lavorerei', 'semplicemente',\
 'cos\xc3\xac,', 'senza', 'stare', 'ad', 'impazzire', 'troppo.', 'Metterei', 'certo', 'un',\
 'controllo', 'su', 'start', 'e', 'stop', 'del', 'mio', 'slicing,', 'cos\xc3\xac', 'da',\
 'averne', 'il', 'controllo', 'ad', 'ogni', 'passaggio', 'del', 'mio', 'ciclo.']
>>> myset = set(testlist)
>>> myset
set(['certo', 'vuoi.', 'nostra', 'Metterei', 'hai', 'le', 'la', 'lo', 'quello', 'ti', 
'incontro,', 'dovresti', 'non', 'di', 'stop', 'da', 'slicing', 'fare', 'impazzire',\
 'prime', 'giusto', 'A', 'contesto', 'ed', 'controllo', 'troppo.', 'semplicemente', \
'definito', 'per', "un'altra", 'otterresti', 'solo', 'inserendolo', 'cos\xc3\xac',\
 'riusciresti', 'punto', 'Un', 'tuo', 'conteggi', 'slicing,', 'slicing.', 'questa',\
 'applicare', 'questo', 'Infatti', 'con', 'esempio', 'tuoi', 'parole,', 'stare', '\xc3\xa8',\
 'che', 'start', 'oggetto', 'capirci', 'lista', 'tecnica', 'averne', 'n', 'un', 'del',\
 '(ciclo),', 'perch\xc3\xa9', 'ad', 'controllato.', 'il', 'in', 'ogni',\
 'lista_asettica[start:stop],', 'mio', 'Python', 'feature', 'composta', 'mostra', 'viene',\
 'parlo', 'ciclo.', 'nel', 'cos\xc3\xac,', 'Lavorerei', 'a', 'passaggio', 'e', 'i', 'su',\
 'ricordi?', 'senza', 'parole', 'partizionare'])
>>> myset = set()
>>> for word in testlist:
...     if word not in myset:
...             myset.add(word)
... 
>>> myset
set(['certo', 'vuoi.', 'nostra', 'Metterei', 'hai', 'le', 'la', 'lo', 'quello', 'ti', \
'incontro,', 'dovresti', 'non', 'di', 'stop', 'da', 'slicing', 'fare', 'impazzire', 'prime',\
 'giusto', 'A', 'contesto', 'ed', 'controllo', 'troppo.', 'semplicemente', 'definito',\
 'per', "un'altra", 'otterresti', 'solo', 'inserendolo', 'cos\xc3\xac', 'riusciresti',\
 'punto', 'Un', 'tuo', 'conteggi', 'slicing,', 'slicing.', 'questa', 'applicare', 'questo',\
 'Infatti', 'con', 'esempio', 'tuoi', 'parole,', 'stare', '\xc3\xa8', 'che', 'start',\
 'oggetto', 'capirci', 'lista', 'tecnica', 'averne', 'n', 'un', 'del', '(ciclo),',\
 'perch\xc3\xa9', 'ad', 'controllato.', 'il', 'in', 'ogni', 'lista_asettica[start:stop],',\
 'mio', 'Python', 'feature', 'composta', 'mostra', 'viene', 'parlo', 'ciclo.', 'nel',\
 'cos\xc3\xac,', 'Lavorerei', 'a', 'passaggio', 'e', 'i', 'su', 'ricordi?', 'senza',\
 'parole', 'partizionare'])
>>> len(myset)
89

Si può vedere che ci sono alcune parole doppie. Grazie a Daniele per aver fornito il testo :)

C'è comunque una iterazione nel sorgente che aggiunge le parole nel set. Poi nel linguaggio interno di python ci sono molte più iterazioni, come il confronto di parole già presenti nel set.




PS, un redazione per ridurre la larghezza del listato


--- Ultima modifica di F _ in data 2018-12-25 00:01:32 ---

--- Ultima modifica di F _ in data 2018-12-25 00:04:52 ---
Daniele aka Palmux said @ 2018-12-24 20:27:13:
Non vuoi usare un lista perché sei allergico? ;)
più o meno :D



ci riprovo, grazie mille ad entrambi per i suggerimenti!!


Pagina: 1



Esegui il login per scrivere una risposta.