Rezept-Zuordnung: die Einheit verraet das falsche Produkt

"200 ml Schlagsahne" landete auf "Kraeuter Sahne Haehnchen" - beide teilen
das Wort "Sahne", der Rest ist Zufall. Die Einheit haette es verraten: Das
Haehnchen wird in Gramm gefuehrt, das Rezept sagt Milliliter. Wo sich die
Rezept-Einheit gar nicht umrechnen laesst, wird deshalb nicht mehr
zugeordnet, sondern offen gelassen - lieber "nichts Passendes gefunden"
samt Begruendung als eine falsche Behauptung.

Entscheidend ist, WARUM die Umrechnung scheitert, und nur einer der Gruende
sagt etwas ueber den Artikel:

- Bekannte Einheit falscher Art ohne Zweiteinheit -> spricht gegen den
  Artikel. Milliliter an einem Gramm-Produkt ist ein anderes Produkt.
- Unbekanntes Wort oder nicht hinterlegtes Hausmass ("1 Tasse Linsen") ->
  sagt gar nichts. Die Linsen koennen voellig richtig sein, es fehlt bloss
  die Massangabe, und die laesst sich nachtragen.
- Gar keine Einheit ("3 Eier") -> passt immer.

Die erste Fassung hat das nicht unterschieden und damit "1 Tasse Linsen"
zu "nicht zugeordnet" gemacht, obwohl der Artikel stimmte - die beiden
bestehenden Tests haben das sofort gezeigt.

Bei mehreren Kandidaten gewinnt jetzt der mit passender Einheit, auch gegen
eine hoehere Namensaehnlichkeit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-02 13:25:41 +02:00
co-authored by Claude Opus 5
parent 41d262cb2d
commit 2a56cca3c8
2 changed files with 116 additions and 9 deletions
+51
View File
@@ -310,6 +310,57 @@ def test_beiwoerter_stoeren_den_echten_treffer_nicht(db):
assert zutat.ziel_id == aepfel.id
def test_falsche_einheit_spricht_gegen_den_artikel(db):
"""„200 ml Schlagsahne" ist kein „Kräuter Sahne Hähnchen"."""
fleisch = _kategorie(db, "Fleisch & Fisch")
_artikel(db, "Kräuter Sahne Hähnchen", fleisch, base=BaseUnit.gram, bestand=800)
[zutat] = pruefe_zutaten(db, [_zutat("Schlagsahne", 200, "ml")])
assert zutat.status == "kein_treffer"
assert "nicht in 'ml' geführt" in zutat.hinweis
def test_passende_einheit_gewinnt_gegen_hoehere_punktzahl(db):
molk = _kategorie(db, "Molkereiprodukte")
fleisch = _kategorie(db, "Fleisch & Fisch")
_artikel(db, "Sahne Hähnchen", fleisch, base=BaseUnit.gram, bestand=800)
richtig = _artikel(db, "Schlagsahne Rahm", molk, base=BaseUnit.milliliter, bestand=500)
[zutat] = pruefe_zutaten(db, [_zutat("Schlagsahne", 200, "ml")])
assert zutat.ziel_id == richtig.id
def test_fehlendes_hausmass_spricht_nicht_gegen_den_artikel(db):
"""Nur eine BEKANNTE Einheit falscher Art ist ein Hinweis.
„1 Tasse Linsen" heisst nicht, dass die Linsen falsch sind – es fehlt bloss
die Maßangabe, und die laesst sich nachtragen.
"""
cat = _kategorie(db, "Hülsenfrüchte")
linsen = _artikel(db, "Berglinsen", cat, bestand=1000)
[zutat] = pruefe_zutaten(db, [_zutat("Berglinsen", 1, "Tasse")])
assert zutat.ziel_id == linsen.id
assert zutat.status == "menge_unbekannt"
def test_zweiteinheit_laesst_die_fremde_einheit_zu(db):
cat = _kategorie(db, "Backwaren")
broetchen = _artikel(db, "Brötchen", cat, base=BaseUnit.piece, package_size=6,
bestand=12)
broetchen.secondary_base = BaseUnit.gram.value
broetchen.secondary_count = 1
broetchen.secondary_amount = 50
db.commit()
[zutat] = pruefe_zutaten(db, [_zutat("Brötchen", 100, "g")])
assert zutat.ziel_id == broetchen.id
def test_umlaut_und_mehrzahl_finden_sich(db):
"""Rezept schreibt „Apfel", im Katalog stehen „Äpfel"."""
cat = _kategorie(db, "Obst & Gemüse")