Matching & Scoring
Engine
apps/api/src/services/matching/engines/deterministicEngine.ts
- Nutzt
NormalizationServicezur Vorverarbeitung. - Berechnet Ähnlichkeiten via
similarity()(Damerau-Levenshtein) plus Spezialbehandlung für Autor:innen, Daten, Container-Titel, Volume/Issue und Seiten. - Aggregiert Feld-Scores (0–100) anhand der aktivierten Gewichte.
Normalisierung (Reihenfolge)
Quelle: NormalizationService.normalize:
normalize-typography– Typografie (Smart Quotes, Gedankenstriche, Ellipse).normalize-characters– korrigiert defekte Zeichen.normalize-urls– vianormalize-url(Tracking-Parameter entfernen, Query sortieren).normalize-identifiers– bereinigt DOI-/URL-Präfixe.normalize-umlauts– z. B.ä → ae,ß → ss.normalize-accents– Unicode-Dekomposition, entfernt Diakritika.normalize-unicode–NFKC, entfernt Zero-Width-Zeichen.normalize-punctuation– reduziert auf Buchstaben/Zahlen/Leerzeichen.normalize-whitespace– Trim, Mehrfach-Leerzeichen entfernen.normalize-lowercase– Kleinschreibung.
Nur aktivierte Regeln werden angewendet.
Feld-Heuristiken
- Autor:innen (
match-author-initials) – Familiennamen (exakt oder ≥0,9) und Initialen pertokenizeGiven/isSubsequence. - Datum (
match-structured-dates) – CSL-Daten (date-parts,raw,literal) mit Gewichtungyear0,8,month0,15,day0,05. - Volume/Issue (
match-volume-issue-numeric) – extrahiert Zahlen und vergleicht das erste Vorkommen. - Seiten (
match-page-range-overlap) – erkennt Bereiche, erweitert Kurzschreibungen („123-8“) und berechnet das Schnittmenge/Vereinigung-Verhältnis. Einzelseite vs. Bereich → 1,0, wenn enthalten. - Container-Titel (
match-container-title-variants) – entfernt Akronyme in Klammern, testet Varianten, nutzt Damerau-Levenshtein.
Score-Berechnung
ts
overall = sum(fieldScore * weight) / sum(weight)fieldScoreliegt bereits zwischen 0 und 100.- Felder ohne Inhalte werden ignoriert (
MetadataComparator). - Ergebnisse werden absteigend sortiert (
MatchingCoordinator).
Beispiel
title: 100 %, Gewicht 30author: 92 %, Gewicht 25issued: 85 %, Gewicht 15container-title: 70 %, Gewicht 15DOI: 100 %, Gewicht 10volume: 0 %, Gewicht 3page: 50 %, Gewicht 2
overall ≈ 0.3*100 + 0.25*92 + 0.15*85 + 0.15*70 + 0.1*100 + 0.03*0 + 0.02*50 = 83,7 → 84
UI-Schwellen & Farben
Konfiguriert in settings.matching.matchingConfig.displayThresholds und umgesetzt durch getScoreColor.
score >= 85→success(grün, starker Treffer).50 <= score < 85→warning(orange, möglicher Treffer).< 50→error(rot).score === 100→ ebenfallssuccess(hervorgehobener Chip).
Early Termination
settings.matching.matchingConfig.earlyTerminationStandard{ enabled: true, threshold: 95 }.useVerification.performVerificationWithEarlyTermination:- Aktivierte Datenbanken in Prioritätsreihenfolge (
settings.search.databases). - Nach jeder Suche Score prüfen.
- Bei Score ≥ Threshold weitere Datenbanken überspringen.
- Ohne Early Termination werden alle Datenbanken abgefragt und abschließend erneut gematcht.
- Aktivierte Datenbanken in Prioritätsreihenfolge (
useVerificationProgressStore verfolgt Phasen (searching, matching, done, error) pro Referenz.
TODOs
- TODO: Dokumentieren, wie alternative Gewichtsschemata (
strict,balanced,custom) eingesetzt werden, sobald verfügbar. - TODO: Beispiele für individuelle Normalisierungsprofile (z. B. „nur Titel + DOI“) ergänzen.