Як виконати нечітку відповідність поштових адрес?


14

Я хотів би знати, як співставити поштові адреси, коли їхній формат відрізняється або коли одна з них введена в оману.

Поки що я знайшов різні рішення, але думаю, що вони досить старі і не дуже ефективні. Я впевнений, що існують кращі методи, тож якщо у вас є для мене посилання, я впевнений, що це може зацікавити декількох людей.

Я знайшов рішення (приклади наведено в R):

  • Відстань Левенштейна, яка дорівнює кількості символів, які ви повинні вставити, видалити або змінити, щоб перетворити одне слово в інше.

    agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE) ## [1] "accusait" "abusait"

  • Порівняння фонем

    library(RecordLinkage) soundex(x<-c('accusait','acusait','abusait')) ## [1] "A223" "A223" "A123"

  • Використання коректора правопису (врешті-решт, байєсівського типу, як Петра Норвіга) , але не дуже ефективний за адресою, я думаю.

  • Я думав про те, щоб скористатись пропозиціями Google, але це також не дуже ефективно для особистих поштових адрес.

  • Ви можете уявити собі підхід під наглядом машинного навчання, але для цього потрібно зберегти помилкові запити користувачів, що для мене не є можливим.


Я б запропонував використовувати реальну базу даних, яка підтримує нечітке зіставлення рядків: posgres . Це буде ефективно.
Емре

Лише США, Канада, Великобританія, французька, японська, багатоміські країни ...? Імовірно, для кожного з них ви спочатку визначаєте / здогадуєтесь, якою це мова та країна, а потім застосовуєте класифікатор для конкретної країни? Чи є у вас навчальний набір і якщо так, то який його розподіл по країнах?
smci

Де ви закінчилися з цим? Ми розробили рішення: скребнувати та збагачувати адреси та назви топок, натискати на геокодування Google і розміщувати веб-API, а потім робити кілька приблизних обчислень, щоб визначити правильний результат порівняно із необробленими даними. Це трохи незграбно, але працює, але повинен бути більш елегантний спосіб нормалізації адрес і місць / місць.
Кріс Сміт

Відповіді:


9

Під час використання R ви можете заглянути в пакет стриндистів і метрику відстані Яро-Вінклера, яка може бути використана при розрахунках. Це було розроблено в Бюро перепису населення США для зв'язку.

Детальніше про відстань Яро та Яро-Вінклер див. У цьому журналі .

Для порівняння різних методів узгодження читайте цей документ


4

Існує маса розумних способів продовжити відстань Левенштейна, щоб дати більш повну картину. Короткий вступ в досить корисний модуль (для Python) під назвою « Fuzzy вази » знаходиться тут командою в SeatGeek.

Кілька речей, які ви можете зробити, - це часткова схожість рядків (якщо у вас є рядки різної довжини, скажімо, m & n з m <n), то ви відповідаєте лише для m символів. Ви також можете розділити рядок на лексеми (окремі слова) і подивитися, як набори лексем відповідають або впорядковують їх за алфавітом і замовляти їх.


4

Ще одна популярна методика виявлення часткових збігів рядків (хоча зазвичай на рівні документа) - це шинг . По суті, це підхід з рухомим вікном, який витягує набір n-грамів для цільового слова / doc та порівнює їх із наборами n-грам для інших слів / docs через коефіцієнт Жакарда . Меннінг та його колеги (2008) обговорюють майже дублікати та шинглінг у контексті інформаційного пошуку.


4

Я написав загальний пробабалістичний нечіткий матч у Python, який зробить розумну роботу зі збору будь-якого типу даних:

https://github.com/robinl/fuzzymatcher

Це в пам’яті, тому ви, ймовірно, не хочете використовувати його для зіставлення наборів даних, що перевищують приблизно 100 000 рядків

Я також написав подібний проект, характерний для адрес Великобританії, але це передбачає, що у вас є доступ до Addressbase Premium. Цей не є в пам'яті, тому він використовується проти 100-мільйонних адрес Великобританії. Дивіться тут:

https://github.com/RobinL/AddressMatcher

Якщо ви хочете зробити це швидко, я рекомендую за допомогою libpostal нормалізувати ваші адреси, а потім подавати їх у мій загальний fuzzymatcher ( pip install fuzzymatcher).

Приклади використання ви можете знайти тут .


Привіт Робіне, мене цікавить ваша бібліотека AddressMatcher. Чи трапляється у вас будь-яка документація щодо її використання? У мене є саме ця проблема - потрібно зіставити 1 набір адрес (безладний) з іншим (офіційні поштові адреси). Спасибі
SCool

1
на жаль, з адресною відповідкою це зовсім не банально, і я не маю гарної документації. головне, що вам потрібно - це завантажити преміум-каталог комерційного продукту в postgresql.
RobinL

Добре, дякую, що повернулися до мене. Я працюю з, мабуть, ірландською версією Addressbase преміум під назвою Eircode, яка буде несумісною. Як ви думаєте, нечіткий матч вирішив би завдання у відповідності виробничого середовища? Я просто хочу додати поштові індекси до адрес у моїх даних, у яких їх немає, наприклад, шукати базу даних Eircode для, '1 Main Street, Some Town, County'і якщо я знайду відповідність - повернути поштовий індекс.
SCool

1
нечіткий матч - так, я точно думаю, що варто піти. він повинен працювати досить добре, щоб невеликий список адрес знаходився у великому списку авторських адрес (тобто ерікоду) на машині. Інший варіант
швидка посилання
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.