python nlp nltk

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



nlp (1)

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

De los docs :

Una distribución de frecuencia para los resultados de un experimento. Una distribución de frecuencia registra el número de veces que se produjo 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 un mapeo de funciones de cada muestra al número de veces que esa muestra ocurrió como resultado.

docs y, esencialmente, no hay diferencia en términos de cómo se inicializa un Counter y FreqDist , consulte https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106

Entonces, en cuanto a velocidad, crear un Counter y FreqDist debería ser lo mismo. La diferencia de velocidad debe ser insignificante, pero es bueno tener en cuenta que los gastos generales podrían ser:

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

La principal diferencia son las diversas funciones que proporciona FreqDist para el FreqDist estadístico / probabilístico del lenguaje natural (PNL), por ejemplo, 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 padre de Counter por lo que la velocidad de recuperación de la lista ordenada most_common es la misma para ambos tipos.

Personalmente, cuando solo quiero recuperar cuentas, uso collections.Counter . Pero cuando necesito hacer alguna manipulación estadística, uso nltk.FreqDist o volcaría el Counter en un pandas.DataFrame (consulte Transformar un objeto Counter en un Pandas DataFrame ).

Quiero calcular las frecuencias de palabras de un corpus de texto. He estado usando word_tokenize de NLTK seguido de probabilidad. FreqDist durante algún tiempo para hacer esto. El word_tokenize devuelve una lista, que FreqDist convierte a una distribución de frecuencia. Sin embargo, recientemente me encontré con la función de contador en colecciones (collections.Counter), 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 en que uno funcionaría y el otro no?