Forum >> Principianti >> [risolto] Contare solo alcune ricorrenze di parole in un testo

Pagina: 1

Buongiorno,
dato un file di testo, vorrei contare le ricorrenze delle parole superiori a un certo minimo, ad esempio tutte le quelle ricorrenti da 4 volte in su.
Gli unici metodi che mi vengono in mente per questo tipo di analisi sono l'uso di regex con findall e quello di Counter da collections, con un codice del genere:

def Parole():
 
    ParoleUsateLista = []
    Ricerca = re.findall(r'\w+', FileTesto)
    
    for n in Ricerca:
            ParoleUsateLista.append(n)
    
    ParoleUsate = Counter(ParoleUsateLista)

Se non mi sfugge qualcosa, con findall si può indicare solo la lunghezza minima delle parole da considerare [es. re.findall(r'\w{3,}, FileTesto)] e con Counter se ne possono restituire solo alcune fra quelle trovate [es. Counter(ParoleUsateLista).most_common(10)].

Come posso ottenere il risultato desiderato?
Grazie.


--- Ultima modifica di Idle in data 2018-12-31 14:37:59 ---
Ciao caro, puoi sì usare il count() della list, ma se vuoi un risultato più interessante potresti usare Counter da collections.

>>> l = ["verde", "rosso", "verde", "bianco", "verde", "rosso", "verde", "blu", "giallo", "rosso", "verde", "bianco", "viola"]
>>> l.count("verde")
5

>>> form collections import Counter
>>> Counter(l)
Counter({'verde': 5, 'rosso': 3, 'bianco': 2, 'giallo': 1, 'blu': 1, 'viola': 1})


Ci sono diverse funzionalità che possono aiutarti nella libreria, potresti ad esempio usare most_common() per cercare, ad esempio, i due valori con più occorrenze nella lista.
>>> Counter(l).most_common(2)
[('verde', 5), ('rosso', 3)]
Insomma libera la fantasia.

Cya

Ciao Daniele,
grazie della risposta.
Conosco questi metodi, ma nessuno fa al caso mio, in quanto avrei bisogno di contare solo le parole che superino un dato minimo di occorrenze.
Ad esempio, considerato come minimo di occorrenze 4, nel testo:

"mela mela mela mela pera pera pera"

vorrei poter ottenere solo:

"mela".
grazie della risposta.
Figurati, è un piacere.

Conosco questi metodi, ma nessuno fa al caso mio, in quanto avrei bisogno di contare solo le parole che superino un dato minimo di occorrenze.

Azzardo... forse non li hai approfonditi oppure non hai colto il mio suggerimento di liberare la fantasia? ;)

Ad esempio, considerato come minimo di occorrenze 4, nel testo:

"mela mela mela mela pera pera pera"

vorrei poter ottenere solo:

"mela".

>>> l = "mela mela mela mela pera pera pera".split()
>>> [("{}: {}").format(txt,val) for txt,val in Counter(l).most_common() if val >= 4]
['mela: 4']
Ora tocca a te, hai tutto per venirne a capo.

Cya
Grazie ancora, il tuo suggerimento mi ha aiutato.
Avendo poca padronanza del linguaggio, che provo ad applicare man mano che studio, mi è difficile essere fantasioso perché possiedo poche nozioni tra cui poter scegliere.
Spero di migliorare col tempo.
Ciao.

Ho trovato una soluzione che mi sembra ancora più semplice e che posto per chi avesse il mio stesso problema.
Una volta contate tutte le parole usate presenti nella lista, con la funzione Counter che crea un dizionario, prima faccio una copia del dizionario con copy() e poi rimuovo dalla copia le parole inferiori a un certo numero di ricorrenze con questo metodo:
for k, v in ParoleUsate2.items():
        if v < 3:
            del ParoleUsatek

Quindi la copia del dizionario restituirà e stamperà solo le parole ricorrenti almeno 3 volte, o un altro numero che volessi indicare.



--- Ultima modifica di Idle in data 2018-12-31 14:37:08 ---

--- Ultima modifica di Idle in data 2018-12-31 14:37:17 ---
Sì, la bellezza di Python è che puoi arrivare allo stesso risultato facendo il giro che preferisci. Nel tuo caso, ad esempio, passando da filter():
>>> list(filter(lambda x: x[1] >= 4, Counter(l).most_common()))
[('mela', 4)]
Cosa dicevamo della fantasia? ;)

Ciao e buon anno.
Approfondirò il metodo filter, che conosco solo superficialmente.
Grazie e buon anno anche a te e a tutti i membri del Forum.



--- Ultima modifica di Idle in data 2019-01-05 18:36:18 ---


Pagina: 1



Esegui il login per scrivere una risposta.