Решение Python для регулярных выражений для извлечения немецкого формата адреса - PullRequest
0 голосов
/ 10 сентября 2018

Я очень стараюсь написать код регулярного выражения Python для извлечения немецкого адреса, как показано ниже.

Abc Gmbh Ensisheimer Straße 6-8 79346 Endingen

Def Gmbh Keltenstr. 16 77971 Kippenheim Deutschland

Ghi Deutschland Gmbh 53169 Бонн

Jkl Gmbh Ensisheimer Str. 6 -8 79346 Endingen

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

# TEST COMPANY NAME
string = 'Telekom Deutschland Gmbh 53169 Bonn Datum'
result = re.findall(r'([a-zA-Zäöüß]+\s*?[A-Za-zäöüß]+\s*?[A-Za-zäöüß]?)',string,re.MULTILINE)
print(result)

# TEST STREET NAME
result = re.findall(r'([a-zA-Zäöüß]+\s*\.)',string)
print(result)

# TEST STREET NUMBER
result = re.findall(r'(\d{1,3}\s*[a-zA-Z]?[+|-]?\s*[\d{1,3}]?)',string)
print(result)

# TEST POSTAL CODE
result = re.findall(r'(\d{5})',string)
print(result)

# TEST CITY NAME
result = re.findall(r'([A-Za-z]+)?',string)
print(result)

# TEST COMBINED ADDRESS COMPONENTS GROUP
result = re.findall(r'([a-zA-Zäöüß]+\s+?[A-Za-zäöüß]+\s+?[A-Za-zäöüß]+\s+([a-zA-Zäöüß]+\s*\.)+?\s+(\d{1,3}\s*[a-zA-Z]?[+|-]?\s*[\d{1,3}]?)+\s+(\d{5})+\s+([A-Za-z]+))',string)
print(result)

Обратите внимание, что моя цель заключается в том, чтобы, если какой-либо из этих адресов присутствовал в огромном абзаце текста, регулярное выражение должно извлекать и печатать только адреса. Может кто-нибудь помочь мне?

1 Ответ

0 голосов
/ 11 августа 2019

Я бы выбрал решение regex и использовал бы libpostal , вместо этого он имеет привязки для пары других языков (в вашем случае для python используйте postal ). Вам придется установить libpostal отдельно, поскольку он содержит 1,8 ГБ обучающих данных.

Хорошо, что вы можете указывать адресные части в любом порядке, большую часть времени он будет выбирать нужные части. Он использует машинное обучение, обучается на данных OpenStreetMap на многих языках.

Для приведенных примеров необязательно будет вырезать название компании и страну из строки:

from postal.parser import parse_address
parse_address('Telekom Deutschland Gmbh 53169 Bonn Datum')

[('telekom deutschland gmbh', 'house'),
 ('53169', 'postcode'),
 ('bonn', 'city'),
 ('datum', 'house')]

parse_address('Keltenstr . 16 77971 Kippenheim')

[('keltenstr', 'road'),
 ('16', 'house_number'),
 ('77971', 'postcode'),
 ('kippenheim', 'city')]
...