feat: Änderungsbericht Rohtext → Korrektur (aenderungen.py)

- Wortvergleich ohne Groß-/Kleinschreibung, Satzzeichen und „z. B.“-Varianten,
  damit nur echte Wortänderungen auffallen
- HTML-Bericht: Änderungen nach Häufigkeit, korrigierter Text mit markierten
  Ersetzungen (Original dahinter), Einfügungen, Streichungen, Prüfmarken
- rede_korrigieren.py schreibt den Bericht bei jedem Lauf (--kein-bericht)
  und zeigt die häufigsten Änderungen; Vergleich mit dem Rohtext vor Glossar
- aenderungen.py als eigenes Skript für vorhandene Dateien

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-10 19:59:37 +02:00
commit c1d270bc0e

View file

@ -9,6 +9,7 @@ import sys
import time
import urllib.request
from aenderungen import REVIEW_MARK, print_summary, report_path, write_report
from vtt2txt import vtt_to_lines
MODEL = "qwen3:32b"
@ -22,7 +23,6 @@ MAX_PARAGRAPH_SENTENCES = 10 # längere Absätze werden nachträglich geteilt
MIN_PARAGRAPH_SENTENCES = 3 # kürzere Absätze werden mit dem Nachbarn verbunden
SENTENCE_END = re.compile(r"[.!?…][\"'»«“”)\]]*$")
REVIEW_MARK = re.compile(r"\[prüfen:[^\]]*\]")
SENTENCE_SPLIT = re.compile(r"(?:(?<=[.!?…])|(?<=[.!?…][\"'»«“”)\]]))\s+")
SYSTEM = """Du korrigierst eine automatische Abschrift einer deutschen Rede.
@ -378,6 +378,10 @@ def parse_args():
parser.add_argument(
"-m", "--model", default=MODEL, help=f"Ollama-Modell (Standard: {MODEL})"
)
parser.add_argument(
"--kein-bericht", action="store_true",
help="keinen Änderungsbericht <Ausgabe>.aenderungen.html schreiben",
)
args = parser.parse_args()
if not args.input.is_file():
@ -419,6 +423,8 @@ def main():
raw = "\n".join(vtt_to_lines(raw))
# Subtitle line breaks carry no meaning; send plain running text
text = " ".join(raw.split())
# The change report compares against this, so glossary effects show up too
raw_text = text
if replacements:
text = apply_replacements(text, replacements)
@ -465,6 +471,12 @@ def main():
target.write_text(text + "\n", encoding="utf-8")
print(f"Fertig: {target}")
if not args.kein_bericht:
report = report_path(target)
comparison = write_report(raw_text, text, report, target.name)
print_summary(comparison)
print(f"Bericht: {report}")
if warnings:
print(f"\n{len(warnings)} Abschnitt(e) mit auffälliger Wortzahl:")
for message in warnings: