Методы Левенштейна, основанные на расстоянии против Soundex

Как выполняется и оценивается запрос CONNECT BY - шаг за шагом (по примеру).

Скажем, у нас есть следующая таблица и соединение по запросу:

select * from mytable;

         X
----------
         1 
         2 
         3 
         4 

SELECT level, m.* 
FROM mytable m
START with x = 1
CONNECT BY PRIOR x +1 = x  OR  PRIOR x + 2 = x 
ORDER BY level;

Шаг 1:

Выберите строки из таблицы mytable, которые соответствуют условию START WITH, присвойте LEVEL = 1 возвращаемому набору результатов:

 CREATE TABLE step1 AS
 SELECT 1 "LEVEL", X from mytable
 WHERE x = 1;

 SELECT * FROM step1;

         LEVEL          X
    ---------- ----------
             1          1

Шаг 2

Увеличить уровень на 1:

LEVEL = LEVEL + 1

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

В этот раздел PRIOR column-name относится к набору результатов, возвращаемому предыдущим шагом, а простой column-name относится к таблице mytable:

CREATE TABLE step2 AS
SELECT 2 "LEVEL", mytable.X from mytable
JOIN step1 "PRIOR"
ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;

select * from step2;

     LEVEL          X
---------- ----------
         2          2 
         2          3

ШАГ x + 1

Повторить # 2 до последней операции возвращает пустой набор результатов.

Шаг 3

CREATE TABLE step3 AS
SELECT 3 "LEVEL", mytable.X from mytable
JOIN step2 "PRIOR"
ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;

select * from step3;

     LEVEL          X
---------- ----------
         3          3 
         3          4 
         3          4

Шаг 4

CREATE TABLE step4 AS
SELECT 4 "LEVEL", mytable.X from mytable
JOIN step3 "PRIOR"
ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;

select * from step4;

     LEVEL          X
---------- ----------
         4          4 

Шаг 5

CREATE TABLE step5 AS
SELECT 5 "LEVEL", mytable.X from mytable
JOIN step4 "PRIOR"
ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;

select * from step5;

no rows selected

Шаг 5 не возвратил никаких строк, поэтому теперь мы завершаем запрос

Последний шаг

UNION ALL результаты всех шагов и вернем его в качестве конечного результата:

SELECT * FROM step1
UNION ALL
SELECT * FROM step2
UNION ALL
SELECT * FROM step3
UNION ALL
SELECT * FROM step4
UNION ALL

SELECT * FROM step5;

     LEVEL          X
---------- ----------
         1          1 
         2          2 
         2          3 
         3          3 
         3          4 
         3          4 
         4          4 

Теперь применим описанную выше процедуру к вашему запросу:

SELECT * FROM dual;

DUMMY
-----
X 

SELECT LEVEL FROM DUAL CONNECT BY rownum>5;

Шаг 1

С тех пор e не содержит предложение START WITH, Oracle выбирает все записи из исходной таблицы:

CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;

select * from step1;

     LEVEL
----------
         1 

Шаг 2

CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5

select * from step2;

no rows selected

Поскольку на последнем шаге не было строк, мы собираемся завершить наш запрос.

Последний шаг

SELECT * FROM step1
UNION ALL

SELECT * FROM step2;

     LEVEL
----------
         1

Анализ последнего запроса:

select level from dual connect by rownum<10;

Я оставляю вас как домашнее задание.

14
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

Soundex довольно примитивен - он был первоначально разработан, чтобы быть вычисленной рукой. Это приводит к ключу, который может быть сравнен.

Soundex работает хорошо с западными именами, поскольку он был первоначально разработан для американских данных переписи. Это предназначается для фонетического сравнения.

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

В основном Soundex лучше для нахождения, что "Schmidt" и "Smith" могли бы быть той же фамилией.

расстояние Левенштейна лучше для определения, что пользователь ввел "Levnshtein" с опечаткой;-)

15
ответ дан Keith 23 May 2017 в 12:34
поделиться
  • 1
    Это хорошо, но я думаю, что видел что-то инструмент для очистки где-нибудь... – Hamish Grubijan 9 August 2011 в 11:09

Я предложил бы использовать Метафон , не Soundex. Как отмечено, Soundex был разработан в 19-м веке для американских имен. Метафон даст Вам некоторые результаты при проверке работы плохих спеллеров, кто "выведывает его" и записывает фонетически.

расстояние Редактирования способно находить опечатки, такие как повторенные буквы, транспонированные буквы, или нажимать неправильную клавишу.

Рассматривают заявление для решения, который будет соответствовать пользователям best— или используйте обоих вместе с Метафоном, дополняющим предложения, произведенные Levenshtein.

Относительно исходного вопроса, я использовал n-граммы успешно в приложениях информационного поиска.

8
ответ дан sll 23 May 2017 в 12:34
поделиться
  • 1
    У Вас есть какой-либо источник на этом? Посмотрите мое обновление вопроса, Android также содержит Аудио Метателя, как это касается перемещения с пальцем? – Bjarke Freund-Hansen 4 August 2011 в 00:21

Я соглашаюсь с Вами на Daitch-Mokotoff, Soundex смещается, потому что исходные американские счетчики хотели 'американизированные' имена.

, Возможно, пример на различии помог бы:

Soundex помещает дополнительное значение в запуск слова - на самом деле он только рассматривает первые 4 фонетических звука. Таким образом, в то время как "Schmidt" и "Smith" будут соответствовать "Smith", и "Wmith" не будет.

алгоритм Levenshtein был бы лучше для нахождения опечаток - один или два пропавших без вести или замененные буквы производят высокую корреляцию, в то время как фонетическое влияние тех, которые пропускают буквы, менее важно.

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

2
ответ дан Keith 23 May 2017 в 12:34
поделиться
  • 1
    потому что он инсинуировал, что globals в порядке и он didn' t избегают процедурного программирования. – citizen conn 3 August 2011 в 12:25

@Keith:

, Поскольку я отправил по другому вопросу, Daitch-Mokotoff лучше для нас европейцы (и я обсудил бы США).

я также считал Wiki на Levenshtein. Но я не вижу, почему (в реальной жизни) это лучше для пользователя, чем Soundex.

0
ответ дан Community 23 May 2017 в 12:34
поделиться
  • 1
    Опасность globals - это, когда Ваши данные могут быть изменены отовсюду в коде, it' s невозможный предсказать то, чем его значение будет в любой данной точке. Это верно в процедурном программировании так же, как в объектно-ориентированном программировании. – JW. 3 August 2011 в 15:21
Другие вопросы по тегам:

Похожие вопросы: