Чтобы приблизиться к ожидаемому результату, вы можете отредактировать метод analize
:
def analyze(self):
words = self.raw_data.split()
word_pairs = [[words[i],words[i+1]] for i in range(len(words)-1)]
self.word_map = dict()
for word in list(set(words)):
pairword = []
for pair in word_pairs:
if word == pair[0]:
pairword.append(pair[1])
self.word_map[word] = Counter(pairword).most_common()
Это печатает:
{'Baby': [('You', 1)],
'I': [('Miss', 2), ('Love', 1)],
'Love': [('you', 1)],
'Miss': [('you', 3)],
'You': [('are', 1)],
'are': [('the', 1)],
'best': [('I', 1)],
'the': [('best', 1)],
'you': [('I', 1), ('Miss', 1), ('Baby', 1)]}
Что вы хотите, но не отсортированы. Вам нужно написать собственный метод печати, который сделает сортировку за вас.
Например, добавив в класс следующий метод:
def printfreq(self):
sortkeys = sorted(self.word_map, key=lambda k:max(self.word_map[k], key=lambda val:val[1], default=(None, 0))[1], reverse=True)
for kk in sortkeys:
pprint.pprint(f"{kk} : {self.word_map[kk]}")
и замена строки pprint.pprint(self.word_map)
на self.printfreq()
приводит к печати:
"Miss : [('you', 3)]"
"I : [('Miss', 2), ('Love', 1)]"
"you : [('I', 1), ('Miss', 1), ('Baby', 1)]"
"Love : [('you', 1)]"
"the : [('best', 1)]"
"You : [('are', 1)]"
"best : [('I', 1)]"
"Baby : [('You', 1)]"
"are : [('the', 1)]"
Длинный ключ сортировки позволяет сортировать ключи словаря по максимальной частоте в списке.
EDIT
Я добавил аргумент по умолчанию к max
. Это позволяет избежать ValueError: max() arg is an empty sequence
, который может возникнуть, если на входе есть одно или несколько неповторяющихся слов.