получить город, штат или почтовый индекс из строки в питоне - PullRequest
2 голосов
/ 13 января 2010

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

Валун, Co
80303
Валун, Колорадо
Валун, Co 80303
...

любой их вариант вернул бы город, штат или почтовый индекс.

Все это будет вводимые пользователем данные и вводимые в одном текстовом поле.

Ответы [ 5 ]

3 голосов
/ 13 января 2010

Вы можете использовать веб-сервис геокодирования или что-то подобное. Например, на странице API геокодирования Yahoo показано, как вы можете указать адрес несколькими способами:

This free field lets users enter any of the following:
    city, state
    city, state, zip
    zip
    street, city, state
    street, city, state, zip
    street, zip

и результаты XML предоставляют проанализированный адрес, например, с этим тестовым URL , указанным на странице.

3 голосов
/ 13 января 2010

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

Если у вас уже есть данные, поищите только zip, найдите список возможных городов (будет только один применимый штат) и найдите название города после того, как все в нижнем регистре.

1 голос
/ 27 апреля 2010
  1. easy_install ngram

  2. файл сборки со всеми названиями городов и штатов, по одному в строке, место в citystate.data Редвуд Сити, Калифорния Редвуд, Вирджиния и т.д.

  3. Эксперимент (порог .2 немного слаб)


import string
import ngram
cityStateParser = ngram.NGram(
  items = (line.strip() for line in open('citystate.data')) ,
  N=3, iconv=string.lower, qconv=string.lower,  threshold=.2
)

Пример

cityStateParser.search('redwood')
[('Redwood VA', 0.5),
('Redwood NY', 0.5),
('Redwood MS', 0.5),
('Redwood City CA', 0.36842105263157893),
...
]

Примечания: Поскольку это NGrams, вы можете получить излишнее соответствие, когда штат является частью Ngram в городе то есть поиск по «вашингтону» дал бы Washington IN с лучшим счетом, чем «Washington OK»

Возможно, вы захотите прочитать Использование наложенного кодирования списков N-граммы для эффективного неточного сопоставления (PDF Download)

1 голос
/ 13 января 2010

Я бы использовал ([^\d]+)?(\d{5})? в качестве моего регулярного выражения и использовал match, чтобы оно совпадало только с началом строки. Таким образом, он не потерпит неудачу при неправильном вводе и сделает лучшее предположение относительно того, что было задумано. Затем вы можете разделить первую группу захвата на ",".

0 голосов
/ 13 января 2010

Этот код, кажется, делает то, что вы хотите:

text = """
Boulder, Co
80303
Boulder, Colorado
Boulder, Co 80303
"""

lines = text.splitlines()

ABBREV = dict(co="Colorado", ca="California")
STATES = ABBREV.values()

def parse_addr(line):
    addr = {}
    # normalize commas
    parts = line.replace(",", " ").split()
    for part in parts:
        if part.capitalize() in STATES:
            addr["state"] = part
        elif part.lower() in ABBREV:
            addr["state"] = ABBREV[part.lower()]
        else:
            try:
                zip = int(part)
                addr["zip"] = part
            except ValueError:
                addr["city"] = part
    return addr

for line in lines:
    print line, parse_addr(line)

Выход:

Boulder, Co {'city': 'Boulder', 'state': 'Colorado'}
80303 {'zip': '80303'}
Boulder, Colorado {'city': 'Boulder', 'state': 'Colorado'}
Boulder, Co 80303 {'city': 'Boulder', 'state': 'Colorado', 'zip': '80303'}

Обработка "Южной Дакоты" и других двухсловных штатов / городов, оставленных в качестве упражнения для читателя.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...