2013-01-16 11 views
15

Mam następujący kod. Wiem, że mogę użyć funkcji apply_freq_filter do odfiltrowania kolokacji, które są mniejsze od liczby częstotliwości. Nie wiem jednak, jak uzyskać w tekście częstotliwości wszystkich krotek n-gramowych (w moim przypadku - w gramach), zanim zdecyduję, jaką częstotliwość ustawić dla filtrowania. Jak widać używam klasy kolokacji nltk.zliczanie częstotliwości n-gram w python 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) 
+3

Czy próbowałeś 'finder.ngram_fd.viewitems()'? –

+0

Dzięki finder.ngram_fd.viewitems() działa! – Rkz

Odpowiedz

10

Funkcja finder.ngram_fd.viewitems() działa

24

NLTK przychodzi z własną bigrams generator, a także dogodnym FreqDist() funkcji.

Po uzyskaniu dostępu do BiGrams i dystrybucji częstotliwości można filtrować według własnych potrzeb.

Nadzieję, że pomaga.

+0

To pozostawia mnie z 'File" /usr/local/lib/python3.6/site-packages/nltk/util.py ", wiersz 467, w ngrams , podczas gdy n> 1: TypeError: '>' nie jest obsługiwane pomiędzy instancje 'str' i 'int'' – m02ph3u5

0
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() 
+0

wystarczy wstawić wcięcia po "if"; Kod działa, gdy python 3.5 – Vahab

Powiązane problemy