Skip to content

feat(import_common): matchowanie autorów PL↔EN (Ewa Marańda ↔ Eva Maranda)#239

Merged
mpasternak merged 2 commits into
devfrom
match-pl-en
May 21, 2026
Merged

feat(import_common): matchowanie autorów PL↔EN (Ewa Marańda ↔ Eva Maranda)#239
mpasternak merged 2 commits into
devfrom
match-pl-en

Conversation

@mpasternak
Copy link
Copy Markdown
Member

Summary

  • Importy z anglojęzycznych źródeł (CrossRef, DSpace EN) nie łapały polskich autorów, gdy źródło dawało zangielszczoną pisownię imienia (Eva zamiast Ewa) lub nazwisko bez diakrytyków (Maranda zamiast Marańda). matchuj_autora() używał __iexact, które w Postgresie jest diacritic-sensitive i nie zna transliteracji v↔w.
  • Dodaje fallback w matchuj_autora jako ostatni krok przed _try_match_autor_with_orcid_or_tytul. Dwa źródła wariantów:
    1. Reguła v↔w po unidecode-fold (Eva↔Ewa, Viktor↔Wiktor, Wioletta↔Violetta) — fonetyczna, generyczna.
    2. Hand-curated mapa 25 klastrów (Krzysztof↔Christopher, Paweł↔Paul, Maria↔Mary, Łukasz↔{Luke, Lucas}, Anna↔{Ann, Anne}, Katarzyna↔{Catherine, Katherine}, Stefan↔{Stephen, Steven} itd.).
  • Nazwisko jest porównywane przez Lower(Unaccent(...)) po stronie SQL — Marańda matchuje się z Maranda.

Decyzje projektowe

  • Regula v↔w stosowana TYLKO do imion — polskie nazwiska mają w jako autentyczną literę (WojciechowskiVojciechowski). Test test_v_to_w_not_applied_to_surname to potwierdza.
  • Przy ambiguity zwracamy None — gdy fallback trafia w wielu kandydatów, decyzja należy do użytkownika w UI (Komparator dostanie BRAK_DOPASOWANIA i pokaże listę).
  • Zero regresji dla istniejącego matchu — fallback uruchamia się tylko gdy normalny __iexact zawiódł.
  • Bez migracji — extension unaccent jest już zainstalowane przez bpp/migrations/0001_fulltext.sql.
  • Wpięcie w jednym punkcie — wszystkie callerzy matchuj_autora (importer_publikacji via Komparator, import_dyscyplin, pbn_integrator) automatycznie korzystają z nowego zachowania.

Test plan

  • pytest src/import_common/tests/test_autor_pl_en_matching.py — 26 nowych testów, w tym literalny przypadek "Ewa Marańda" ↔ "Eva Maranda", parametryczne (Krzysztof↔Christopher, Paweł↔Paul, ...), negatywne (Marcin ≠ Mark, Wojciechowski ≠ Vojciechowski), ambiguity → None, brak regresji iexact.
  • pytest src/import_common/ src/crossref_bpp/tests/test_core.py src/importer_publikacji/tests/test_views_authors.py — 216 passed, zero regresji.
  • ruff format + ruff check — clean.
  • Smoke-test w UI: zaimportować publikację przez CrossRef DOI, w której współautorem jest polski badacz pod angielską formą imienia (np. „Christopher Marańda") — sprawdzić, że ImportedAuthor.match_status = AUTO_LOOSE i matched_autor wskazuje na polskiego autora.

🤖 Generated with Claude Code

mpasternak and others added 2 commits May 21, 2026 12:12
… Maranda)

Importy z anglojezycznych zrodel (CrossRef, DSpace EN) nie lapaly
polskich autorow gdy zrodlo dawalo zangielszczona pisownie imienia
(Eva zamiast Ewa) lub nazwisko bez diakrytykow (Maranda zamiast
Maranda). matchuj_autora() uzywal __iexact, ktore w Postgresie jest
diacritic-sensitive i nie zna transliteracji v<->w.

Fallback w matchuj_autora() jako ostatni krok przed
_try_match_autor_with_orcid_or_tytul:

- nazwisko: SQL Lower(Unaccent(...)) na obu stronach (Maranda <-> Maranda)
- pierwsze imie: reguly v<->w generuja kandydatow (Eva -> {Eva, Ewa})

Regula v<->w stosowana TYLKO do imion - polskie nazwiska maja "w"
jako autentyczna litere (Wojciechowski != Vojciechowski). Przy
ambiguity (wielu kandydatow) zwracamy None - decyzja w UI.

Extension `unaccent` byla juz zainstalowana przez 0001_fulltext, wiec
zadna migracja nie jest potrzebna.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reguła v<->w pokrywa fonetyczne pary (Ewa/Eva, Wiktor/Viktor), ale
nie złapie imion bez wspólnego korzenia: Krzysztof<->Christopher,
Paweł<->Paul, Maria<->Mary itp. Dodaje POLISH_ENGLISH_NAME_CLUSTERS
z 25 najczęstszymi parami/trójkami w akademii.

Klastry są bidirectional - imię może należyć do co najwyżej jednego
klastra, lookup robiony po unidecode-fold + lowercase. Dodaje 16
parametrycznych przypadków testowych i negatywny test
"Marcin != Mark", żeby zapobiec false-positive na imionach spoza
klastra.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mpasternak mpasternak merged commit beb9bc4 into dev May 21, 2026
17 checks passed
@mpasternak mpasternak deleted the match-pl-en branch May 21, 2026 10:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant