Как выбрать наиболее подходящую подстроку для другой строки - PullRequest
0 голосов
/ 25 ноября 2018

Допустим, полная строка равна

В следующем примере проверяется строка, ищется первая подстрока, ограниченная запятыми

, а подстрока -

подстановка ограничена

есть ли способ проверить всю строку, если она содержит 90% совпадающую подстроку, используя sql

как слово подстановка ограничена и подстрока ограничена в моем примере

подстрока может быть составной из нескольких слов, поэтому я не могу разбить полноестрока в слова.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Сначала преобразуйте свой текст в таблицу слов.Вы найдете много сообщений в этой теме на SO, например, здесь

Вам придется настроить список символов-разделителей, чтобы извлечь только слова.

Это пример запроса

 with t1 as (select 1 rn, 'The following example examines the string, looking for the first substring bounded by comas' col from dual  ),
      t2 as (select  rownum colnum from dual connect by level < 16 /* (max) number of words */),
      t3 as (select t1.rn, t2.colnum, rtrim(ltrim(regexp_substr(t1.col,'[^ ,]+', 1, t2.colnum)))  col  from t1, t2 
      where regexp_substr(t1.col, '[^ ,]+', 1, t2.colnum) is not null)
 select * from t3;

COL      
----------
The        
following  
example    
examines
...

На следующем шаге введите Расстояние Левенштейна , чтобы получить закрывающее слово.

 with t1 as (select 1 rn, 'The following example examines the string, looking for the first substring bounded by comas' col from dual  ),
      t2 as (select  rownum colnum from dual connect by level < 16 /* (max) number of words */),
      t3 as (select t1.rn, t2.colnum, rtrim(ltrim(regexp_substr(t1.col,'[^ ,]+', 1, t2.colnum)))  col  from t1, t2 
      where regexp_substr(t1.col, '[^ ,]+', 1, t2.colnum) is not null)
 select col, str, UTL_MATCH.EDIT_DISTANCE(col, str)  distance
 from t3
 cross join (select 'commas' str from dual)
 order by 3;

COL        STR      DISTANCE
---------- ------ ----------
comas      commas          1 
for        commas          5 
examines   commas          6 
...

Проверьте определение ЛевенштейнаРасстояние и определите порог на расстоянии, чтобы получить слова-кандидаты.

С соответствием независимо от границы слова Простое сканирование вашего ввода и получение всех подстрок в длине строки соответствиядля разности, например, добавление 10%.

Вы можете ограничить кандидатов, отфильтровывая только те подстроки, которые начинаются на границе слова.В остальном же расчет расстояния.

 with txt as (select  'The following example examines the string, looking for the first substring bounded by comas' txt from dual),
      str as (select  'substing bounded' str from dual),
      t1 as (select  substr(txt, rownum, (select length(str) * 1.1 from str)) substr, /* add 10% length for the match */
                     (select str from str) str 
             from txt connect by level < (select length(txt) from txt) - (select length(str) from str)) 
 select SUBSTR, STR, 
        UTL_MATCH.EDIT_DISTANCE(SUBSTR, STR)  distance
 from t1
 order by 3;

SUBSTR               STR                DISTANCE
-------------------- ---------------- ----------
substring bounded    substing bounded          1 
ubstring bounded     substing bounded          3 
 substring bounde    substing bounded          3 
t substring bound    substing bounded          5 
...
0 голосов
/ 25 ноября 2018

Поэкспериментируйте с функцией SOUNDEX.

Я не проверял это, но это может помочь вам на вашем пути:

    WITH strings AS (
      select regexp_substr('The following example examines the string, looking for the first substring bounded by comas','[ ]+', 1, level) ss 
      from dual
      connect by regexp_substr('The following example examines the string, looking for the first substring bounded by comas', '[ ]+', 1, level) is not null
    )
    SELECT ss 
    FROM strings
    WHERE SOUNDEX(ss) = SOUNDEX( 'commas' ) ;

REGEXP_SUBSTR с CONNECT BY разбиениямидлинная строка в слова (через пробел) - при необходимости измените разделитель, добавив знаки препинания и т. д.

Здесь мы полагаемся на встроенный SOUNDEX, соответствующий нашим ожиданиям.

...