У меня небольшой опыт работы с программированием, но я начал изучать python и хотел бы создать функцию для подсчета наиболее часто встречающихся слов в тексте. Теперь я уверен, что моя версия не лучший способ сделать это, но он работает:
import os
punctuation = "~!@#$%^&*()_-=+[{]}\\|'\";:,<.>/?"
def remove_punctuation(text):
text_wo_punctuation = ""
for word in text:
if word not in punctuation:
text_wo_punctuation += word
return text_wo_punctuation
with open(r'New Text Document.txt') as f:
text = f.read().lower()
t = remove_punctuation(text).split()
dictionary = {}
for word in t:
if word in dictionary:
dictionary[word] = dictionary[word] + 1
else:
dictionary[word] = 1
print(dictionary)
def top_five(d):
top = {}
value1 = 0
value2 = 0
value3 = 0
value4 = 0
value5 = 0
for key in dictionary:
if value1 < dictionary[key] and key not in top:
value1 = dictionary[key]
top1 = {key:value1}
else:
continue
top.update(top1)
for key in dictionary:
if value2 < dictionary[key] and key not in top:
value2 = dictionary[key]
top2 = {key:value2}
else:
continue
top.update(top2)
for key in dictionary:
if value3 < dictionary[key] and key not in top:
value3 = dictionary[key]
top3 = {key:value3}
else:
continue
top.update(top3)
for key in dictionary:
if value4 < dictionary[key] and key not in top:
value4 = dictionary[key]
top4 = {key:value4}
else:
continue
top.update(top4)
for key in dictionary:
if value5 < dictionary[key] and key not in top:
value5 = dictionary[key]
top5 = {key:value4}
else:
continue
top.update(top5)
return top
print(top_five(dictionary))
Приведенный выше код даст следующий вывод:
{'word1': «freq1», «word2»: «freq2», «word3»: «freq3», «word4»: «freq4», «word5»: «freq5»}
Несмотря на то, что это результат, который я хочу, я попытался упростить свою функцию и позволить пользователю выбрать, для скольких слов он должен считать частоту:
def top_five(d,n):
top = {}
values = {}
for i in range(1,n+1):
values["value"+str(i)]=0
for i in range(1,n+1):
top["top"+str(i)]=0
for i in range(1,n+1):
for key in dictionary :
if values["value"+str(i)] < dictionary[key] and key not in top:
values["value"+str(i)] = dictionary[key]
top["top"+str(i)] = {key:values["value"+str(i)]}
else:
continue
top.update(top1)
print(top)
return top
Этот код создаст словарь со значением1, значением2 и т. Д., Который я мог бы использовать в своем цикле, и другой словарь с top1, top2 и т. Д., Но он не будет работать, поскольку "и ключ не в верхней части" не будет работать.
top["top"+str(i)] = {key:values["value"+str(i)]}
это создаст словарь внутри словаря. Я застрял в этом, так как не смог найти способ сделать «верхний» словарь полезным или перебрать имя переменной внутри цикла. Я читал, что списки или словари должны использоваться, и эта итерация имени переменной не очень хорошая идея, но я не понимаю, почему это так, и я не могу придумать, как сделать списки или словари полезными в моем цикле for.
Как я уже сказал, я знаю, что это может быть не лучшим подходом при создании такого рода функций, но мой вопрос: как я могу упростить тот, который я уже сделал, и получить цикл работающий?
Спасибо!