web-dev-qa-db-fra.com

FreqDist avec NLTK

[~ # ~] nltk [~ # ~] dans python a une fonction FreqDist = qui vous donne la fréquence des mots dans un texte. J'essaie de passer mon texte en argument mais le résultat est de la forme:

[' ', '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']

alors que dans l'exemple du site Web [~ # ~] nltk [~ # ~] , le résultat était des mots entiers et pas seulement des lettres. Je le fais de cette façon:

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

Savez-vous ce que j'ai de mauvais pls? Merci!

24
afg102

FreqDist attend un itérable de jetons. Une chaîne est itérable - l'itérateur donne chaque caractère.

Passez d'abord votre texte à un tokenizer et passez les tokens à FreqDist.

40
Alex Brasetvik

FreqDist s'exécute sur un tableau de jetons. Vous lui envoyez un tableau de caractères (une chaîne) où vous auriez dû d'abord tokeniser l'entrée:

words = nltk.tokenize.Word_tokenize(p)
fdist = FreqDist(words)
25
Eran Kampf

Le NLTK FreqDist accepte tout itérable. Comme une chaîne est itérée caractère par caractère, elle sépare les choses de la manière que vous vivez.

Pour compter les mots, vous devez alimenter FreqDist mots. Comment tu fais ça? Eh bien, vous pourriez penser (comme d'autres l'ont suggéré dans la réponse à votre question) pour alimenter le fichier entier en 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 construit des modèles Word à partir de phrases. Il doit être alimenté chaque phrase une par une. Il fera un travail relativement médiocre lorsqu'il recevra des paragraphes entiers ou même des documents.

Alors que faire? Facile, ajoutez un tokenizer de phrases!

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

Une chose à garder à l'esprit est qu'il existe de nombreuses façons de symboliser le texte. Les modules nltk.tokenize.sent_tokenize et nltk.tokenize.Word_tokenize choisissez simplement une valeur par défaut raisonnable pour un texte anglais relativement propre. Il existe plusieurs autres options parmi lesquelles choisir, que vous pouvez lire dans la documentation API .

14
Tim McNamara

Vous devez simplement l'utiliser comme ceci:

import nltk
from nltk.probability import FreqDist

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

La variable fdist est du type "class 'nltk.probability.FreqDist" et contient la distribution de fréquence des mots.

6
Aakash Anuj