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)
La fonction Finder.ngram_fd.viewitems()
fonctionne
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.
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()