Contando el número de palabras únicas en un documento con Python

Soy un novato de Python que intenta comprender la respuesta que se da aquí a la pregunta de contar palabras únicas en un documento. La respuesta es:

print len(set(w.lower() for w in open('filename.dat').read().split())) 

Lee todo el archivo en la memoria, lo divide en palabras usando espacios en blanco, convierte cada palabra a minúsculas, crea un conjunto (único) de las palabras en minúscula, las cuenta e imprime el resultado

Para intentar entender eso, estoy intentando implementarlo en Python paso a paso. Puedo importar el mosaico de texto usando abrir y leer, dividirlo en palabras individuales usando dividir y hacerlos todos en minúscula usando más bajo. También puedo crear un conjunto de palabras únicas en la lista. Sin embargo, no puedo averiguar cómo hacer la última parte: cuente el número de palabras únicas.

Pensé que podría terminar iterando a través de los elementos en el conjunto de palabras únicas y contándolos en la lista minúscula original, pero encuentro que la construcción del conjunto no es indexable.

Así que supongo que estoy tratando de hacer algo que en lenguaje natural es como, para todos los elementos del conjunto, dígame cuántas veces aparecen en la lista de minúsculas. Pero no sé cómo hacerlo, y sospecho que algún malentendido subyacente de Python me está frenando.

  • EDITAR –

Chicos gracias por las respuestas. Me acabo de dar cuenta de que no me expliqué correctamente. Quería encontrar no solo el número total de palabras únicas (que entiendo es la longitud del conjunto) sino también el número de veces que se usó cada palabra individual, por ejemplo, ‘el’ fue usado 14 veces, ‘y’ fue usado 9 veces, ‘it’ fue usado 20 veces y así sucesivamente. Disculpas por la confusión.

Creo que Counter es todo lo que necesitas en este caso:

 from collections import Counter print Counter(yourtext.split()) 

Puede calcular la cantidad de elementos en un conjunto, lista o tupla de la misma manera con len(my_set) o len(my_list) .

Edición: Calcular el número de veces que se usa una palabra, es algo diferente.
Aquí el enfoque obvio:

 count = {} for w in open('filename.dat').read().split(): if w in count: count[w] += 1 else: count[w] = 1 for word, times in count.items(): print "%s was found %d times" % (word, times) 

Si desea evitar la cláusula if, puede consultar collections.defaultdict .

Un conjunto , por definición, contiene elementos únicos (en su caso, no puede encontrar la misma ‘cadena de casillas más bajas’ dos veces allí). Entonces, lo que tienes que hacer es simplemente obtener el recuento de elementos en el conjunto = la longitud del conjunto = len(set(...))

Tu pregunta ya contiene la respuesta. Si s es el conjunto de palabras únicas en el documento, entonces len(s) da el número de elementos en el conjunto, es decir, el número de palabras únicas en el documento .

Puedes usar Contador

 from collections import Counter c = Counter(['mama','papa','mama']) 

El resultado de c será

 Counter({'mama': 2, 'papa': 1}) 

Yo diría que ese código cuenta el número de palabras distintas , no el número de palabras únicas , que es el número de palabras que aparecen solo una vez.

Esto cuenta el número de veces que aparece cada palabra:

 from collections import defaultdict word_counts = defaultdict(int) for w in open('filename.dat').read().split(): word_counts[w.lower()] += 1 for w, c in word_counts.iteritems(): print w, "occurs", word_counts[w], "times"