Парсинг пользовательского ввода - город/штат/почтовый индекс/страна

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

Типичным примером может быть то, что делают карты Google.

Вот некоторые примеры ввода:

  • "Город штат Страна"
  • "Столица"
  • «Город, почтовый индекс, страна»
  • "Город (*): Штат (*): Почтовый Индекс"
  • "Почтовый Индекс"

Что было бы эффективным и правильным способом анализа этого ввода от пользователя?

Если вам известны какие-либо примеры реализации, пожалуйста, поделитесь :)


person Community    schedule 01.07.2009    source источник


Ответы (4)


Первым шагом было бы разбить текст на отдельные токены, используя пробелы или запятые в качестве символов-разделителей. Для масштабируемости вы можете затем передать каждый токен потоку или серверу (при использовании архитектуры, подобной Map-Reducer), чтобы выяснить, что представляет собой каждый токен. Например,

  • Если у нас есть числа в шаблоне, то это, вероятно, почтовый индекс.
  • Есть ли элемент в списке известных состояний?
  • Со странами также довольно легко обращаться, как с государствами, их количество ограничено.
  • В каком порядке расположены токены по сравнению с обычными способами написания адреса? Большая часть входных данных, вероятно, будет соответствовать обычаям местного почтового отделения для форматов адресов.

Получив результаты отдельных токенов, вы можете склеить части вместе, чтобы получить полный адрес. В тех случаях, когда есть вопросы, вы можете подсказать пользователю, что он на самом деле имел в виду (например, карты Google), и добавить эту информацию в изученный список.

Самый простой способ добавить эту поддержку в приложения, предполагая, что вы не пытаетесь построить систему карт, — это запросить Google или Yahoo и попросить их проанализировать дату для вас.

person dhable    schedule 08.07.2009

Я сам очень увлечен тем, как Google справляется с этим. Я не помню, чтобы видел что-то подобное где-либо еще.

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

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

Не уверен, что есть пример реализации. Многие географические услуги предлагаются на платной основе. Что-то настолько сложное, как GoogleMaps, вероятно, будет стоить целое состояние.

Поправьте меня если я ошибаюсь.

person User    schedule 01.07.2009

Я нашел простую реализацию PHP

У Yahoo, кажется, есть веб-сервис, который предлагает функциональность (вроде)

Openstreetmap, кажется, предлагает ту же функцию поиска на своей домашней странице.

person Community    schedule 01.07.2009

Предполагая, что вы имеете дело только с этими четырьмя полями (City Zip State Country), существуют конечные значения для всех полей, кроме City, и даже это, я думаю, если у вас большой список городов, также будет конечным. Так что просто разделите каждое поле запятой, а затем сверьтесь с каждым списком полей.

Предполагая, что мы говорим об адресах в США...

  • Zip наиболее очевиден, поэтому сначала проверьте его.
  • В штате есть варианты 50x2 (Калифорния или Калифорния), проверьте следующее
  • Страна имеет варианты ~ 190x2, в зависимости от того, насколько вы хотите охватить (США, Соединенные Штаты, США).
  • Что бы ни осталось, вероятно, это ваш город.

Что касается эффективности, возможно, имеет смысл сначала проверить несколько «стандартных» форматов, как предлагает Дэн.

person Rob Elliott    schedule 08.07.2009