Это должно сделать это ...
Сначала настройте ваш набор данных (или аналогичный):
import pandas as pd
from nltk.collocations import *
import nltk.collocations
from nltk import ngrams
from collections import Counter
s = pd.Series(
[
['coffee', 'maker', 'brewing', 'properly', '2', '420', '420', '420'],
['galley', 'work', 'table', 'stuck'],
['cloth', 'stuck'],
['stuck', 'coffee']
]
)
finder = BigramCollocationFinder.from_documents(s.values)
bigram_measures = nltk.collocations.BigramAssocMeasures()
# only bigrams that appear 1+ times
finder.apply_freq_filter(1)
# return the 10 n-grams with the highest PMI
result = finder.nbest(bigram_measures.pmi, 10)
Используйте nltk.ngrams
, чтобы воссоздать список ngrams:
ngram_list = [pair for row in s for pair in ngrams(row, 2)]
Используйте collections.Counter
, чтобы подсчитать, сколько раз каждая нграм появляется во всем корпусе:
counts = Counter(ngram_list).most_common()
Создайте DataFrame, который выглядит так, как вы хотите:
pd.DataFrame.from_records(counts, columns=['gram', 'count'])
gram count
0 (420, 420) 2
1 (coffee, maker) 1
2 (maker, brewing) 1
3 (brewing, properly) 1
4 (properly, 2) 1
5 (2, 420) 1
6 (galley, work) 1
7 (work, table) 1
8 (table, stuck) 1
9 (cloth, stuck) 1
10 (stuck, coffee) 1
Затем вы можете отфильтровать, чтобы посмотреть только те нграммы, которые были получены вашим finder.nbest
вызовом:
df = pd.DataFrame.from_records(counts, columns=['gram', 'count'])
df[df['gram'].isin(result)]