Слияние с 685ec97 (третья ступень NER для юридических реквизитов),
код приведён к google-java-format, добавлены юнит-тесты
AdaptiveConcurrencyLimiter/SystemsConfig/PayloadCipher.
37 lines
1.9 KiB
Java
37 lines
1.9 KiB
Java
package ru.pdguard.detect;
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
/**
|
|
* Проверка, стоит ли перед именем слово, относящее его к организации или объекту на карте.
|
|
*
|
|
* <p>«Институт Склифосовского», «Музей Тропинина», «улица Королёва» — это имена в названиях, а не
|
|
* персональные данные. Отличие от списка известных людей в том, что здесь решает не само имя, а
|
|
* слово перед ним: клиент по фамилии Королёв защиту не теряет, а улица Королёва под маску не
|
|
* попадает.
|
|
*/
|
|
public final class OrganisationDetector {
|
|
|
|
/**
|
|
* Маркер организации вплотную перед именем. Слово может стоять в любом падеже, между ним и именем
|
|
* допускается «имени» или «им.» — «Премия имени Ломоносова».
|
|
*/
|
|
private static final Pattern ORGANISATION_BEFORE =
|
|
Pattern.compile(
|
|
"(?iu:"
|
|
+ String.join("|", ResourceLoader.lines("/names/organisations.txt", false))
|
|
+ ")\\p{L}*"
|
|
+ "(?:\\W{1,3}(?iu:имени|им\\.))?\\W{0,3}$",
|
|
Pattern.UNICODE_CHARACTER_CLASS | Pattern.UNICODE_CASE);
|
|
|
|
/** Сколько знаков перед именем просматривается в поисках маркера организации. */
|
|
private static final int ORGANISATION_LOOKBEHIND = 40;
|
|
|
|
private OrganisationDetector() {}
|
|
|
|
public static boolean precededByOrganisation(String text, int nameStart) {
|
|
int from = Math.max(0, nameStart - ORGANISATION_LOOKBEHIND);
|
|
return ORGANISATION_BEFORE.matcher(text.substring(from, nameStart)).find();
|
|
}
|
|
}
|