Группировка для извлечения общих значений в полуструктурированных данных
У меня есть "несколько" уродливое поле в базе данных, которое содержит названия локаций. Например, Мэдисон Сквер Гарденс, который также был введен как "Мэдисон Сквер Гарденс" и т. Д. И т. Д.
Я пытаюсь извлечь данные, чтобы я мог получить точный список всех мест. Для этого я создал SQL-запрос, в котором я присоединяю события для каждого местоположения, а затем группирую по имени местоположения и использую только группы местоположений, имеющие более 10 записей (что отфильтровывает несколько не надежные записи), но я по-прежнему получаю некоторые совсем другие варианты написания и записи, что приводит к дублированию свойств / местоположений.
Мой SQL-запрос выглядит так
"ВЫБЕРИТЕ местоположение, СЧЕТ (*) ИЗ локаций ПРИСОЕДИНЯЙТЕСЬ к событию ON location.lid=events.lid ГДЕ `долго` МЕЖДУ - 74.419382608696 И - 73.549817391304 И лат МЕЖДУ 40.314017391304 И 41.183582608696 Расположение GROUP BY СЧЕТЧИК (*)>10
Выполнение этого запроса обеспечивает 3 различных записи "Мэдисон Сквер Гарден", "Мэдисон Сквер Гарденс", "Мэдисон Сквер Гарден". Конечно, это только для входа в Мэдисон Сквер Гарден. Большинство записей имеют несколько несколько разных написаний.
Я ограничиваю свои поиски широтой / долготой, чтобы не получать местоположения с одинаковыми названиями в разных городах, сгруппированных вместе.
Есть ли способ с регулярными выражениями или что-то в предложении GROUP, чтобы их сгруппировать последовательно? Даже простое удаление конечных "и" и "перед" перед группировкой, вероятно, принесет большую пользу.
Я собирался взять каждый результат и затем сопоставить регулярное выражение со всеми местоположениями в пределах широты / долготы?
К счастью, у меня достаточно событий, связанных с локациями, так что я в некоторой степени могу распознать основные локации.
Любые другие предложения для извлечения местоположений из полуструктурированных данных? Данные отбираются из разных источников, поэтому я не могу контролировать ввод.
2 ответа
Вот несколько советов для вас.
Создайте нормализованный столбец названия места в своей базе данных: (1) Проведите каждое имя через несколько простых преобразований... Превратите "Сад Мэдисон Сквер" и "Монумент Вашингтона" в "Поворот Мэдисон Сквер Гарден" и "Монумент Вашингтона" во множественном числе существительные в единственном числе легкий путь... уберите "es", затем "s" из каждого слова в вашем имени. Пропусти все. Удалите все оставшиеся короткие слова "a", "it", "the" и "" & ", которые вы получите. Сортируйте ваши слова в алфавитном порядке, получая "квадрат сада Мэдисона". Сохраните полученную строку в новый столбец таблицы. Совпадение на нем, пока по-прежнему отображается ваша исходная строка.
(2) Создайте таблицу поиска с вариантами написания мест. Это хорошо работает для названий мест проведения выставок, таких как "Бостон Гарден" / "Центр флота" / "ТД Банкнорт Гарден" / "Северный вокзал" и тому подобное. То же место, другое правописание. ("Станция Penn" для вашего примера).
(3) Вы можете использовать службы геокодирования Yahoo или Google Maps, которые будут принимать неполные имена и адреса и стандартизировать их.
Soundex принесет вам немало ложноположительных совпадений. Он разработан как запасной вариант и требует устранения неоднозначности для человека.
Если ваша проблема обрабатывает "похожие" строки одинаково, вы можете проверить алгоритм SOUNDEX. Я не уверен, будет ли это работать для всех ваших разных сценариев, но это только начало.
Это обсуждается в этой ветке: Как сделать нечеткое совпадение названий компаний в MYSQL с PHP для автозаполнения?