У меня есть 2 разных, но похожих набора данных, к которым я бы хотел присоединиться.Оба идентифицируют географические местоположения.Первый - мой собственный «тщательно отобранный и полностью безошибочный окончательный список», в то время как другой составлен из множества неизвестных источников, содержит несколько «дубликатов» (очевидных и неочевидных).
Моя таблица структурирована следующим образом
CREATE TABLE [dbo].[Places] (
[place_id] [int] NOT NULL ,
[place_name] [varchar] (40),
[country_id] [varchar] (2),
[latitude] [decimal](8, 6) NULL ,
[longitude] [decimal](9, 6) NULL ,
[other_place_id] [int] NULL
)
Вторая таблица имеет аналогичную структуру
CREATE TABLE [dbo].[OtherPlaces] (
[other_place_id] [int] NOT NULL ,
[other_place_name] [varchar] (40),
[country_id] [varchar] (2),
[latitude] [float] NULL ,
[longitude] [float] NULL ,
[place_id] [int] NULL
)
Я могу запустить простой запрос на совпадение, например
Select p.*, o.other_place_id
from Places p
JOIN OtherPlaces o
on p.country_id = o.country_id
and p.place_name = o.other_place_name
where abs(60*(p.latitude - o.latitude)) < 5
and abs(60*(p.longitude - o.longitude)) < 5
, и это будетподберите одинаковые места, расположенные на расстоянии 5-10 миль друг от друга.
Это будет соответствовать примерно 75% записей.
Оставшаяся группа имеет множество проблем:
- Неправильные местоположения (N / SE / W неверно илипросто численно неверно)
- Альтернативное написание / использование языка (см. ниже)
- Места с альтернативными значениями country_id (на спорных территориях или просто неправильно введены)
- Места, неизвестные ни одному из данныхset
Предполагая, что я доволен правдивостью сопоставления в этом первом запросе, я просто запустил бы эквивалентный UPDATE запрос UPDATE Places SET other_place_id = o.other_place_id из Places p ПРИСОЕДИНЯЙТЕСЬ к OtherPlaces o на p.country_id = o.country_id и p.place_name = o.other_place_name где abs (60 * (p.latitude - o.latitude)) <5 и abs (60 * (p.longitude - o.longitude)) <5 </p>
Это позволит затем выполнять дополнительные запросы с использованием (псевдо) кода, такого как Select p. , o.other_place_id из Places p JOIN OtherPlaces o on p.country_id = o.country_id и p.place_name SOUNDSLIKE (o.other_place_name), где abs (60 (p.latitude - o.latitude))
Это позволило бы мне создать функцию SOUNDSLIKE, которая могла бы сопоставлять залив Пальмейра с Байей де Пальмейрой и Сен-Мартан с Сен-Мартеном.
Сценарий альтернативного орфографии имеет 3 аспекта:
- Альтернативные языки
- Неправильные орфографические ошибки при вводе данных
- Локальное именование
1 и 3 могут быть связаны, но часто не связаны.
Информация о местоположении WRT, между двумя наборами данных часто будут небольшие различия, что является приемлемым.Тем не менее, большие расхождения могут возникнуть.Некоторые из них действительны (то есть, что такое широта / длина для Сингапура? Это большой маленький остров), некоторые - ошибки транскрипции / транспозиции при вводе данных.А в некоторых случаях нет данных о местоположении: - (
У меня такой вопрос, есть ли лучший способ управления процессом сопоставления, чем серия итеративных запросов, постоянно уточняющих и исключающих предыдущие совпадения?
И как лучше всего управлять функциональностью SOUNDSLIKE? Я посмотрел на эту ветку и добавил функции Левенштейна и Метафона, но я не уверен, что любая из них использует какое-либо тезаурусное сопоставление для отдельных словЯ думаю, что тезаурус / словарь может быть полезным инструментом, так как я определил повторные подсчеты слов в 2 наборах данных и, конечно, у меня есть списки эквивалентных слов / терминов для создания поиска.
Наконец, основная причинапри этом я знаю, что это произойдет снова и снова в будущем, и было бы полезно иметь лучшие инструменты по мере продвижения вперед.
TIA