Я написал эти функции ранее для генерации ngrams
и нахождения там частоты:
import nltk
def generate_ngrams(text, n_gram=2):
token = [token for token in text.strip().lower().split(" ")]
ngrams = zip(*[token[i:] for i in range(n_gram)])
return [" ".join(ngram) for ngram in ngrams]
def ngram_freq(column, topn = 50, min_count = None, n_gram = 2):
ngrams = [ngram for text in column for ngram in generate_ngrams(text, n_gram)]
if min_count is None:
return sorted(nltk.FreqDist(ngrams).items(), key = lambda x: x[1], reverse = True)[:topn]
else:
return [(x,y) for x,y in nltk.FreqDist(ngrams).items() if y>=min_count]
# return sorted(nltk.FreqDist(ngrams).items(), key = lambda x: x[1], reverse = True)[:topn]
generate_ngrams('This is an Example')
> ['this is', 'is an', 'an example']
generate_ngrams('This is an Example', n_gram=3)
> ['this is an', 'is an example']
ngram_freq вернет кортеж с ngram и его частотой, в зависимости от переданных параметров:
text_list = ['I am StackOverflow', 'I am StackOverflow not really',
'Example Statement for StackOverflow',
'Statement for StackOverflow']
ngram_freq(text_list, min_count=2)
> [('i am', 2),
('am stackoverflow', 2),
('statement for', 2),
('for stackoverflow', 2)]
Он также может возвращать счетчик top_n:
ngram_freq(text_list, topn=2)
> [('i am', 2), ('am stackoverflow', 2)]
Таким образом, для вашего случая вы можете передать столбец (df['keyword']
) в функцию ngram_freq
и добавить параметр min_count
в качестве 20000, и ngram
может быть любым, что вы предпочитаете.