2013-11-01 2 views
0

Я хотел бы иметь мои самые популярные слова в моем FreqDist. Или слова, которые имеют freq> p.Выполнить пороговое значение в nltk.FreqDist

Как это сделать?

После просмотра doc я ничего не нашел threshold или cut. Кроме того, функция freq() может быть вызвана только для каждого отдельного бина.

Конечно, я могу написать одноранговый код, как

[(x,f) for x in FreqDist.samples if FreqDist.freq(x) > p] 

, но это не выглядит элегантно.

+1

Почему это не элегантно? Я бы просто написал '[x for x в FreqDist, если FreqDist [x]> p]' или '[(x, f) для (x, f) в FreqDist.items(), если f> p]' – taleinat

+0

As @taleinat предложенный ниже, сортировка была уже рассчитана внутренне, поэтому все, что делает это снова, считается со мной не изящным. – SolessChong

ответ

0

В соответствии с docs Вы упоминали, FreqDist «ы Dict-подобные методы (keys(), items() и т.д.) Образцы возврата и/или их частоты, упорядоченные в порядке убывания частоты. Таким образом, вы можете использовать такой код, как показано ниже, чтобы отфильтровать только образцы с достаточно высокими частотами:

above_p = [] 
for (x, f) in FreqDist.iteritems(): 
    if not f > p: 
     break 
    above_p.append((x, f)) 

Или один-лайнер:

from itertools import takewhile 
above_p = [(x, f) for (x, f) in takewhile(lambda x, f: f > p, FreqDist.iteritems())] 

Что касается верхней к:

top_k = FreqDist.items()[:k] 

или:

from itertools import islice 
top_k = list(islice(FreqDist.iteritems(), k)) 
+0

Прохладный. Раньше я этого не замечал. И я заметил, что 'FreqDist.plot()' имеет механизм внутренней сортировки. – SolessChong

Смежные вопросы