import math class Element: id = "" count = 0 p_x_i = 0 I_x_i = 0 def __init__(self, id): self.id = id self.count = 1 def find_element(list, target_it): for element in list: if element.id == target_it: return element return None def read_text_file(): path = './text.txt' with open(path, 'r', encoding='utf-8') as file: content = file.read() return content def Z_statistik(): # Ergebnisse mit https://de.planetcalc.com/2476/ prüfbar message = read_text_file() m = len(message) elements = [] for char in message: entry = find_element(elements, char) if entry is not None: entry.count += 1 else: elements.append(Element(char)) calculate(elements, m, message) def Z2_statistik(): message = read_text_file() m = len(message) - 1 # Letztes Zeichen kann kein Tupel mit "nichts" bilden elements = [] for i, char in enumerate(message): if i < m: tuple = char + message[i+1] entry = find_element(elements, tuple) if entry is not None: entry.count += 1 else: elements.append(Element(tuple)) calculate(elements, m, message) def W_statistik(): message = read_text_file() m = 0 i = 0 elements = [] l = len(message) while i < l: word = "" if message[i].isalpha(): # Fange ein Wort an word += message[i] # füge Zeichen hinzu bis Wortende erreicht ist while i+1 is not l and message[i+1].isalpha(): i += 1 word += message[i] # Erhöhe die Anzahl der Wörter in der Nachricht m += 1 # Zähle die Häufigkeit der Wörter entry = find_element(elements, word) if entry is not None: entry.count += 1 else: elements.append(Element(word)) # gehe weiter in der Nachricht i += 1 calculate(elements, m, message) def calculate(elements, m, message): h = 0 for element in elements: element.p_x_i = element.count / m element.I_x_i = -1 * math.log2(element.p_x_i) h += element.p_x_i * element.I_x_i # Ausgabe elements.sort(key = lambda element: element.count, reverse = True) for element in elements: print(f"{element.count:3.0f} | {element.p_x_i:10.7f} | {element.I_x_i:10.7f} | »{element.id}«") print("Entropie = " + h.__str__() + "\n\n") def main(): Z_statistik() Z2_statistik() W_statistik() if __name__ == '__main__': main()