стратегии нахождения дублирующихся почтовых адресов

Отключить WM_CONTEXTMENU:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CONTEXTMENU:
        break;
    ...//other message handles
    }
    return 0
}

Однако этот подход также отключает обработку сообщения для других местоположений окна (область незаголовка). Получите прямоугольник строки заголовка в TITLEBARINFOEX.rcTitleBar от WM_GETTITLEBARINFOEX сообщение и затем позиция курсора в lParam из эти WM_CONTEXTMENU, сообщение определяется, является ли это в rcTitleBar область.

5
задан Matt 6 July 2013 в 00:46
поделиться

6 ответов

Во-первых, упростите адресную строку, свернув все пробелы в один пробел между каждым словом и переведя все в нижний регистр (или верхний регистр, если хотите):

adr = " ".join(adr.tolower().split())

Затем я бы вырезать такие вещи, как «st» в «41-й улице» или «nd» в «42-й улице»:

adr = re.sub("1st(\b|$)", r'1', adr)
adr = re.sub("([2-9])\s?nd(\b|$)", r'\1', adr)

Обратите внимание, что второй sub () будет работать с пробелом между «2» и «nd», но я не заставил первого сделать это; потому что я не уверен, как вы можете отличить «41 St Ave» от «41 St» (вторая - сокращенно «41 Street»).

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

Затем я бы разделил то, что у вас осталось, на список слов и применил алгоритм Soundex, чтобы перечислить элементы, которые не t выглядят как числа:

http://en.wikipedia.org/wiki/Soundex

http://wwwhomes.uni-bielefeld.de/gibbon/Forms/Python/SEARCH/soundex.html

adrlist = [word if word.isdigit() else soundex(word) for word in adr.split()]

Затем вы можете работать со списком или присоединить его обратно к строке, как вы считаете нужным.

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

Удачи.

2
ответ дан 14 December 2019 в 08:56
поделиться

Удаление пробелов, запятых и тире будет неоднозначным. Лучше заменить их одним пробелом.

Возьмем, например, этот адрес

56 5th avenue

И этот

5, 65th avenue

с вашим методом они оба будут:

565THAV

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

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

  1. заменить все запятые тире пробелами. Используйте для этого метод he translate .
  2. Создайте словарь со словами и их сокращенной формой
  3. Удалите часть TH , если она следует за числом.
2
ответ дан 14 December 2019 в 08:56
поделиться

Это должно быть полезно при создании вашего словаря сокращений:

http://www.usps.com/ncsc/lookups/usps_abbreviations.html

2
ответ дан 14 December 2019 в 08:56
поделиться

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

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

0
ответ дан 14 December 2019 в 08:56
поделиться

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

Что лучше всего сработало для меня, так это дезинфицировать и разметить адреса (избавиться от знаков препинания, разбить все на слова), а затем просто посмотреть, сколько токенов совпадают. Поскольку адреса обычно имеют несколько токенов, вы можете развить уровень уверенности с точки зрения комбинации (1) количества сопоставленных токенов, (2) количества числовых токенов, которые были сопоставлены, и (3) того, как доступно много токенов. Например, если все токены в более коротком адресе находятся в более длинном адресе, достоверность совпадения довольно высока. Аналогичным образом, если вы сопоставите 5 токенов, включая хотя бы один числовой, даже если у каждого адреса по 8, это все равно совпадение с высокой степенью достоверности.

Определенно полезно сделать некоторые настройки, например, заменить некоторые общепринятые сокращения. USPS списки помощь, хотя я не пошла бы фанатичную пытаюсь реализовать все из них, а некоторые из наиболее ценных подстановок не в этих списках. Например, «JFK» должно совпадать с «JOHN F KENNEDY», и существует несколько распространенных способов сократить «MARTIN LUTHER KING JR».

Может быть, это само собой разумеется, но я все равно скажу это, для полноты: не забудьте просто провести прямое сравнение строк по всему адресу, прежде чем возиться с более сложными вещами! Это должен быть очень дешевый тест, и поэтому первый проход, вероятно, не составит труда.

Очевидно, чем больше у вас времени » Если вы хотите и можете тратить (как на программирование / тестирование, так и на время выполнения), тем лучше вы сможете сделать. Методы нечеткого сопоставления строк (более быстрые и менее обобщенные, чем у Левенштейна) могут быть полезны в качестве отдельного прохода от подхода с использованием токенов (я бы не пытался нечеткое сопоставление отдельных токенов друг с другом). Я обнаружил, что нечеткое сопоставление строк не дает мне достаточной отдачи от адресов (хотя я буду использовать его для имен).

0
ответ дан 14 December 2019 в 08:56
поделиться

Чтобы сделать это правильно, вам необходимо стандартизировать свои адреса в соответствии со стандартами USPS (похоже, что ваши адреса относятся к США). Есть много поставщиков услуг прямого маркетинга, которые предлагают сертификацию почтовых адресов CASS (Система поддержки точности кодирования). Процесс CASS стандартизирует все ваши адреса и добавит к ним zip + 4. Любые недоставленные адреса будут помечены, что еще больше снизит ваши почтовые расходы, если вы этого хотите. После того, как все ваши адреса будут стандартизованы, удаление дубликатов станет тривиальным делом.

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

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

1
ответ дан 14 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

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