Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Помогите с лабораторной работой по Теории информации, нужен код в программе Python!

Напишите программу на языке программирования Python,
выполняющую следующие действия:

  • чтение текстового сообщения из файла;

  • расчет статистических показателей текста;

  • вывод результатов на экран, в том числе в графическом виде.

Программа должна выполнять следующие функции:

  • Рассчитывать вероятность каждого символа в алфавите сообщения:

алфавит сообщения может быть задан в программе изначально (например,
алфавит русского языка) или формироваться при обработке сообщения.

  • Рассчитывать собственную информацию каждого символа в алфавите.

  • Вычислять значения максимальной и реальной энтропии сообщения, а

так же избыточность.

  • Выводить на экран: символы с наибольшей и наименьшей собственной

информацией; значения максимальной энтропии, реальной энтропии и
избыточности; график распределения вероятности появления символов по
алфавиту в виде гистограммы распределения

И результат в виде скриншота работы кода. В качестве примера текста пусть будет Эдуард Асадов — Стихи о рыжей дворняге

По дате
По рейтингу
Аватар пользователя
5мес
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  
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()