Очистка адресных данных - замена «ул.» с «Улица» и «Св.» со «Святым» Как отличить?

У меня есть адресные данные, которые я пытаюсь стандартизировать.

Сюда входят элементы очистки, такие как с Rd по Road и с Dr по Drive.

Однако я совершенно не понимаю, как отличить Street от Saint. Они оба имеют аббревиатуру St.

Кто-нибудь делал что-то подобное раньше? Любые идеи, как обойти это?

Мой код на данный момент (адаптировано из здесь). Посмотрите st mary's road в последней строке:

import re
import pandas as pd

# set up a df with fake addresses:
adds = pd.DataFrame({'address':['1 main st','2 garden dr.','4 foo apts','7 orchard gdns','st mary\'s road']})
print(adds)

          address
0       1 main st
1    2 garden dr.
2      4 foo apts
3  7 orchard gdns
4  st mary's road
# set up a dictionary of names to change
def suffixDict():

    return {'dr': 'drive',
            'rd': 'road',
            'st':'Street', # or 'st':'Saint' ??
            'apts':'apartments',
            'gdns':'gardens'}

# function to fix suffixes
def normalizeStreetSuffixes(inputValue):

        abbv = suffixDict() # get dict
        words = inputValue.split() # split address line
        for i,word in enumerate(words):
            w = word.lower() # lowercase
            w = re.sub(r'[^\w\'\s]*','', w) # remove some special characters
            rep = abbv[w] if w in abbv.keys() else words[i] # check dict
            words[i] = (rep[0].upper() + rep[1:]) # proper case
        return ' '.join(words) # return cleaned address line


# apply function to address data
adds.address.apply(normalizeStreetSuffixes)

0         1 Main Street
1        2 Garden Drive
2      4 Foo Apartments
3     7 Orchard Gardens
4    Street Mary's Road

Вы можете видеть, что улица Сент-Мэрис-Роуд была изменена на улицу Мэри-Роуд.


person SCool    schedule 09.08.2019    source источник
comment
Не будет ли различие заключаться в том, происходит ли оно до или после улицы?   -  person tgikal    schedule 09.08.2019
comment
Как ни странно, Saint обычно стоит перед существительным, а Street — после него.   -  person Xophmeister    schedule 09.08.2019
comment
Ну, если в конце, то это должна быть улица, а если в начале (за исключением цифр), то это должен быть святой. Проанализируйте свои собственные данные, чтобы увидеть, сможете ли вы найти исключения.   -  person Alex Hall    schedule 09.08.2019
comment
Отходя от комментария Xophmeister, я бы предложил сделать вложенный оператор if, чтобы посмотреть на первые два символа, а также на последние два символа, и выполнить такую ​​​​замену.   -  person simplycoding    schedule 09.08.2019
comment
Для тех, кто говорит святой, обычно стоит перед существительным. У нас есть адреса, в которых улица может стоять перед существительным. Garden Street Apartments или Main Street Lower или North Street Cottages .... и я не думаю, что могу сказать, где именно в строке находится St. Т.к. я .split() адрес, слова со словарем обрабатываются отдельно, то я .join в конце.   -  person SCool    schedule 09.08.2019
comment
Не уверен, что есть способ сделать это, но я думаю, что stackoverflow.com/questions/20290870/ было бы хорошим подходом, если вы можете принять некоторые ошибки.   -  person Alexander Santos    schedule 09.08.2019
comment
Но если в начале есть экземпляр St, он должен представлять Saint, верно? И можно ли предположить, что каждый второй экземпляр St в адресе будет Street?   -  person simplycoding    schedule 09.08.2019