empty_element durch eine Klasse Element ersetzt, Anpassung der Funktionen
This commit is contained in:
89
P1/main.py
89
P1/main.py
@@ -1,13 +1,23 @@
|
||||
import math
|
||||
|
||||
empty_element = {
|
||||
"count" : 1,
|
||||
"p(x_i)" : 0,
|
||||
"I(x_i)" : 0
|
||||
}
|
||||
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 = '/Users/safak/Documents/UNI/IT/P1/text.txt'
|
||||
path = './text.txt'
|
||||
|
||||
with open(path, 'r', encoding='utf-8') as file:
|
||||
content = file.read()
|
||||
@@ -19,13 +29,14 @@ def Z_statistik():
|
||||
|
||||
m = len(message)
|
||||
|
||||
elements = {}
|
||||
elements = []
|
||||
|
||||
for char in message:
|
||||
if elements.__contains__(char):
|
||||
elements[char]["count"] += 1
|
||||
entry = find_element(elements, char)
|
||||
if entry is not None:
|
||||
entry.count += 1
|
||||
else:
|
||||
elements[char] = empty_element.copy()
|
||||
elements.append(Element(char))
|
||||
|
||||
calculate(elements, m, message)
|
||||
|
||||
@@ -34,15 +45,17 @@ def Z2_statistik():
|
||||
|
||||
m = len(message) - 1 # Letztes Zeichen kann kein Tupel mit "nichts" bilden
|
||||
|
||||
elements = {}
|
||||
elements = []
|
||||
|
||||
for i, char in enumerate(message):
|
||||
if i != m:
|
||||
if i < m:
|
||||
tuple = char + message[i+1]
|
||||
if elements.__contains__(tuple):
|
||||
elements[tuple]["count"] += 1
|
||||
entry = find_element(elements, tuple)
|
||||
|
||||
if entry is not None:
|
||||
entry.count += 1
|
||||
else:
|
||||
elements[tuple] = empty_element.copy()
|
||||
elements.append(Element(tuple))
|
||||
|
||||
calculate(elements, m, message)
|
||||
|
||||
@@ -52,9 +65,10 @@ def W_statistik():
|
||||
m = 0
|
||||
i = 0
|
||||
|
||||
elements = {}
|
||||
elements = []
|
||||
l = len(message)
|
||||
|
||||
while i != len(message):
|
||||
while i < l:
|
||||
word = ""
|
||||
|
||||
if message[i].isalpha():
|
||||
@@ -62,7 +76,7 @@ def W_statistik():
|
||||
word += message[i]
|
||||
|
||||
# füge Zeichen hinzu bis Wortende erreicht ist
|
||||
while message[i+1].isalpha():
|
||||
while i+1 is not l and message[i+1].isalpha():
|
||||
i += 1
|
||||
word += message[i]
|
||||
|
||||
@@ -70,10 +84,12 @@ def W_statistik():
|
||||
m += 1
|
||||
|
||||
# Zähle die Häufigkeit der Wörter
|
||||
if elements.__contains__(word):
|
||||
elements[word]["count"] += 1
|
||||
|
||||
entry = find_element(elements, word)
|
||||
if entry is not None:
|
||||
entry.count += 1
|
||||
else:
|
||||
elements[word] = empty_element.copy()
|
||||
elements.append(Element(word))
|
||||
|
||||
# gehe weiter in der Nachricht
|
||||
i += 1
|
||||
@@ -81,32 +97,17 @@ def W_statistik():
|
||||
calculate(elements, m, message)
|
||||
|
||||
def calculate(elements, m, message):
|
||||
for x_i in elements:
|
||||
elements[x_i]["p(x_i)"] = elements[x_i]["count"] / m
|
||||
elements[x_i]["I(x_i)"] = -1 * math.log2(elements[x_i]["p(x_i)"])
|
||||
|
||||
h = 0
|
||||
for x_i in elements:
|
||||
h += elements[x_i]["p(x_i)"] * elements[x_i]["I(x_i)"]
|
||||
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
|
||||
|
||||
|
||||
sorted_by_element = sorted(elements)
|
||||
|
||||
sorted_by_count = dict(sorted(
|
||||
elements.items(),
|
||||
key = lambda item: item[1]["count"],
|
||||
reverse=True
|
||||
))
|
||||
|
||||
sorted_by_information = dict(sorted(
|
||||
elements.items(),
|
||||
key = lambda item: item[1]["I(x_i)"],
|
||||
reverse=True
|
||||
))
|
||||
# Ausgabe
|
||||
for x_i in sorted_by_element:
|
||||
print(f"{elements[x_i]["count"]:3.0f} | {elements[x_i]["p(x_i)"]:10.7f} | {elements[x_i]["I(x_i)"]:10.7f} | »{x_i}«")
|
||||
print("Entropie der Nachricht = " + h.__str__() + "\n\n")
|
||||
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()
|
||||
|
||||
Reference in New Issue
Block a user