118 lines
2.7 KiB
Python
118 lines
2.7 KiB
Python
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() |