Группировка для извлечения общих значений в полуструктурированных данных - PullRequest
1 голос
/ 26 ноября 2009

У меня есть «несколько» уродливое поле в базе данных, которое содержит названия локаций. Например, Мэдисон Сквер Гарденс, который также был введен как «Мэдисон Сквер Гарденс» и т. Д. И т. Д.

Я пытаюсь извлечь данные, чтобы получить точный список всех мест. Для этого я создал SQL-запрос, в котором я присоединяю события для каждого местоположения, а затем группирую по имени местоположения и использую только группы местоположений, имеющие более 10 записей (что отфильтровывает несколько не надежные записи), но я все равно получаю некоторые совсем другие варианты написания и записи, что приводит к дублированию свойств / местоположений.

Мой SQL-запрос выглядит так

"SELECT location, COUNT(*) FROM locations 
JOIN event ON locations.lid=events.lid
WHERE `long`
BETWEEN - 74.419382608696
AND - 73.549817391304
AND lat
BETWEEN 40.314017391304
AND 41.183582608696
GROUP BY location 
HAVING COUNT(*)>10

Выполнение этого запроса обеспечивает 3 различных записи "Мэдисон Сквер Гарден", "Мэдисон Сквер Гарденс", "Мэдисон Сквер Гарден". Конечно, это только для входа в Мэдисон Сквер Гарден. Большинство записей имеют несколько несколько разных написаний.

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

Есть ли способ с регулярными выражениями или чем-то в предложении GROUP, чтобы их сгруппировать последовательно? Даже простое удаление конечных «и» и «перед» перед группировкой, вероятно, принесет большую пользу.

Я собирался взять каждый результат и затем сопоставить регулярное выражение со всеми местоположениями в пределах широты / долготы?

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

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

Ответы [ 2 ]

1 голос
/ 26 ноября 2009

Вот несколько советов для вас.

Создайте нормализованный столбец названия места в вашей базе данных: (1) Проведите каждое имя через несколько простых преобразований ... Превратите "Сад Мэдисон Сквер" и "Монумент Вашингтона" в "Сад Мэдисон Сквер" и "Монумент Вашингтона" Превратите множественные существительные в единственное число простым способом ... уберите «es», затем «s» из каждого слова в вашем имени. Пропусти все. Удалите все оставшиеся короткие слова "a", "it", "the" и "" & ", которые вы получите. Сортируйте свои слова в алфавитном порядке, получая "Сад Мэдисон Сквер" Сохраните эту результирующую строку в новый столбец в вашей таблице. Совпадение на нем, при этом по-прежнему отображается ваша исходная строка.

(2) Создайте справочную таблицу с вариантами написания мест. Это хорошо работает для названий мест проведения выставок, таких как «Бостон Гарден» / «Центр флота» / «ТД Банкнорт Гарден» / «Северный вокзал» и тому подобное. То же место, другое правописание. («Станция Penn» для вашего примера).

(3) Вы можете использовать службы геокодирования Yahoo или Google Maps, которые будут принимать неполные имена и адреса и стандартизировать их.

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

0 голосов
/ 26 ноября 2009

Если ваша проблема относится к «похожим» строкам одинаково, вы можете проверить алгоритм SOUNDEX. Я не уверен, будет ли это работать для всех ваших разных сценариев, но это только начало.

Это обсуждается в этой теме: Как сделать нечеткое совпадение названий компаний в MYSQL с PHP для автозаполнения?

...