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 4bdb03341b
commit 84b5adcb3f
12 changed files with 384 additions and 14 deletions
@@ -83,6 +83,15 @@ public final class NameDictionary {
.map(stem -> stem.toLowerCase(Locale.ROOT))
.collect(Collectors.toUnmodifiableSet());
/**
* Слова-маркеры персональных данных и реквизитов, которые по словообразованию
* совпадают с основами имён («ИНН» — основа имени «Инна») и потому ложно
* распознаются как ФИО. Это аббревиатуры, а не имена.
*/
private static final Set<String> PD_MARKERS = Set.of(
"инн", "снилс", "огрн", "огрнип", "кпп", "бик", "паспорт", "счёт", "счет",
"телефон", "email", "почта", "дата", "адрес", "полис", "свидетельство", "ву");
private NameDictionary() {
}
@@ -163,6 +172,9 @@ public final class NameDictionary {
*/
public static boolean isStandaloneNameCandidate(String word) {
String lower = word.toLowerCase(Locale.ROOT);
if (PD_MARKERS.contains(lower)) {
return false;
}
if (GIVEN_NAMES.contains(lower)) {
return true;
}