web-dev-qa-db-fra.com

compter la fréquence de n-grammes en python nltk

J'ai le code suivant. Je sais que je peux utiliser la fonction apply_freq_filter pour filtrer les collocations inférieures au nombre de fréquences. Cependant, je ne sais pas comment obtenir les fréquences de tous les n-grammes (dans mon cas bi-gram) dans un document, avant de décider de la fréquence à définir pour le filtrage. Comme vous pouvez le constater, j'utilise la classe de collocations Nltk.

import nltk
from nltk.collocations import *
line = ""
open_file = open('a_text_file','r')
for val in open_file:
    line += val
tokens = line.split()

bigram_measures = nltk.collocations.BigramAssocMeasures()
Finder = BigramCollocationFinder.from_words(tokens)
Finder.apply_freq_filter(3)
print Finder.nbest(bigram_measures.pmi, 100)
20
Rkz

La fonction Finder.ngram_fd.viewitems() fonctionne

10
Rkz

NLTK est livré avec son propre bigrams generator, ainsi qu'une fonction pratique FreqDist().

f = open('a_text_file')
raw = f.read()

tokens = nltk.Word_tokenize(raw)

#Create your bigrams
bgs = nltk.bigrams(tokens)

#compute frequency distribution for all the bigrams in the text
fdist = nltk.FreqDist(bgs)
for k,v in fdist.items():
    print k,v

Une fois que vous avez accès aux BiGrams et aux distributions de fréquence, vous pouvez filtrer selon vos besoins.

J'espère que cela pourra aider.

28
Ram Narasimhan
from nltk import FreqDist
from nltk.util import ngrams    
def compute_freq():
   textfile = open('corpus.txt','r')

   bigramfdist = FreqDist()
   threeramfdist = FreqDist()

   for line in textfile:
        if len(line) > 1:
        tokens = line.strip().split(' ')

        bigrams = ngrams(tokens, 2)
        bigramfdist.update(bigrams)
compute_freq()
1
Vahab