feat(decon): opcjonalny pass near-duplicate (MinHash/Jaccard) - #36
feat(decon): opcjonalny pass near-duplicate (MinHash/Jaccard)#36natiixnt wants to merge 3 commits into
Conversation
|
@natiixnt is attempting to deploy a commit to the kwikiel's projects Team on Vercel. A member of the Team first needs to authorize it. |
…_audit
Verbatim n-gram łapie tylko dokładny wspólny ciąg >= N słów, więc mija
itemy krótsze niż N oraz lekko przeredagowane kopie. Dodaje opcjonalny
pass --near-dup (MinHash + LSH banding, estymata Jaccarda) jako
uzupełniający, rekord-do-rekordu sygnał podobieństwa. Pure-python, zero
nowych zależności; domyślne zachowanie (sam verbatim) niezmienione.
Przy okazji: os.makedirs("results", exist_ok=True) przed zapisem historii
audytu - bez tego decon_audit.py crashował FileNotFoundError gdy katalog
results/ nie istniał (np. świeży checkout).
Test: bench/test_decon_neardup.py (samowystarczalny, bez sieci i danych).
b898355 to
2fc30fc
Compare
|
🤖 Automated code review (Xavier / Xfaang), requested by @zientara in Verdict: APPROVE WITH NITS — implementation is correct, deterministic, well-tested, zero new dependencies. Strongly prefer this over the parallel #29. Findings:
Verified good (empirically, not just read): determinism ( Comparison vs #29 (same feature, ~90% overlap — don't land both): #29 adds a separate |
usunieto datasketch/minhash (silnik w #36), naprawiono asymetrie fold_shingles (bez fallbacku calotekstowego), --strip tylko verbatim, --strip-diacritics jawnie dla tieru diakrytykow + ostrzezenie over-collapse, report -> public/results/
- ostrzeżenie gdy near-dup próg Jaccard < 0.65 (banding LSH ma tam obniżony recall) + doc sprzężenia w --jaccard --help - usunięcie nieosiągalnej gałęzi `if not hs` w minhash_signature (sh nigdy puste przez fallback) + docstring o trywialnej sygnaturze - notka O(N * perms * shingli) i kosztu w komentarzu near-dup Logika add/query/estimate_jaccard/lsh_keys nietknięta; domyślne zachowanie (próg 0.7) bez zmian.
…layerlabs#29) Near-dup MinHash przepuszczał kopie pozbawione polskich znaków (zażółć -> zazolc). Flaga --fold-diacritics zwija polskie diakrytyki do ASCII przed shinglingiem, symetrycznie dla indeksu i zapytań, więc łapie też takie kopie - łącząc MinHash (przestawienia, krótkie itemy) z foldem diakrytyków z slayerlabs#29 w jednym, zintegrowanym passie (stdlib-only). Domyślnie OFF (fold=False) - zachowanie bez zmian. Over-collapse (łoś->los) akceptowalny dla bramki kontaminacji: podnosi recall, a weryfikacja Jaccardem >= próg i tak filtruje. Test pokrywa fold on/off.
|
Dołożyłem opcjonalny |
* feat: decon near-dup layer (diacritics + MinHash) decon_audit.py wykrywa tylko kontaminacje doslowna (n-gramy slow). Ten modul dokłada warstwe near-duplicate na tych samych EVAL_SOURCES i lapie przecieki, ktore warstwa doslowna przepuszcza: kopie bez polskich znakow oraz lekko przeredagowane itemy (MinHash/Jaccard). CPU-only, datasketch opcjonalny, decon_audit bez zmian. * refactor(decon): tier diakrytykow only — minhash do #36 usunieto datasketch/minhash (silnik w #36), naprawiono asymetrie fold_shingles (bez fallbacku calotekstowego), --strip tylko verbatim, --strip-diacritics jawnie dla tieru diakrytykow + ostrzezenie over-collapse, report -> public/results/
|
Kontekst po ostatnich merge'ach (dla review @kwikiel): #29 (diakrytyki) jest już w main i celowo zostawia MinHash tutaj (cytat z mergowanego decon_neardup.py: "Near-dup MinHash/Jaccard jest w #36 (decon_audit)"). Ten PR dostarcza więc nie-zdublowany rdzeń: near-dup MinHash + LSH/Jaccard w decon_audit (main go nie ma), opcjonalny |
Rozszerza
bench/decon_audit.pyo opcjonalny pass near-duplicate. Powiązane z #4 (skrypt dekontaminacji).Dlaczego
Verbatim n-gram łapie tylko dokładny wspólny ciąg >= N słów, więc mija: itemy krótsze niż N słów (zero n-gramów) oraz lekko przeredagowane kopie. To realna luka w bramce anty-kontaminacji.
Co
--near-dup: MinHash + LSH banding, estymata Jaccarda, rekord-do-rekordu. Pure-python, zero nowych zależności.--near-dup --jaccard 0.7 --minhash-k 4 --perms 128 --bands 32.neardup_hits/hits(addytywnie;verbatim_hitszachowane).os.makedirs("results", exist_ok=True)przed zapisem historii - bez tego skrypt crashowałFileNotFoundErrorna świeżym checkoucie.Test
bench/test_decon_neardup.py- samowystarczalny (bez sieci islayer-data/): rdzeń MinHash, retrieval LSH, komplementarność (8-gram ślepy na krótki item, near-dup łapie).Ograniczenie
Pełnego audytu na realnym korpusie nie odpalono (dane
slayer-data/poza repo). Weryfikacja na syntetycznym fixture; ktoś z dostępem do danych powinien odpalić--near-dupna realnych shardach.