Способы извлечения мест из текста?

Каковы рекомендуемые методы для извлечения мест из свободного текста?

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

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

Кто-нибудь знает о лучших подходах?

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

Ответ 1

Все основанные на правилах подходы не сработают (если ваш текст действительно "свободен" ). Это включает регулярные выражения, контекстно-свободные грамматики, любой вид поиска... Поверьте, я был там раньше: -)

Эта проблема называется Именованное распознавание сущностей. Месторасположение - один из 3 наиболее изученных классов (с Лицом и Организацией). У Stanford NLP есть реализация Java с открытым исходным кодом, которая чрезвычайно эффективна: http://nlp.stanford.edu/software/CRF-NER.shtml

Вы можете легко найти реализации на других языках программирования.

Ответ 2

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

Затем все, что вам нужно сделать, это цикл над отдельными словами в тексте ввода и в начале каждого нового слова, начните новый бинарный поиск в вашем списке местоположений. Как только вы найдете нет-матч, вы можете пропустить все слово и перейти к следующему.

Возможная проблема: многословные местоположения, такие как "Нью-Йорк", "Третья улица", "Китайская Народная Республика". Возможно, все, что требуется, это сохранить позицию первого нового слова, если вы обнаружите, что ваш bsearch приводит вас к (возможному!) Многословному результату. Затем, если полное сравнение не удастся - возможно, несколько слов позже - все, что вам нужно сделать, это вернуться к этому "следующему" слову в отношении предыдущего, в котором вы начали.

Что касается "слова": пока вы готовите свой список местоположений, создайте список всех символов, которые могут отображаться внутри местоположений. Только фразы, содержащие символы из этого списка, можно считать допустимым "словом".

Ответ 3

Как быстро появляются твиты? Как и в случае с полным пожарным шлангом или некоторыми фильтрационными запросами? Немного более сложный подход, похожий на то, что вы описали, использует инструмент NLP, который интегрирован в справочник географических названий. Очень немногие инструменты NLP будут поддерживать до твиттер-ставок, и очень немногие делают очень хорошо с твиттером из-за того, что все левые говорят. NLP может быть настроен на точность или отзыв в зависимости от ваших потребностей, чтобы ограничить выполнение блокировок в справочнике. Я рекомендую посмотреть Rosoka (также Rosoka Cloud через Amazon AWS) и GeoGravy