bi3mw > 22-08-2024, 07:59 PM
import sys
import numpy as np
from scipy.special import comb
def calculate_binomial_distribution(n, max_length):
"""Berechnet die binomiale Verteilung für Wortlängen."""
k_values = np.arange(1, max_length + 1)
probabilities = [comb(n, k) * (0.5 ** n) for k in k_values]
probabilities /= np.sum(probabilities)
return probabilities
def trim_repeated_chars(s):
"""Schneidet die Zeichenkette nach zwei Zeichen ab, wenn drei oder mehr gleiche Zeichen am Ende stehen."""
if len(s) >= 3 and s[-1] == s[-2] == s[-3]:
# Finde den Start der wiederholten Zeichen
char = s[-1]
i = len(s) - 1
while i >= 0 and s[i] == char:
i -= 1
# Kürze die Zeichenkette auf die ersten zwei wiederholten Zeichen
return s[:i+1] + char * 2
return s
def adjust_word_lengths(words, target_distribution, last_truncated_part):
"""Passt die Wortlängen an, um die Zielverteilung zu erfüllen, indem Wörter gekürzt oder verlängert werden."""
adjusted_words = []
max_word_length = len(target_distribution)
length_bins = np.arange(1, max_word_length + 1)
length_probs = np.array(target_distribution)
new_last_truncated_part = last_truncated_part
for word in words:
current_length = len(word)
target_length = np.random.choice(length_bins, p=length_probs)
if target_length < current_length:
# Speichern des gekürzten Teils
new_last_truncated_part = word[target_length:]
adjusted_word = word[:target_length]
adjusted_words.append(adjusted_word)
elif target_length > current_length:
if new_last_truncated_part:
# Berechnen der benötigten Länge für die Verlängerung
needed_length = target_length - current_length
# Erstellen des Erweiterungsteils durch Wiederholung des gekürzten Teils
repeated_part = (new_last_truncated_part * ((needed_length // len(new_last_truncated_part)) + 1))[:needed_length]
# Prüfen, ob der Erweiterungsteil auf wiederholte Zeichen gekürzt werden muss
extended_word = word + repeated_part
adjusted_word = trim_repeated_chars(extended_word)
else:
# Falls kein gekürzter Teil vorhanden ist, das Wort mit Fallback-Zeichen verlängern
extended_word = word + "_" * (target_length - current_length)
adjusted_word = trim_repeated_chars(extended_word)
adjusted_words.append(adjusted_word)
else:
adjusted_words.append(word) # Länge entspricht der Zielvorgabe, Wort bleibt unverändert
return adjusted_words, new_last_truncated_part
def process_text(file_path, output_path, target_distribution):
"""Liest den Text aus der Datei, passt die Wortlängen an und schreibt den modifizierten Text in eine Ausgabedatei."""
try:
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
except FileNotFoundError:
print(f"Fehler: Die Datei {file_path} wurde nicht gefunden.")
sys.exit(1)
except IOError as e:
print(f"Fehler: Ein Fehler ist beim Lesen der Datei aufgetreten: {e}")
sys.exit(1)
last_truncated_part = ""
adjusted_lines = []
for line in lines:
words = line.split()
adjusted_words, last_truncated_part = adjust_word_lengths(words, target_distribution, last_truncated_part)
adjusted_lines.append(' '.join(adjusted_words))
# Schreiben des modifizierten Textes in die Ausgabedatei
try:
with open(output_path, 'w', encoding='utf-8') as file:
file.write('\n'.join(adjusted_lines))
print(f"Modifizierter Text wurde in {output_path} geschrieben.")
except IOError as e:
print(f"Fehler: Ein Fehler ist beim Schreiben der Datei aufgetreten: {e}")
sys.exit(1)
def main():
if len(sys.argv) != 3:
print("Verwendung: python adjust_word_length.py <input_filename> <output_filename>")
sys.exit(1)
input_file_path = sys.argv[1]
output_file_path = sys.argv[2]
max_word_length = 15
n = 10
# Berechnen der Binomialverteilung
target_distribution = calculate_binomial_distribution(n, max_word_length)
# Prozess des Textes und Schreiben in die Ausgabedatei
process_text(input_file_path, output_file_path, target_distribution)
if __name__ == "__main__":
main()
bi3mw > 23-08-2024, 11:24 PM
bi3mw > 25-08-2024, 12:23 AM
RobGea > 25-08-2024, 06:11 PM
bi3mw > 26-08-2024, 10:27 AM
(25-08-2024, 06:11 PM)RobGea Wrote: You are not allowed to view links. Register or Login to view.A = Astronomical (excluding zodiac)
B = Biological
C = Cosmological
H = Herbal
P = Pharmaceutical
S = Marginal stars only
T = Text-only page (no illustrations)
Z = Zodiac
Lb - Labels Only
All - Complete text from transcription file
RobGea > 26-08-2024, 03:38 PM
bi3mw > 26-08-2024, 05:08 PM
RobGea > 26-08-2024, 05:54 PM
bi3mw > 26-08-2024, 06:02 PM
RobGea > 26-08-2024, 06:08 PM