chore: Glossare liegen lokal im Verzeichnis glossare/

Die Glossare echter Beiträge stehen nicht mehr lose im Programmordner,
sondern in glossare/ (in .gitignore). Tests und Beispiele in README und
Bedienungsanleitung verwenden die neuen Pfade.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 22:58:14 +02:00
commit acf9e33382
4 changed files with 42 additions and 34 deletions

5
.gitignore vendored
View file

@ -16,7 +16,8 @@ output/
# Echte Reden (Urheberrecht): nur lokal; die Tests nutzen tests/daten/ # Echte Reden (Urheberrecht): nur lokal; die Tests nutzen tests/daten/
testdaten/ testdaten/
# Glossare echter Beiträge (Namen, Hörfehler): nur lokal; ins Repository gehört # Glossare echter Beiträge (Namen, Hörfehler): nur lokal in glossare/; ins
# nur das Glossar der erfundenen Beispielrede # Repository gehört nur das Glossar der erfundenen Beispielrede
glossare/
*.glossar.txt *.glossar.txt
!tests/daten/beispiel.glossar.txt !tests/daten/beispiel.glossar.txt

View file

@ -172,7 +172,7 @@ YouTube-URL
▼ ▼
Rohtext ansehen Rohtext ansehen
│ Schritt 2: glossar_vorschlag.py → rede.glossar.entwurf.txt │ Schritt 2: glossar_vorschlag.py → rede.glossar.entwurf.txt
│ prüfen, übernehmen → rede.glossar.txt │ prüfen, übernehmen → glossare/rede.glossar.txt
▼ ▼
│ Schritt 3: abschrift_korrigieren.py → rede.korrigiert.txt │ Schritt 3: abschrift_korrigieren.py → rede.korrigiert.txt
│ rede.aenderungen.html │ rede.aenderungen.html
@ -299,15 +299,17 @@ Bewährt hat sich ein **gemeinsames Glossar** pro Redner oder Kanal (wiederkehre
Namen und Hörfehler) plus eines **je Beitrag**: Namen und Hörfehler) plus eines **je Beitrag**:
```bash ```bash
./abschrift_korrigieren.py -i rede.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt ./abschrift_korrigieren.py -i rede.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt
``` ```
Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen zuerst greifen. Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen zuerst greifen.
Glossare enthalten Namen realer Personen und Hörfehler realer Beiträge. Sie werden **Ablage:** Glossare gehören ins Verzeichnis `glossare/` im Programmordner, z. B.
deshalb nicht ins Git-Repository übernommen: Jede Datei `*.glossar.txt` ist über `glossare/krone-schmalz.glossar.txt` und `glossare/ramstein.glossar.txt`. Sie
`.gitignore` ausgeschlossen und bleibt nur auf dem eigenen Rechner. Das ist enthalten Namen realer Personen und Hörfehler realer Beiträge und werden deshalb
gewollt; Glossare lieber gesondert sichern. Einzige Ausnahme ist das kleine, nicht ins Git-Repository übernommen: `glossare/` und jede Datei `*.glossar.txt` sind
über `.gitignore` ausgeschlossen und bleiben nur auf dem eigenen Rechner. Das ist
gewollt; Glossare deshalb gesondert sichern. Einzige Ausnahme ist das kleine,
leicht nachvollziehbare Glossar zur erfundenen Beispielrede in leicht nachvollziehbare Glossar zur erfundenen Beispielrede in
`tests/daten/beispiel.glossar.txt`, das sich gut als Vorlage eignet. `tests/daten/beispiel.glossar.txt`, das sich gut als Vorlage eignet.
@ -316,7 +318,7 @@ leicht nachvollziehbare Glossar zur erfundenen Beispielrede in
Statt den ganzen Rohtext zu lesen, kann das Modell einen ersten Entwurf liefern: Statt den ganzen Rohtext zu lesen, kann das Modell einen ersten Entwurf liefern:
```bash ```bash
./glossar_vorschlag.py -i rede.txt -g krone-schmalz.glossar.txt ./glossar_vorschlag.py -i rede.txt -g glossare/krone-schmalz.glossar.txt
# → rede.glossar.entwurf.txt # → rede.glossar.entwurf.txt
``` ```
@ -353,7 +355,7 @@ Modell geändert hat. Das zeigt Hörfehler, die man als feste Ersetzung absicher
möchte, und Fehlgriffe des Modells: möchte, und Fehlgriffe des Modells:
```bash ```bash
./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt ./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt
``` ```
Diese Einträge stehen in einem eigenen Abschnitt mit ihrer Anzahl, z. B. Diese Einträge stehen in einem eigenen Abschnitt mit ihrer Anzahl, z. B.
@ -365,7 +367,7 @@ entfernen.
## 7. Schritt 3: Korrigieren ## 7. Schritt 3: Korrigieren
```bash ```bash
./abschrift_korrigieren.py -i rede.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt ./abschrift_korrigieren.py -i rede.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt
``` ```
Statt `-i rede.txt` geht auch `-i rede.de.vtt` (Untertiteldatei) oder Statt `-i rede.txt` geht auch `-i rede.de.vtt` (Untertiteldatei) oder
@ -398,8 +400,8 @@ Ein gekürztes Beispiel mit Erläuterungen:
```text ```text
Modell: qwen3:32b Modell: qwen3:32b
Sprache des Beitrags: de Sprache des Beitrags: de
Glossar krone-schmalz.glossar.txt: 7 Begriffe, 36 feste Ersetzungen Glossar glossare/krone-schmalz.glossar.txt: 7 Begriffe, 36 feste Ersetzungen
Glossar ramstein.glossar.txt: 2 Begriffe, 15 feste Ersetzungen Glossar glossare/ramstein.glossar.txt: 2 Begriffe, 15 feste Ersetzungen
Ersetzt 2× „Willly Brand“ → „Willy Brandt“ ← feste Ersetzungen mit Treffern Ersetzt 2× „Willly Brand“ → „Willy Brandt“ ← feste Ersetzungen mit Treffern
Ersetzt 6× „Rammstein“ → „Ramstein“ Ersetzt 6× „Rammstein“ → „Ramstein“
13 Ersetzung(en) ohne Treffer: „Hostelchik“, … ← bei gemeinsamen Glossaren normal 13 Ersetzung(en) ohne Treffer: „Hostelchik“, … ← bei gemeinsamen Glossaren normal
@ -522,7 +524,7 @@ erstellt, lässt sich der Bericht jederzeit neu erzeugen. Mit denselben Glossare
wie bei der Korrektur, damit deren Ersetzungen nicht als verdächtig gelten: wie bei der Korrektur, damit deren Ersetzungen nicht als verdächtig gelten:
```bash ```bash
./aenderungen.py -a rede.txt -b rede.korrigiert.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt ./aenderungen.py -a rede.txt -b rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt
# → rede.aenderungen.html # → rede.aenderungen.html
./aenderungen.py -a talk.txt -b talk.korrigiert.txt -l en # englischer Beitrag ./aenderungen.py -a talk.txt -b talk.korrigiert.txt -l en # englischer Beitrag
``` ```
@ -771,7 +773,7 @@ Ja, z. B. in einer Schleife:
```bash ```bash
for url in 'https://www.youtube.com/watch?v=AAA' 'https://www.youtube.com/watch?v=BBB'; do for url in 'https://www.youtube.com/watch?v=AAA' 'https://www.youtube.com/watch?v=BBB'; do
./abschrift_korrigieren.py -u "$url" -g krone-schmalz.glossar.txt ./abschrift_korrigieren.py -u "$url" -g glossare/krone-schmalz.glossar.txt
done done
``` ```

