Diferencia entre las colecciones de Python.Counter y nltk.probability.FreqDist

Quiero calcular el término-frecuencia de las palabras en un corpus de texto. He estado usando word_tokenize de NLTK seguido de probabilidad.FreqDist por algún tiempo para hacer esto. El word_tokenize devuelve una lista, que se convierte en una distribución de frecuencia por FreqDist. Sin embargo, recientemente encontré la función Contador en colecciones (colecciones.Contador), que parece estar haciendo exactamente lo mismo. Tanto FreqDist como Counter tienen una función most_common (n) que devuelve las n palabras más comunes. ¿Alguien sabe si hay una diferencia entre estos dos? ¿Es uno más rápido que el otro? ¿Hay casos donde uno trabajaría y el otro no?

nltk.probability.FreqDist es una subclase de collections.Counter .

De los documentos :

Una distribución de frecuencia para los resultados de un experimento. Una distribución de frecuencia registra la cantidad de veces que ha ocurrido cada resultado de un experimento. Por ejemplo, una distribución de frecuencia podría usarse para registrar la frecuencia de cada tipo de palabra en un documento. Formalmente, una distribución de frecuencia se puede definir como una función de mapeo de cada muestra al número de veces que la muestra ocurrió como resultado.

La herencia se muestra explícitamente desde el código y, esencialmente, no hay diferencia en cuanto a cómo se inicializa un Counter y FreqDist , consulte https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106

Por lo tanto, en cuanto a la velocidad, la creación de un Counter y un FreqDist debería ser igual. La diferencia de velocidad debe ser insignificante, pero es bueno tener en cuenta que los gastos generales podrían ser:

  • La comstackción de la clase al definirla en un intérprete.
  • el costo de la escritura de pato .__init__()

La principal diferencia es la variedad de funciones que FreqDist proporciona para el procesamiento de lenguaje natural estadístico / probabilístico (PNL), por ejemplo, para encontrar hapaxes . La lista completa de funciones que FreqDist extiende Counter es la siguiente:

 >>> from collections import Counter >>> from nltk import FreqDist >>> x = FreqDist() >>> y = Counter() >>> set(dir(x)).difference(set(dir(y))) set(['plot', 'hapaxes', '_cumulative_frequencies', 'r_Nr', 'pprint', 'N', 'unicode_repr', 'B', 'tabulate', 'pformat', 'max', 'Nr', 'freq', '__unicode__']) 

Cuando se trata de usar FreqDist.most_common() , en realidad está usando la función principal de Counter por lo que la velocidad de recuperación de la lista most_common ordenada es la misma para ambos tipos.

Personalmente, cuando solo quiero recuperar cuentas, uso collections.Counter . Pero cuando necesito realizar alguna manipulación estadística, o uso nltk.FreqDist o vuelco el Counter en un pandas.DataFrame (consulte Transformar un objeto de contador en un Marco de datos de Pandas ).