Соответствие одинаковым названиям городов в SQL - PullRequest
2 голосов
/ 08 января 2010

У меня есть таблица «Город», которая содержит названия городов, и у меня есть еще одна таблица, которую я только что создал, и в которой содержатся города из разных источников. Когда я запускаю запрос на совпадение городов между двумя таблицами, я обнаруживаю около 5000 несоответствий.

Поэтому, пожалуйста, дайте несколько запросов, которые я могу использовать для сопоставления городов (потому что иногда пользователи вводят названия городов с одним или двумя символами разного) ... Я создал запрос, который работает нормально, но мне нужен такой запрос, чтобы соответствовать больше .

Пожалуйста, предложите мне, что делать в такой ситуации.

SELECT distinct hsm.countryname,co.countryname,hsm.city,co.city
FROM   HotelSourceMap AS hsm
INNER  JOIN 
    (  SELECT c.*,cu.countryName
       FROM   city c
       INNER  JOIN  country cu ON c.countryid= cu.countryId
    ) co
ON (charindex(co.city,hsm.city) > 0 AND hsm.countryid = co.countryid) AND
    hsm.cityid is null

Ответы [ 6 ]

18 голосов
/ 08 января 2010

Если вы реализуете алгоритм Расстояние Левенштейна как пользовательскую функцию, он вернет число операций, которые необходимо выполнить над строкой_1, чтобы он стал строкой_2. Затем вы можете сравнить результат функции расстояния Левенштейна с фиксированным порогом или с процентной длиной строки_1 или строки_2.

Вы бы просто использовали его следующим образом:

WHERE LD(city_1, city_2) < 4;

Использование Полнотекстовый поиск может быть другим вариантом, тем более что реализация расстояния Левенштейна потребует полного сканирования таблицы. Это решение может зависеть от того, как часто вы собираетесь проводить это сравнение.

Возможно, вы захотите проверить следующую реализацию расстояния Левенштейна для SQL Server:

10 голосов
/ 08 января 2010

Вы можете использовать Soundex для сравнения двух строк, которые написаны по-разному, но имеют одинаковое произношение.

Это зависит от того, как они ошибаются. Если это просто опечатки, вероятно, используйте расстояние Левенштейна, которое рекомендует Даниэль Вассалло. Если это неправильно написано людьми, которые не знали, как пишется город, используйте Soundex.

Может быть, использовать оба!

2 голосов
/ 08 января 2010

Функция SoundEx будет лучшим вариантом для таких сценариев, но работает только тогда, когда гласные в слове неверны или отсутствуют.Если согласные не соответствуют, это не сработает.Другим подходом для этого было бы написать простую логику определения соответствующего предела несоответствия между двумя словами;хотя это не дает 100% точности, может решить эту задачу.Простая скалярная функция, которая использует функцию SoundeEx - внутренне, должна быть достаточной.

1 голос
/ 08 января 2010

Лучшее решение - использовать SOUNDEX. Я попробовал какой-то тест: он соответствует Уотерленду, Уитерленду, но не Уайперленду. Я думаю, что это должно соответствовать вашим требованиям. SOUNDEX преобразует альфа-строку в четырехсимвольный код для поиска похожих слов или имен.

select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Waterland')

==> Совпадение

select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Witerland')

==> Совпадение

select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Wiperland')

==> Нет совпадений

0 голосов
/ 09 января 2010

Мне повезло с алгоритмом двойного метафона для нечетких совпадений по именам. Концепция похожа на Soundex в том, что она сводит слово к коду, но она гораздо сложнее. В моей базе данных у меня будет поле 'name' и поле 'nameDoubleMetaphone', которое я вычисляю при вставке. Это делает поиск и присоединение довольно быстрым.

Википедия - хорошее место для начала: http://en.wikipedia.org/wiki/Double_Metaphone

0 голосов
/ 08 января 2010

Вы должны исправить имена в базе данных. Базы данных предназначены для точных совпадений, а не "выглядят в основном как". Самое простое исправление, вероятно, состоит в том, чтобы экспортировать таблицу в формате CSV, загрузить ее в Excel (два столбца: первичный ключ и название города), а затем использовать проверку орфографии для исправления имен. После исправления всех имен снова импортируйте таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...