mirror of
https://github.com/creyD/entro.py.git
synced 2026-04-12 20:00:29 +02:00
Prepared for packaging
This commit is contained in:
87
entro.py
87
entro.py
@@ -1,87 +0,0 @@
|
||||
'''
|
||||
calc_entro.py calculates the entropy of a given string or file
|
||||
|
||||
This uses the negative sum of the log (to the base of 2) of the probability
|
||||
times the probability of a char to occur in a certain string as the entropy.
|
||||
'''
|
||||
|
||||
import math
|
||||
import argparse
|
||||
|
||||
|
||||
# Calculates the entropy of a given string (as described in the docstring)
|
||||
def calculateEntropy(input_string):
|
||||
alphabet, alphabet_size, entropy = {}, 0, 0
|
||||
|
||||
for char in input_string:
|
||||
if char in alphabet:
|
||||
alphabet[char] += 1
|
||||
else:
|
||||
alphabet[char] = 1
|
||||
alphabet_size += 1
|
||||
|
||||
for char in alphabet:
|
||||
alphabet[char] = alphabet[char] / alphabet_size
|
||||
entropy -= alphabet[char] * math.log(alphabet[char], 2)
|
||||
|
||||
return entropy, alphabet
|
||||
|
||||
|
||||
# Outputs a given entropy including the original text and the alphabet with probabilities
|
||||
def printEntropy(original_string, entropy_value, alphabet_dict, simple_bool):
|
||||
print('---')
|
||||
if simple_bool == False:
|
||||
print('Content: ' + original_string)
|
||||
print('Probabilities: ' + str(alphabet_dict))
|
||||
print('Entropy: ' + str(entropy_value) + ' bits')
|
||||
print('---')
|
||||
|
||||
|
||||
# Reads a file by a given path
|
||||
def readEntropyFile(path_string):
|
||||
f = open(path_string, 'r')
|
||||
content = f.read().replace('\n', ' ')
|
||||
f.close()
|
||||
return content.strip()
|
||||
|
||||
|
||||
# List of the arguments one can use to influence the behavior of the program
|
||||
parser = argparse.ArgumentParser(description='Calculate the information entropy of some strings.')
|
||||
|
||||
# INPUT ARGUMENTS
|
||||
parser.add_argument('strings', nargs='*', default='', type=str, help='Strings to calculate the entropy of.')
|
||||
parser.add_argument('--files', nargs='*', type=str, default='', help='Provide file path(s) to calculate the entropy of.')
|
||||
|
||||
# OUTPUT OPTIONS
|
||||
parser.add_argument('--simple', nargs='?', type=bool, default=False, help='Determines the explicitness of the output. (True = only entropy shown)')
|
||||
|
||||
# CONVERT OPTIONS
|
||||
parser.add_argument('--lower', nargs='?', type=bool, default=False, help='Converts given strings or textfiles to lowercase before calculating.')
|
||||
parser.add_argument('--upper', nargs='?', type=bool, default=False, help='Converts given strings or textfiles to uppercase before calculating.')
|
||||
parser.add_argument('--squash', nargs='?', type=bool, default=False, help='Removes all whitespaces before calculating.')
|
||||
args = parser.parse_args()
|
||||
|
||||
# Prepares the queue of different strings
|
||||
queue = []
|
||||
|
||||
# Add all the provided strings to the list
|
||||
for string in args.strings:
|
||||
queue.append(string)
|
||||
|
||||
# Add all the provided files to the list
|
||||
for file in args.files:
|
||||
string = readEntropyFile(file)
|
||||
queue.append(string)
|
||||
|
||||
# Interates over the collected strings and prints the entropies
|
||||
for string in queue:
|
||||
if args.lower != False:
|
||||
string = string.lower()
|
||||
elif args.upper != False:
|
||||
string = string.upper()
|
||||
|
||||
if args.squash != False:
|
||||
string = string.replace(" ", "")
|
||||
|
||||
a, b = calculateEntropy(string)
|
||||
printEntropy(string, a, b, args.simple)
|
||||
1
entro.py/__init__.py
Normal file
1
entro.py/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
name = "entro.py"
|
||||
38
entro.py/entro.py
Normal file
38
entro.py/entro.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import math
|
||||
|
||||
# Calculates the entropy of a given string
|
||||
# Returns the entropy and an alphabet with the calculated probabilities
|
||||
def calculateEntropy(input_string):
|
||||
alphabet, alphabet_size, entropy = {}, 0, 0
|
||||
|
||||
for char in input_string:
|
||||
if char in alphabet:
|
||||
alphabet[char] += 1
|
||||
else:
|
||||
alphabet[char] = 1
|
||||
alphabet_size += 1
|
||||
|
||||
for char in alphabet:
|
||||
alphabet[char] = alphabet[char] / alphabet_size
|
||||
entropy -= alphabet[char] * math.log(alphabet[char], 2)
|
||||
|
||||
return entropy, alphabet
|
||||
|
||||
|
||||
# Calculates the entropy of a given string
|
||||
# Returns only the entropy in bits as this is the minimal function
|
||||
def calculateEntropyMin(input_string):
|
||||
alphabet, alphabet_size, entropy = {}, 0, 0
|
||||
|
||||
for char in input_string:
|
||||
if char in alphabet:
|
||||
alphabet[char] += 1
|
||||
else:
|
||||
alphabet[char] = 1
|
||||
alphabet_size += 1
|
||||
|
||||
for char in alphabet:
|
||||
i = alphabet[char] / alphabet_size
|
||||
entropy -= i * math.log(i, 2)
|
||||
|
||||
return entropy
|
||||
21
setup.py
Normal file
21
setup.py
Normal file
@@ -0,0 +1,21 @@
|
||||
import setuptools
|
||||
|
||||
with open("README.md", "r") as fh:
|
||||
long_description = fh.read()
|
||||
|
||||
setuptools.setup(
|
||||
name="entro.py-creyD",
|
||||
version="1.0",
|
||||
author="Conrad Großer",
|
||||
author_email="grosserconrad@gmail.com",
|
||||
description="Small Information Entropy Calculator",
|
||||
long_description=long_description,
|
||||
long_description_content_type="text/markdown",
|
||||
url="https://github.com/creyD/entro.py",
|
||||
packages=setuptools.find_packages(),
|
||||
classifiers=[
|
||||
"Programming Language :: Python :: 3",
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Operating System :: OS Independent",
|
||||
],
|
||||
)
|
||||
Reference in New Issue
Block a user