fix: распознавать одиночные имена и расширить правила дат и CVV/PIN
This commit is contained in:
@@ -132,6 +132,34 @@ public final class NameDictionary {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, что фрагмент — имя, отчество или фамилия человека. Используется
|
||||
* для строчных имён после ролевого слова («клиент иван иванов»), где регистр
|
||||
* не подсказывает, что перед нами имя.
|
||||
*/
|
||||
public static boolean containsNamePart(String value) {
|
||||
for (String word : value.split("\\P{L}+")) {
|
||||
String lower = word.toLowerCase(Locale.ROOT);
|
||||
if (GIVEN_NAMES.contains(lower)) {
|
||||
return true;
|
||||
}
|
||||
if (isPatronymic(lower) || isSurname(lower)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Отчество: Иванович, Петровна, Сидоровна. */
|
||||
private static boolean isPatronymic(String lower) {
|
||||
return lower.matches(".*(?:ович|евич|овна|евна|ична|ичн)$");
|
||||
}
|
||||
|
||||
/** Фамилия по словообразованию: Иванов, Петрова, Троицкий, Шевченко. */
|
||||
private static boolean isSurname(String lower) {
|
||||
return lower.matches(".*(?:ов|ев|ёв|ин|ын|ск(?:ий|ая|ого|ой|ом)|цк(?:ий|ая)|енко|ко|ук|юк|ян|швили|дзе)$");
|
||||
}
|
||||
|
||||
/**
|
||||
* Содержит ли текст упоминание известного человека — из сборки или дописанных
|
||||
* сверху.
|
||||
|
||||
Reference in New Issue
Block a user