feat: интеграция LLAIM Legal NER как третьей ступени распознавания

- Подключение ru-legal-ner (ONNX) для юридических реквизитов: ИНН, ОГРН,
  СНИЛС, паспорт, телефон, email, банковский счёт, дата.
- Отдельный проход LEGAL_CANDIDATE, чтобы не вытеснять кандидатов имён и адресов.
- coversAny(policy) в Pipeline вместо проверки только FIO.
- Нормализация цифровых ПД (ИНН/СНИЛС/карта/ОГРН) в свободной форме.
- Фикс ложного срабатывания ФИО на аббревиатуре «ИНН» (PD_MARKERS).
- Рефакторинг конструкторов NameCascade через record EngineConfig (Sonar S107).
This commit is contained in:
dakocha3
2026-09-23 21:40:53 +03:00
parent c209c4a366
commit 685ec977de
12 changed files with 384 additions and 14 deletions
@@ -0,0 +1,59 @@
package ru.pdguard;
import org.junit.jupiter.api.Test;
import ru.pdguard.config.SystemPolicy;
import ru.pdguard.core.PayloadStore;
import ru.pdguard.core.Pipeline;
import ru.pdguard.detect.RuleRegistry;
import ru.pdguard.mask.Masker;
import java.util.UUID;
import static org.junit.jupiter.api.Assertions.assertFalse;
/**
* Нормализация цифровых ПД: находит ИНН/СНИЛС/карту/ОГРН(ИП) в свободной форме,
* где жёсткий шаблон ломается на нестандартном разделителе.
*/
class NormalisedDigitsTest {
private final Pipeline pipeline =
new Pipeline(new RuleRegistry(), new Masker(), new PayloadStore(1_000_000L, 30));
private void assertHidden(String text, String secret) {
String masked = pipeline.process(text, UUID.randomUUID().toString(), SystemPolicy.DEFAULT);
assertFalse(masked.contains(secret), "не замаскировано: «" + secret + "» в ответе «" + masked + "»");
}
@Test
void masksCardWithDots() {
assertHidden("Карта 4111.1111.1111.1111 клиента", "4111.1111.1111.1111");
}
@Test
void masksCardWithSlashes() {
assertHidden("Оплата картой 4111/1111/1111/1111 прошла", "4111/1111/1111/1111");
}
@Test
void masksCardWithMixedSeparators() {
assertHidden("Номер карты 4111-1111 1111.1111 клиента", "4111-1111 1111.1111");
}
@Test
void masksInnWithDashes() {
assertHidden("ИНН: 7703-0123-4550 плательщика", "7703-0123-4550");
}
@Test
void masksSnilsWithDots() {
assertHidden("СНИЛС 112.233.445.95 застрахованного", "112.233.445.95");
}
@Test
void keepsNumberThatFailsChecksum() {
String text = "Заказ 1234 5678 9012 3456 отгружен";
org.junit.jupiter.api.Assertions.assertEquals(text,
pipeline.process(text, UUID.randomUUID().toString(), SystemPolicy.DEFAULT));
}
}