Рейз повторно поднимает последнее исключение, которое вы поймали, а не последнее исключение, которое вы подняли
(оставлено для комментариев для ясности)
По сути, это класс проблемы разрешения именованных сущностей. NER в Википедии
Лучший способ приблизиться к этому - проанализировать адрес с помощью языкового преобразователя для идентификации различных конструкций - подход аналогичен использованию регулярных выражений с конечным автоматом.
У меня был такой подход. большой успех с Java NLP и фреймворком машинного обучения под названием GATE , а их библиотека преобразователей называется Jape. Ознакомьтесь с их графическим интерфейсом и используйте его, чтобы написать для него некоторый Java-код!
Их встроенные примеры должны помочь вам начать изучение основ, а затем вы можете расширить его по мере необходимости. По сути, он разделяет текст на компоненты, используя правила и механизм правил, так что что-то вроде
Xyz, Blah St,
Foo City, 11110, CA
будет переведено в
Place: Xyz
Street: Blah St
City: Foo
...
И затем вы можете использовать свою базу данных местоположений для сопоставления.
Jape также поддерживает поиск по словарю, помимо правил - поэтому, если у вас уже есть "Blah St" в вашей базе данных, и у нее есть два родителя - город Foo и Bar - вы просто устраняете неоднозначность, анализируя следующую строку.
Edit : GATE включает инструмент под названием ANNIE - систему извлечения информации, с которой можно поиграться, чтобы определить адреса. Здесь используются некоторые встроенные правила Jape, которые можно использовать.