Загрузка данных


stop AS (
    SELECT /*+ MATERIALIZE */ WORD, MATCH_TYPE FROM (
        SELECT TRIM(REGEXP_SUBSTR(s, '[^,]+', 1, LEVEL)) AS WORD, 'WORD' AS MATCH_TYPE
        FROM stop_w CONNECT BY LEVEL <= REGEXP_COUNT(s, ',') + 1
        UNION ALL
        SELECT TRIM(REGEXP_SUBSTR(s, '[^,]+', 1, LEVEL)), 'PREFIX'
        FROM stop_p CONNECT BY LEVEL <= REGEXP_COUNT(s, ',') + 1
    )
),
stop_wd AS (SELECT /*+ MATERIALIZE */ ' ' || WORD || ' ' AS W FROM stop WHERE MATCH_TYPE = 'WORD'),
stop_pf AS (SELECT /*+ MATERIALIZE */ ' ' || WORD       AS W FROM stop WHERE MATCH_TYPE = 'PREFIX'),
src AS (
    SELECT DISTINCT NAIMEN
    FROM SH.UCH_VSE
    WHERE NAIMEN IS NOT NULL
      -- AND ROWNUM <= 20000   -- раскомментируйте для пробного прогона
),
t AS (   -- сначала дешёвая выборка ФИО
    SELECT NAIMEN,
           REGEXP_SUBSTR(
               REGEXP_REPLACE(REGEXP_REPLACE(TRIM(NAIMEN), '[[:space:]]+', ' '),
                   '^((КПП|ПБОЮЛ|ИП|ЧП|ФЛ|ИНДИВИДУАЛЬН[А-ЯЁ]*|ПРЕДПРИНИМАТЕЛЬ[А-ЯЁ]*|[0-9]+) )+',
                   '', 1, 1, 'i'),
               '^[А-ЯЁ][-А-ЯЁ]+'
               || '( [А-ЯЁ]\.? ?[А-ЯЁ]\.'
               || '| [А-ЯЁ][-А-ЯЁ]+( [А-ЯЁ][-А-ЯЁ]+)?'
               ||   '( (ОГЛЫ|ОГЛУ|КЫЗЫ|УГЛИ|УУЛУ|ГИРЕЙ|ХАН|БЕК|БАЙ))?)',
               1, 1, 'i') AS FIO
    FROM src
),
shape AS (   -- отсев по форме ДО проверки стоп-слов
    SELECT NAIMEN, FIO
    FROM t
    WHERE FIO IS NOT NULL
      AND LENGTH(FIO) BETWEEN 6 AND 40
      AND LENGTH(REGEXP_SUBSTR(FIO, '^[^ ]+')) > 3
      AND REGEXP_LIKE(UPPER(REGEXP_SUBSTR(FIO, '^[^ ]+')),
          '(ОВ|ЕВ|ЁВ|ИН|ЫН|ИЙ|ЫЙ|ОЙ|ЯН|ЯНЦ|ЕЦ|ЕНОК|ИЧ|УК|ЮК|АК|ЯК|ИК|ХАН|БЕК|БАЙ|[АЕИОУЮЯ])$')
),
tok AS (
    SELECT FIO,
           ' ' || TRIM(REGEXP_REPLACE(UPPER(NAIMEN), '[^А-ЯЁ0-9-]+', ' ')) || ' ' AS TOK
    FROM shape
),
f AS (
    SELECT DISTINCT FIO
    FROM tok k
    WHERE NOT EXISTS (SELECT 1 FROM stop_wd s WHERE INSTR(k.TOK, s.W) > 0)
      AND NOT EXISTS (SELECT 1 FROM stop_pf s WHERE INSTR(k.TOK, s.W) > 0)
)
SELECT COUNT(*) OVER () AS Всего_строк, FIO
FROM f
ORDER BY FIO;