Paraula més repetida d’un texte

Valor més “gran” en un diccionari

La funció par_freq_dicc(dPars) donat un diccionari dPars on les claus són paraules i els valors són enters que representen el número de vegades que han aparegut en un texte, obté i retorna la paraula més repetida i el número de vegades que es repeteix. Si n’hi ha més d’una retorna la paraula lexicogràficament més petita. Se suposa que el diccionari no és buit.

>>> d = { 'hola': 3, 'adeu': 4, 'tal': 2, 'ada': 1, 'qual': 4 }
>>> par_freq_dicc(d)
('adeu', 4)

A continuació hi han dues posibles solucions:

  • Opció A. Recórrer el diccionari amb un for clau in dicc:

    def par_freq_dicc(dPars):
        nMax = 0
        for par in dPars:
            n = dPars[par]
            if n > nMax or (n == nMax and par < parMax):
                nMax = n
                parMax = par
        return (parMax, nMax)
    
  • Opció B. Ordenar TOTA la llista de parelles (clave, valor) per valor:

    import operator    # Ens permet fer servir itemgetter per
                       # determinar com ordena la funció sorted
    
    def par_freq_dicc_B(dPars):
        li = dPars.items()
        # Per ordenar per aparicions (decreixent) i, en cas d'empat,
        # per paraula (lexicogràficament creixent):
        # [A]. Ordena per paraula en ordre creixent
        #      itemgetter(0) obté la primera component de la parella (paraula)
        ls1 = sorted(li,  key=operator.itemgetter(0))
        # [B]. Ordena per aparicions en ordre decreixent (reverse=True)
        #      itemgetter(1) obté la segona component de la parella (aparicions)
        ls2 = sorted(ls1, key=operator.itemgetter(1), reverse=True)
        return (ls2[0][0], ls2[0][1])
    

Diccionari de freqüència de paraules d’un string

Dissenya una funció par_freq_string(s) que donat un string s, trobi la paraula més repetida, i retorni quina és i quin és el número de vegades que es repeteix. Si n’hi ha més d’una retorna la paraula més petita. Pots suposar que el string s conté com a mínim una paraula.

>>> par_freq_string('Príamo y un viejo heraldo se dirigen hacia el \
                     campamento aqueo: en el camino encuentran a \
                     Hermes (enviado por Zeus), que los ayuda a \
                     pasar inadvertidos hasta la tienda de \
                     Aquiles. Príamo ruega a Aquiles le entregue \
                     el cadáver de Héctor y ofrece regalos, que \
                     Aquiles conmovido acepta. Luego Príamo pide a \
                     Aquiles un lecho para que lo acoja el sueño, \
                     y el hijo de Peleo ordena que se dispongan \
                     dos lechos; uno para Príamo y otro para su \
                     heraldo. Después, Aquiles da, por petición \
                     del anciano Príamo, once días para los \
                     funerales de Héctor, de modo que el duodécimo \
                     día los troyanos volverían a pelear')
('el', 6)

Completa el codi de la funció que tens a continuació:

def par_freq_string(s):
    # Diccionari inicial sense paraules:
    d = {}
    # Obtenir la llista de paraules a partir del stgring s:
    lp = s.split()
    for par in lp:
        # Comprovar si la paraula par és al diccionari:
    # Retorna el resultat obtingut per la funció par_freq_dicc

Diccionari de freqüència de paraules d’un fitxer

Dissenya una funció par_freq_fitxer(nomFitxer) que donat el nom d’un fitxer nomFitxer, trobi la paraula més repetida al texte del fitxer, i retorni quina és i quin és el número de vegades que es repeteix. Si n’hi ha més d’una retorna la paraula més petita. Pots suposar que el texte del fitxer nomFitxer conté com a mínim una paraula.

S’ha de fer servir la funció anterior par_freq_string. El fitxer suzanne.txt conté la lletra de la cançó Suzanne de Leonard Cohen, i el fitxer miranda.txt el texte del tema Priscilla de Miranda Lambert.

>>> par_freq_fitxer('suzanne.txt')
('And', 20)
>>> par_freq_fitxer('miranda.txt')
('to', 26)

A continuació hi ha una posible solució:

def par_freq_fitxer(infile):
    with open(infile, 'r') as f:
        texte = f.read()
    return par_freq_string(texte)    # es retorna el resultat de la funció
    # O, en dos passos:
    # parMax, nMax = par_freq_string(texte)
    # return (parMax, nMax)