import matplotlib.pyplot as plt
from collections import Counter
import math
# чтение текстового сообщения из файла
def read_text_from_file(filename):
with open(filename, 'r', encoding='utf-8') as file:
text = file.read()
return text
# расчет статистических показателей текста
def calculate_probabilities(text):
total_chars = len(text)
char_counts = Counter(text)
probabilities = {char: count / total_chars for char, count in char_counts.items()}
return probabilities
# расчет собственной информации
def calculate_self_information(probabilities):
self_info = {char: -math.log2(p) for char, p in probabilities.items()}
return self_info
# расчет энтропии
def calculate_entropy(probabilities):
entropy = -sum(p * math.log2(p) for p in probabilities.values() if p > 0)
return entropy
# расчет максимальной энтропии
def calculate_max_entropy(alphabet_size):
return math.log2(alphabet_size)
# расчета избыточности
def calculate_redundancy(max_entropy, real_entropy):
return max_entropy - real_entropy
# основная функция
def main():
filename = 'text.txt' # Имя файла с текстом
text = read_text_from_file(filename)
text = text.replace('\\n', '').replace(' ', '')
# вероятности
probabilities = calculate_probabilities(text)
# собственная информация
self_info = calculate_self_information(probabilities)
# реальная энтропия
real_entropy = calculate_entropy(probabilities)
# максимальная энтропии
alphabet_size = len(probabilities)
max_entropy = calculate_max_entropy(alphabet_size)
# избыточность
redundancy = calculate_redundancy(max_entropy, real_entropy)
# вывод
print("Символы с наибольшей собственной информацией:")
sorted_self_info = sorted(self_info.items(), key=lambda x: x[1], reverse=True)
for char, info in sorted_self_info[:5]:
print(f"Символ: '{char}', Собственная информация: {info:.4f} бит")
print("\\nСимволы с наименьшей собственной информацией:")
for char, info in sorted_self_info[-5:]:
print(f"Символ: '{char}', Собственная информация: {info:.4f} бит")
print(f"\\nМаксимальная энтропия: {max_entropy:.4f} бит")
print(f"Реальная энтропия: {real_entropy:.4f} бит")
print(f"Избыточность: {redundancy:.4f} бит")
# гистограмма распределения вероятностей
chars = list(probabilities.keys())
probs = list(probabilities.values())
plt.figure(figsize=(10, 6))
plt.bar(chars, probs)
plt.xlabel('Символы')
plt.ylabel('Вероятность')
plt.title('Распределение вероятности появления символов')
plt.show()
if __name__ == "__main__":
main()
выполняющую следующие действия:
- вывод результатов на экран, в том числе в графическом виде.
Программа должна выполнять следующие функции:- Рассчитывать вероятность каждого символа в алфавите сообщения:
алфавит сообщения может быть задан в программе изначально (например,алфавит русского языка) или формироваться при обработке сообщения.
- Рассчитывать собственную информацию каждого символа в алфавите.
- Вычислять значения максимальной и реальной энтропии сообщения, а
так же избыточность.- Выводить на экран: символы с наибольшей и наименьшей собственной
информацией; значения максимальной энтропии, реальной энтропии иизбыточности; график распределения вероятности появления символов по
алфавиту в виде гистограммы распределения
И результат в виде скриншота работы кода. В качестве примера текста пусть будет Эдуард Асадов — Стихи о рыжей дворняге