View file

@ -229,8 +229,8 @@ werden trotzdem umgewandelt; der Exit-Code ist dann 1.
```bash ```bash
./abschrift_korrigieren.py -i rede.txt # → rede.korrigiert.txt ./abschrift_korrigieren.py -i rede.txt # → rede.korrigiert.txt
./abschrift_korrigieren.py -i rede.txt -o out/rede.txt # eigene Ausgabedatei ./abschrift_korrigieren.py -i rede.txt -o out/rede.txt # eigene Ausgabedatei
./abschrift_korrigieren.py -i rede.txt -g rede.glossar.txt # mit Glossar ./abschrift_korrigieren.py -i rede.txt -g glossare/rede.glossar.txt # mit Glossar
./abschrift_korrigieren.py -i rede.txt -g allgemein.glossar.txt -g rede.glossar.txt # kombiniert ./abschrift_korrigieren.py -i rede.txt -g glossare/allgemein.glossar.txt -g glossare/rede.glossar.txt # kombiniert
./abschrift_korrigieren.py -i rede.de.vtt # VTT direkt → rede.de.korrigiert.txt ./abschrift_korrigieren.py -i rede.de.vtt # VTT direkt → rede.de.korrigiert.txt
./abschrift_korrigieren.py -u URL # YouTube → <Kanal>_<Titel>_<Datum>.korrigiert.txt ./abschrift_korrigieren.py -u URL # YouTube → <Kanal>_<Titel>_<Datum>.korrigiert.txt
./abschrift_korrigieren.py -i talk.txt -l en # englischer Beitrag ./abschrift_korrigieren.py -i talk.txt -l en # englischer Beitrag
@ -346,7 +346,7 @@ der Korrektur gelten deren Ersetzungen und Begriffe nicht als verdächtig:
```bash ```bash
./aenderungen.py -a rede.txt -b rede.korrigiert.txt # → rede.aenderungen.html ./aenderungen.py -a rede.txt -b rede.korrigiert.txt # → rede.aenderungen.html
./aenderungen.py -a rede.de.vtt -b rede.korrigiert.txt -o bericht.html ./aenderungen.py -a rede.de.vtt -b rede.korrigiert.txt -o bericht.html
./aenderungen.py -a rede.txt -b rede.korrigiert.txt -g krone-schmalz.glossar.txt -g rede.glossar.txt ./aenderungen.py -a rede.txt -b rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt -g glossare/rede.glossar.txt
./aenderungen.py -a talk.txt -b talk.korrigiert.txt -l en # englische Wortliste ./aenderungen.py -a talk.txt -b talk.korrigiert.txt -l en # englische Wortliste
``` ```
@ -370,13 +370,15 @@ es normal.
Mehrere Glossare lassen sich kombinieren: ein gemeinsames für wiederkehrende Namen Mehrere Glossare lassen sich kombinieren: ein gemeinsames für wiederkehrende Namen
und Hörfehler eines Redners oder Kanals und eines je Beitrag, z. B. und Hörfehler eines Redners oder Kanals und eines je Beitrag, z. B.
`krone-schmalz.glossar.txt` (gemeinsam) plus `ramstein.glossar.txt`. Das gemeinsame `glossare/krone-schmalz.glossar.txt` (gemeinsam) plus `glossare/ramstein.glossar.txt`.
Glossar zuerst angeben, damit seine Ersetzungen vor den speziellen greifen. Das gemeinsame Glossar zuerst angeben, damit seine Ersetzungen vor den speziellen
greifen.
Glossare gehören zu realen Beiträgen und Personen und werden deshalb nicht Glossare liegen im Verzeichnis `glossare/`. Sie gehören zu realen Beiträgen und
versioniert: `*.glossar.txt` steht in `.gitignore`, eigene Glossare liegen nur lokal. Personen und werden deshalb nicht versioniert: `glossare/` und `*.glossar.txt` stehen
Im Repository ist als Beispiel nur `tests/daten/beispiel.glossar.txt` zur erfundenen in `.gitignore`, die Glossare bleiben nur lokal und sollten gesondert gesichert
Beispielrede. werden. Im Repository ist als Beispiel nur `tests/daten/beispiel.glossar.txt` zur
erfundenen Beispielrede.
### Glossar-Entwurf: `glossar_vorschlag.py` ### Glossar-Entwurf: `glossar_vorschlag.py`
@ -401,7 +403,7 @@ erneut vorgeschlagen. Zeit-Überschriften von Ausschnitten
Roh- und korrigiertem Text entfernt; das Modell bekommt sie nicht zu sehen. Roh- und korrigiertem Text entfernt; das Modell bekommt sie nicht zu sehen.
```bash ```bash
./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g krone-schmalz.glossar.txt ./glossar_vorschlag.py -i rede.txt -k rede.korrigiert.txt -g glossare/krone-schmalz.glossar.txt
# → rede.glossar.entwurf.txt # → rede.glossar.entwurf.txt
./glossar_vorschlag.py -i tests/daten/beispiel.de.txt # an der Beispielrede ausprobieren ./glossar_vorschlag.py -i tests/daten/beispiel.de.txt # an der Beispielrede ausprobieren
``` ```
@ -432,18 +434,19 @@ passendes Glossar (`beispiel.glossar.txt`) für die eingebauten Hörfehler wie
``` ```
**Nur lokal:** Echte Reden gehören wegen des Urheberrechts nicht ins Repository; **Nur lokal:** Echte Reden gehören wegen des Urheberrechts nicht ins Repository;
`testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare (`*.glossar.txt`). `testdaten/` ist deshalb in `.gitignore`, ebenso die Glossare (`glossare/`).
Liegen die drei Reden, mit denen das Programm entwickelt wurde, in `testdaten/` und Liegen die drei Reden, mit denen das Programm entwickelt wurde, in `testdaten/` und
ihre Glossare im Programmordner, laufen zusätzlich die Tests, die diese Glossare ihre Glossare in `glossare/`, laufen zusätzlich die Tests, die diese Glossare
prüfen; sonst werden sie übersprungen: prüfen; sonst werden sie übersprungen:
- `ramstein.de.*`: Rede über die US Air Base Ramstein (Glossar `ramstein.glossar.txt`) - `ramstein.de.*`: Rede über die US Air Base Ramstein (Glossar `glossare/ramstein.glossar.txt`)
- `magdeburg.de-orig.*`: Rede in Magdeburg (Glossar `magdeburg.glossar.txt`) - `magdeburg.de-orig.*`: Rede in Magdeburg (Glossar `glossare/magdeburg.glossar.txt`)
- `Lahnstein.de-orig.*`: Rede „Respekt geht anders“ in Lahnstein (Glossar - `Lahnstein.de-orig.*`: Rede „Respekt geht anders“ in Lahnstein (Glossar
`lahnstein.glossar.txt`, erstellt mit Hilfe von `glossar_vorschlag.py`), zu laden mit `glossare/lahnstein.glossar.txt`, erstellt mit Hilfe von `glossar_vorschlag.py`),
zu laden mit
`./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d testdaten` `./yt_untertitel.py -u 'https://www.youtube.com/watch?v=rm6lADgf6GQ' -n Lahnstein -d testdaten`
Alle drei mit dem gemeinsamen `krone-schmalz.glossar.txt` davor. Ein Lauf über eine Alle drei mit dem gemeinsamen `glossare/krone-schmalz.glossar.txt` davor. Ein Lauf über eine
Rede dauert mit `qwen3:32b` vollständig auf einer RTX 3090 etwa 6–8 Minuten. Rede dauert mit `qwen3:32b` vollständig auf einer RTX 3090 etwa 6–8 Minuten.
## Tests ## Tests

View file

@ -14,7 +14,9 @@ REPO = Path(__file__).resolve().parent.parent
# Own, made-up sample speech; real speeches are only kept locally in testdaten/ # Own, made-up sample speech; real speeches are only kept locally in testdaten/
SAMPLE = REPO / "tests" / "daten" / "beispiel.de.txt" SAMPLE = REPO / "tests" / "daten" / "beispiel.de.txt"
GLOSSARY = REPO / "tests" / "daten" / "beispiel.glossar.txt" GLOSSARY = REPO / "tests" / "daten" / "beispiel.glossar.txt"
SHARED_GLOSSARY = REPO / "krone-schmalz.glossar.txt" # Real glossaries and speeches are only kept locally (see .gitignore)
GLOSSARIES = REPO / "glossare"
SHARED_GLOSSARY = GLOSSARIES / "krone-schmalz.glossar.txt"
SPEECHES = REPO / "testdaten" SPEECHES = REPO / "testdaten"
# The autouse fixture below replaces it; tests of the real function use this # The autouse fixture below replaces it; tests of the real function use this
REAL_FIND_MERGE_SIDE = ak.find_merge_side REAL_FIND_MERGE_SIDE = ak.find_merge_side
@ -135,7 +137,7 @@ SAMPLE_GLOSSARIES = [
# Real speeches and their glossaries are not in the repository; without them these skip # Real speeches and their glossaries are not in the repository; without them these skip
needs_speeches = pytest.mark.skipif( needs_speeches = pytest.mark.skipif(
not all( not all(
(SPEECHES / sample).is_file() and (REPO / glossary).is_file() (SPEECHES / sample).is_file() and (GLOSSARIES / glossary).is_file()
for glossary, sample in SAMPLE_GLOSSARIES for glossary, sample in SAMPLE_GLOSSARIES
) or not SHARED_GLOSSARY.is_file(), ) or not SHARED_GLOSSARY.is_file(),
reason="echte Reden (testdaten/) und ihre Glossare nur lokal", reason="echte Reden (testdaten/) und ihre Glossare nur lokal",
@ -155,7 +157,7 @@ def test_sample_glossary_replacements_all_match(capsys, glossary, sample):
text = flat((SPEECHES / sample).read_text(encoding="utf-8")) text = flat((SPEECHES / sample).read_text(encoding="utf-8"))
text = ak.apply_replacements(text, ak.read_glossary(SHARED_GLOSSARY)[1]) text = ak.apply_replacements(text, ak.read_glossary(SHARED_GLOSSARY)[1])
capsys.readouterr() capsys.readouterr()
ak.apply_replacements(text, ak.read_glossary(REPO / glossary)[1]) ak.apply_replacements(text, ak.read_glossary(GLOSSARIES / glossary)[1])
assert "ohne Treffer" not in capsys.readouterr().out assert "ohne Treffer" not in capsys.readouterr().out