Desambigue nomes de lugares bagunçados em python (de preferência na máquina local)

8

Tenho uma lista com vários milhões de nomes de lugares que vêm dos perfis do Flickr. Os usuários forneceram esses nomes de local como texto livre; portanto, eles ficam assim:

Roma, Italy
Kennesaw, USA
Saginaw, MI
Rucker, Missouri, USA
Melbourne, Australia
Madrid, Spain
live in Sarnia / work in London, Canada
Valladolid, España
Italia
West Hollywood, United States

Eu quero desambiguar esses nomes de lugares. Estou ciente de que, em alguns casos, não há nenhuma solução direta para essa solução, mas estou disposto a viver com alguma falsa desambiguação e com "sem resposta" para alguns dos lugares. Se um nome de local corresponder ao nome de várias cidades, desejo atribuir esse local à maior cidade à qual ele corresponder.

A API do localizador de local do Yahoo seria uma boa solução para esse problema, mas eu precisaria fazer muitas chamadas de API para passar pela minha lista, então eu gostaria de uma solução local (por exemplo, uma que não dependa de uma API remota) . Alguém conhece alguma biblioteca python que faça esse tipo de coisa ou qualquer outra solução local?

(Eu também fiz essa pergunta no stackoverflow .)

conradlee
fonte

Respostas:

8

Você pode tentar o geodict da biblioteca Python . Isso tem conjuntos de dados que você pode baixar e importar para um banco de dados - você pode verificar as listas para ver se elas funcionariam bem ou não com seus dados. Funciona em duas etapas:

  1. Extraindo nomes
  2. Correspondência de nomes a um local nas listas

Mais detalhes (e outra opção online nos comentários) aqui .

geographika
fonte
2

Suponho que seu melhor palpite é usar um algoritmo difuso.

Leve seu dicionário local de nomes de lugares e unidades administrativas e compare cada palavra e cada bloco de texto separado por vírgula com esse dicionário. Atribua uma pontuação a cada partida. Convém usar uma pesquisa normalizada para explicar erros de ortografia e ter uma "lista de ignorados" para palavras como "ao vivo" e "trabalho" e "entrada". Adicione a pontuação de unidades administrativas à pontuação de qualquer unidade menor ou nome do local nas suas correspondências que se encontrem nessa unidade administrativa.

Ajuste a função de pontuação com seus resultados até que você esteja feliz. Faça a melhor partida de pontuação.

e.g.: Roma, Italy 
Roma matches 8 places (score according to size)
Roma matches 23 more places with normalization (lower score according to size)
Italy matches 4 places + 2 administrative units (COUNTRY, DISTRICT) (score acconding to size)
Italy matches 14 more places and units with normalization (lower score according to size)
One of the Romas lies in one of your units. -> combine scores

Se o ajuste for bom, você terá dado mais pontos à capital da Itália.

relet
fonte
1

Você pode usar a biblioteca python de geotexto para o mesmo.

pip install geotext

basta instalar esta biblioteca. O uso é tão simples quanto:

from geotext import GeoText
places = GeoText("London is a great city")
places.cities

dá o resultado 'London'

A lista de cidades cobertas nesta biblioteca não é extensa, mas possui uma boa lista.

Anindita Bhowmik
fonte
0

Uma oferta comercial é o geocoder da Polygon Analytics , que existe como API SAAS REST, bem como uma API C ++ de alto desempenho no local (com wrappers para Python, Java e outros) para evitar a latência da rede (ou para dados confidenciais).

Sua API também fornece saída lat / lon para mapeamento.

James Winnacker
fonte