FreqDist con NLTK

NLTK en python tiene una función FreqDist que le da la frecuencia de las palabras dentro de un texto. Estoy tratando de pasar mi texto como argumento, pero el resultado tiene la forma:

[' ', 'e', 'a', 'o', 'n', 'i', 't', 'r', 's', 'l', 'd', 'h', 'c', 'y', 'b', 'u', 'g', '\n', 'm', 'p', 'w', 'f', ',', 'v', '.', "'", 'k', 'B', '"', 'M', 'H', '9', 'C', '-', 'N', 'S', '1', 'A', 'G', 'P', 'T', 'W', '[', ']', '(', ')', '0', '7', 'E', 'J', 'O', 'R', 'j', 'x']

mientras que en el ejemplo de la NLTK sitio web, el resultado fueron palabras completas, no solo letras. Lo estoy haciendo de esta manera:

file_y = open(fileurl)
p = file_y.read()
fdist = FreqDist(p)
vocab = fdist.keys()
vocab[:100]

¿Sabes lo que tengo mal por favor? ¡Gracias!

preguntado el 08 de enero de 11 a las 16:01

Agregue un enlace al ejemplo. -

NB, el mejor idioma de Python es: with open(fileurl) as file_y: ... or for line in open(file url): -

6 Respuestas

FreqDist espera un iterable de tokens. Una cadena es iterable --- el iterador produce todos los caracteres.

Primero pasa tu texto a un tokenizador y pasa los tokens a FreqDist.

Respondido el 08 de enero de 11 a las 19:01

De hecho lo hace, pero su docstring no dice que dondequiera, ni sus mensajes de error, y sería trivial para su __init__() para generar un mensaje de error que lo diga en una entrada que no sea un iterador, o aceptar una secuencia y convertirla en un iterador. - smci

@ afg102 Si ha funcionado, acepte la respuesta para que otros también sepan cuál es la solución al problema. - rishi

FreqDist se ejecuta en una serie de tokens. Le está enviando una matriz de caracteres (una cadena) donde debería haber tokenizado la entrada primero:

words = nltk.tokenize.word_tokenize(p)
fdist = FreqDist(words)

Respondido el 28 de junio de 11 a las 03:06

NLTK's FreqDist acepta cualquier iterable. A medida que una cadena se repite carácter por carácter, está separando las cosas de la forma en que estás experimentando.

Para poder contar palabras, necesitas alimentar FreqDist palabras. ¿Cómo haces eso? Bueno, podría pensar (como otros han sugerido en la respuesta a su pregunta) enviar todo el archivo a nltk.tokenize.word_tokenize.

>>> # first, let's import the dependencies
>>> import nltk
>>> from nltk.probability import FreqDist

>>> # wrong :(
>>> words = nltk.tokenize.word_tokenize(p)
>>> fdist = FreqDist(words)

word_tokenize construye modelos de palabras a partir de oraciones. Debe alimentarse con cada oración de una en una. Hará un trabajo relativamente pobre cuando se le proporcionen párrafos completos o incluso documentos.

¿Entonces lo que hay que hacer? ¡Fácil, agrega un tokenizador de oración!

>>> fdist = FreqDist()
>>> for sentence in nltk.tokenize.sent_tokenize(p):
...     for word in nltk.tokenize.word_tokenize(sentence):
>>>         fdist[word] += 1

Una cosa a tener en cuenta es que hay muchas formas de tokenizar texto. Los modulos nltk.tokenize.sent_tokenize y nltk.tokenize.word_tokenize simplemente elija un valor predeterminado razonable para un texto en inglés relativamente limpio. Hay varias otras opciones para elegir, sobre las que puede leer en el Documentación de la API.

Respondido 04 Oct 17, 02:10

¡El OP no quiere frecuencias de letras! (nadie más lo hace tampoco ...) Quieren frecuencias de palabras. - smci

En realidad, las frecuencias de las letras son características muy comunes para la detección automática de idiomas. - Tim McNamara

Es cierto, para ese nicho. También descifrado. Aunque en general no mucho. - smci

Respuesta realmente útil, sin embargo, parece estar un poco desactualizada: AttributeError: 'FreqDist' object has no attribute 'inc'. Sin quejarse, simplemente tirándolo para que otros se den cuenta de esto. Intentaré encontrar una respuesta a esto;) Gracias - Aleksander Lidtke

Sí, ¡las cosas han cambiado bastante en algunas de las API internas de NLTK en los últimos 5 años! Actualizará el código :) - Tim McNamara

Simplemente tienes que usarlo así:

import nltk
from nltk.probability import FreqDist

sentence='''This is my sentence'''
tokens = nltk.tokenize.word_tokenize(sentence)
fdist=FreqDist(tokens)

La variable fdist es del tipo "class 'nltk.probability.FreqDist" y contiene la distribución de frecuencia de las palabras.

contestado el 20 de mayo de 19 a las 18:05

Your_string = "here is my string"
tokens = Your_string.split()

Hágalo de esta manera, y luego use el NLTK funciones

le dará sus tokens en palabras pero no en caracteres

Respondido 29 Feb 20, 12:02

text_dist = nltk.FreqDist(word for word in list(text) if word.isalpha())
top1_text1 = text_dist.max()
maxfreq = top1_text1

Respondido 03 Oct 20, 19:10

Si bien este código puede responder la pregunta, sería mejor explicar cómo resuelve el problema sin presentar a otros y por qué usarlo. Las respuestas de solo código no son útiles a largo plazo. - jnovack

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.