142 lines
6.4 KiB
Markdown
142 lines
6.4 KiB
Markdown
# Stammdaten aufräumen
|
||
|
||
Führt doppelte Zutaten, Einheiten und Schlagworte zusammen und findet
|
||
Karteileichen.
|
||
|
||
## Bitte einmal lesen, bevor du es benutzt
|
||
|
||
Tandoors `merge` hängt alle Verweise der Quelle auf das Ziel um und **löscht
|
||
die Quelle**. Das ist nicht umkehrbar. Im Tandoor-Quelltext steht dazu:
|
||
|
||
```python
|
||
# TODO these checks could be improved to merge existing properties and
|
||
# conversion in a smart way. For now it will just loose them to prevent
|
||
# duplicates
|
||
if isinstance(source, Food):
|
||
source.properties.all().delete()
|
||
```
|
||
|
||
Die Nährwerte des Quelleintrags gehen also verloren. Dieses Werkzeug rettet
|
||
sie deshalb vorher: Werte, die nur die Quelle hat, werden zuerst ans Ziel
|
||
geschrieben. Abschaltbar über das Häkchen bzw. `--ohne-rettung`.
|
||
|
||
## Was vorgeschlagen wird — und was nicht
|
||
|
||
**Sichere Dubletten** (vorausgewählt) bei praktisch sicheren Fällen:
|
||
|
||
* gleicher Name (`Zwiebel` / `zwiebel`, `Olivenöl` / `Olivenoel`)
|
||
* Singular/Plural (`Zwiebel` / `Zwiebeln`, `Tomate` / `Tomaten`)
|
||
|
||
**Ähnlich** — anhakbar, aber nie vorausgewählt und mit Pflicht zur
|
||
Richtungswahl:
|
||
|
||
* echte Wort-Teilmengen (`Mehl` / `Mehl Type 550`, `Olivenöl` /
|
||
`Olivenöl nativ extra`) — jedes Wort der kürzeren Seite kommt als
|
||
ganzes Wort in der längeren vor
|
||
|
||
Der Unterschied ist Absicht. `Rote Zwiebel` sieht `Zwiebel` sehr ähnlich, ist
|
||
aber etwas anderes — deshalb entscheidet hier der Mensch, ob und in welche
|
||
Richtung zusammengeführt wird, statt dass etwas vorausgewählt ist.
|
||
|
||
**Bekannte Lücke:** unregelmäßige Plurale mit Umlaut (`Ei` / `Eier`,
|
||
`Apfel` / `Äpfel`) erkennt die Heuristik nicht. Die tauchen in keiner der
|
||
beiden Listen auf.
|
||
|
||
**Löschen** wird grundsätzlich nicht vorausgewählt — manches hebt man
|
||
absichtlich auf.
|
||
|
||
## Welcher Eintrag bleibt
|
||
|
||
Ziel ist der Eintrag, der am meisten zu verlieren hätte, in dieser Reihenfolge:
|
||
die meisten Rezepte → die meisten Nährwerte → gepflegter Plural →
|
||
Supermarkt-Kategorie → kürzerer Name.
|
||
|
||
## Ablauf
|
||
|
||
1. **Prüfen** — schreibt eine Plandatei. Verändert nichts.
|
||
2. Plan durchsehen, Häkchen setzen.
|
||
3. **Trockenübung** — zeigt Zeile für Zeile, was passieren würde.
|
||
4. **Ausführen** — erst dann wird es ernst. Vor jedem Schritt wird der
|
||
Zustand der betroffenen Einträge gesichert.
|
||
|
||
Zusammengeführt wird vor dem Löschen: eine Zusammenführung kann einen Eintrag
|
||
erst unbenutzt machen.
|
||
|
||
## Ohne Suite
|
||
|
||
export TANDOOR_URL=https://kitchen.example.de
|
||
export TANDOOR_TOKEN=...
|
||
python3 plugins/tandoor-cleanup/tool/cleanup.py pruefen
|
||
python3 plugins/tandoor-cleanup/tool/cleanup.py pruefen --arten food
|
||
python3 plugins/tandoor-cleanup/tool/cleanup.py ausfuehren \
|
||
--plan data/tandoor-cleanup/plaene/<datei>.json # Trockenübung
|
||
python3 plugins/tandoor-cleanup/tool/cleanup.py ausfuehren \
|
||
--plan data/tandoor-cleanup/plaene/<datei>.json --apply # ernst
|
||
|
||
## Dateien
|
||
|
||
data/tandoor-cleanup/plaene/<zeit>.json Plan
|
||
data/tandoor-cleanup/laeufe/<zeit>/ Sicherungen + ausgeführter Plan
|
||
|
||
|
||
## Bessere Ähnlich-Erkennung (Wort-Teilmenge statt Zeichenkette)
|
||
|
||
Früher galt schon eine bloße Zeichenketten-Enthaltung als „Teilwort“. Das
|
||
erzeugte Fehlpaare wie `Mango` ~ `Mangold`, `Buchweizen` ~ `Buchweizenmehl`
|
||
oder `getrocknete Tomate` ~ `getrocknete Tomaten in Öl`. Jetzt zählt nur eine
|
||
echte **Wort-Teilmenge**: jedes Wort der kürzeren Seite muss als *ganzes* Wort
|
||
in der längeren vorkommen. Dadurch verschwinden diese Fehlpaare, während echte
|
||
Untertypen (`Mehl` / `Mehl Type 550`) erhalten bleiben.
|
||
|
||
## Plurale pflegen (Zutaten und Einheiten)
|
||
|
||
Eigener Abschnitt „Plurale“ je Art — für **Zutaten und Einheiten**. Er zeigt
|
||
alle Einträge mit ihrem aktuellen Plural in einem editierbaren Feld; fehlende
|
||
stehen oben und sind hervorgehoben. Ein Filterfeld macht große Listen
|
||
bedienbar. Bearbeiten hakt die Zeile automatisch an. Geschrieben wird nur, was
|
||
sich gegenüber dem Ist-Stand geändert hat — Unverändertes wird übersprungen.
|
||
Setzen und Ändern sind nicht destruktiv und **voll rückspielbar**.
|
||
|
||
## KI-Vorauswahl für ähnliche Paare (ChatGPT)
|
||
|
||
Das Finden der Paare bleibt die Heuristik. Ist beim Prüfen „Ähnliche Paare per
|
||
KI vorfiltern“ aktiv (Vorgabe an, sobald ein `OPENAI_API_KEY` hinterlegt ist),
|
||
ordnet ChatGPT jedes gefundene Paar in drei Töpfe:
|
||
|
||
* **gleich** – zweifelsfrei dasselbe (Schreibvarianten, fehlendes Leerzeichen,
|
||
Groß/Klein, Singular/Plural). Wird **angehakt** und die Richtung vorgewählt
|
||
(der allgemeinere bzw. korrekt geschriebene Name bleibt).
|
||
* **unklar** – könnte dasselbe sein. Wird angezeigt, aber nicht vorgewählt —
|
||
du entscheidest.
|
||
* **verschieden** – zweifelsfrei verschiedene Sorten/Produkte (Weizenmehl 550
|
||
vs. 1050, Frischkäse vs. körniger Frischkäse). Standardmäßig **ausgeblendet**.
|
||
|
||
Ein Filter über der Liste schaltet zwischen **„Nur KI-Treffer“** (gleich +
|
||
unklar) und **„Alle“** (auch die verschiedenen) um.
|
||
|
||
So sind die eindeutigen Fälle mit einem Blick abgehakt, die strittigen bleiben
|
||
sichtbar, und der Lärm ist weg. Nichts wird ausgeführt — du prüfst und startest
|
||
selbst; Zusammenführen bleibt gesichert und rückspielbar. Kommandozeile:
|
||
`pruefen --ki-filter`. Fällt die KI aus, bleiben alle Paare unverändert stehen.
|
||
|
||
## Plurale per KI (ChatGPT)
|
||
|
||
Getrennt davon schlägt ChatGPT auf Wunsch die **Plurale** von Zutaten und
|
||
Einheiten vor — auch die Umlaut-Fälle (`Apfel` → `Äpfel`), die die Heuristik
|
||
nicht kann (`vorbelegen --plan <datei>`, Knopf „Plurale vorschlagen“).
|
||
Standardmäßig nur dort, wo noch kein Plural gepflegt ist; `--alle-plurale` nimmt
|
||
auch bestehende. Einträge, die durch eine angehakte Zusammenführung ohnehin
|
||
verschwinden, werden übersprungen. Auch das ist nur ein Vorschlag und voll
|
||
rückspielbar. Verbindung prüfen: `probe` bzw. „OpenAI testen“.
|
||
|
||
## Hinweis: Einheiten-Plurale und Tandoor-Serverfehler
|
||
|
||
Manche Tandoor-Versionen stürzen beim Ändern einer **Einheit** über einen
|
||
schlichten Teil-PATCH mit „HTTP 500“ ab (Zutaten sind nicht betroffen). Das
|
||
Werkzeug setzt Einheiten-Plurale deshalb robust: zuerst per vollständigem PUT
|
||
(anderer Code-Pfad, alle vorhandenen Felder bleiben erhalten), danach mit
|
||
mitgesendetem Namen, zuletzt der schlichte Weg. Lehnt der Server alle Wege ab,
|
||
werden die restlichen Einheiten-Plurale übersprungen (mit klarer Meldung) statt
|
||
sie einzeln durchzuprobieren — dann bitte in der Tandoor-Oberfläche setzen.
|
||
Zutaten-Plurale laufen davon unberührt weiter.
|