Pergunta

Temos um programa que exibe mapear dados (acho que o Google Maps, mas com muito mais interatividade e personalizados camadas para os nossos clientes).

Nós permitir a navegação através de um conjunto de caixas de combinação que Prefill determinados campos com um bando de dados (ou seja: País:.. Canadá, o campo Província é preenchido Select Ontário, e uma lista de países / regiões é preenchido Select um concelho / região e uma cidade é preenchida, etc ...).

Enquanto isso garante endereços precisos, é uma dor para os usuários se eles não sabem onde um endereço ou uma cidade estão localizados (ou seja, que município / região é Kitchener em?).

Então, nós estamos olhando para tentar fazer um analisador de endereços com um campo de texto de forma livre.

O usuário pode digitar algo como isto (semelhante ao Google Maps, Bing Maps, etc ...): 22 Main St, Kitchener, On

E poderíamos compartimentar-lo em seções e fazer pesquisas sobre os dados e chegar ao ponto que eles estão procurando (ou sugerir alternativas).

O problema com isso é que, como vamos informações corretamente compartmentalize? Como é que vamos acabar com as seções e encontrar possíveis correspondências? Eu estou supondo que não seria garantido que o usuário deve digitar dados em um formato que sempre esperado (obviamente). Um acompanhamento para isso seria como apresentar os dados, se não encontrar uma correspondência exata (ou encontrar várias correspondências exatas ... duas cidades com o mesmo nome de rua em diferentes municípios, por exemplo).

Nós temos uma tonelada de dados disponíveis nos dados de mapeamento (formato guia mapinfo principalmente). Então, podemos fazer exames rápidos de nomes de ruas, cidades, estados, etc. Mas eu não tenho certeza sobre o melhor caminho a percorrer cerca de abordar este problema. Claro, usando o Google Maps seria bom, bue maioria dos nossos clientes estão em fechados em redes onde acesso externo geralmente não é permitido ea maioria não estão dispostos a confiar no Google Maps (uma vez que não contém tanta informação quanto eles precisam , como o costume mapear camadas). Eles poderiam, obviamente, ir ao google e obter o local adequado, em seguida, passar para o nosso software, mas isso seria demorado e velocidade do processo pode ser muito importante.

Foi útil?

Solução

Esta é essencialmente uma classe do problema resolução entidade nomeada. NER em Wikipedia

A melhor maneira de abordar esta questão é analisar o endereço usando um transdutor de idioma para identificar várias construções -. Abordagem é semelhante ao uso de expressões regulares com uma máquina de estados finitos

Eu tive grande sucesso com o framework Java PNL e para aprendizado de máquina chamado PORTÃO , e sua lib transdutor é chamado Jape. Confira seu GUI, e usar isso para escrever algum código Java para ele!

Sua construído em exemplos deve começar com o básico, e então você pode estendê-lo conforme necessário. Essencialmente, compartimenta texto em componentes usando as regras e o mecanismo de regras, então algo como:

Xyz, Blah St,
Foo City, 11110, CA

seria traduzido para,

Place: Xyz
Street: Blah St
City: Foo
...

E, em seguida, você pode usar seu banco de dados de locais para fazer partidas.

Jape também suporta pesquisas de dicionário, além de regras - por isso, se você já tem "Blah St" em seu banco de dados, e tem 2 pais - cidade Foo e Bar -. Você só disambiguate analisando a próxima linha

Edit: PORTÃO inclui uma ferramenta chamada ANNIE - um sistema de extracção de informação, que pode ser jogado ao redor com para identificar endereços. Isto usa alguns construídos em Jape regras que você pode construir em cima.

Outras dicas

A propósito, você já viu um novo terminal da API que SmartyStreets está experimentando? Ele extrai endereços de texto e valida-los e converte-os em componentes.

Consulte este outro Stack Overflow pós que entra em mais detalhes. Eu trabalho em SmartyStreets e ajudou a desenvolvê-lo, para que eu possa dizer-lhe que esta é uma muito difícil problema, mesmo se a partir da superfície, parece simples.

Simson Garfinkel trabalhou um para o seu livro de endereços bacana para NeXTstep (que mais tarde foi compilado e atualizado para Mac OS X e submetidos a um concurso de Design da Apple). Desde então, tem sido código aberto e está disponível a partir de seu site abaixo:

http://simson.net/ref/sbook5/

Geocoder.ca limpa, padroniza e as cadeias de endereço geocodes localização. Ele acrescenta código postal, fuso horário e código de área também.

Por exemplo: https://geocoder.ca/22%20Main%20St, % 20Kitchener,% 20on? geoit = ??xml

<geodata>
        <latt>43.286272</latt>
        <longt>-80.445823</longt>
     <postal>N0B1E1</postal>
<Dissemination_Area><dauid>35300802</dauid><adauid>35300042</adauid></Dissemination_Area>
<AreaCode>226,519</AreaCode>
<TimeZone>America/Toronto</TimeZone>
<standard>
<stnumber>22</stnumber><staddress>Main ST</staddress><city>Kitchener</city><prov>ON</prov><confidence>0.7</confidence></standard>
</geodata>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top