¿Técnicas de aprendizaje automático para analizar cadenas?

30

Tengo muchas cadenas de direcciones:

1600 Pennsylvania Ave, Washington, DC 20500 USA

Quiero analizarlos en sus componentes:

street: 1600 Pennsylvania Ave
city: Washington
province: DC
postcode: 20500
country: USA

Pero, por supuesto, los datos están sucios: provienen de muchos países en muchos idiomas, están escritos de diferentes maneras, contienen errores ortográficos, faltan piezas, tiene basura adicional, etc.

En este momento, nuestro enfoque es utilizar reglas combinadas con la coincidencia difusa del diccionario geográfico, pero nos gustaría explorar técnicas de aprendizaje automático. Hemos etiquetado los datos de capacitación para el aprendizaje supervisado. La pregunta es, ¿qué tipo de problema de aprendizaje automático es este? Realmente no parece ser agrupación, clasificación o regresión ...

Lo más cercano que se me ocurre sería clasificar cada ficha, pero entonces realmente desea clasificarlas todas simultáneamente, satisfaciendo restricciones como "debería haber como máximo un país"; y realmente hay muchas maneras de tokenizar una cadena, y desea probar cada una y elegir la mejor ... Sé que existe una cosa llamada análisis estadístico, pero no sé nada al respecto.

Entonces: ¿qué técnicas de aprendizaje automático podría explorar para analizar direcciones?

Jay Hacker
fuente
No soy un experto en su problema de alto nivel para publicar una respuesta, pero creo que el primer paso para el aprendizaje automático es construir características informativas, luego elegir el método correcto dada su estructura. Tienes mucha estructura; caracteres de alnum vs no-alnum, tokens numéricos vs alfa, conteos de tokens entre divisiones ',', longitudes de tokens numéricos. por ejemplo, dividir en ',' y contar cuántos tokens en cada división (dirección de calle vs ciudad / estado vs información específica geográfica); calc eliminado de los tokens numéricos (dirección de la calle vs código postal). Estos le brindan características en las que puede agruparse.
muratoa
Echa un vistazo al texto fragmentado .
alto
2
Observe también el reconocimiento de entidades con nombre y la tarea más general de Extracción
Yuval F
@YuvalF Sugiero que esto sea una respuesta. ¿Puede elaborar un poco, tal vez un documento de ejemplo donde se ha utilizado un método ML?
steffen
También estoy muy interesado en este problema específico, que es estructurar una dirección de correo en sus componentes. Estamos intentando hacer esto en un dispositivo móvil sin presunciones de conectividad a un servicio de geocodificación inversa, como los google. Está bien suponer que tenemos una fuente integrada de datos vinculados relacionados con la ciudad, el estado, el país y el código postal. Cualquier ayuda, ya sea punteros, o que estén dispuestos a comprometerse con un equipo de inicio loco en este problema es sincera y abiertamente bienvenida.

Respuestas:

10

Esto puede verse como un problema de etiquetado de secuencia , en el que tiene una secuencia de tokens y desea dar una clasificación para cada uno. Puede usar modelos ocultos de Markov (HMM) o campos aleatorios condicionales (CRF) para resolver el problema. Hay buenas implementaciones de HMM y CRF en un paquete de código abierto llamado Mallet .

En su ejemplo, debe convertir la entrada al siguiente formato. Además, debe generar funciones adicionales.

1600 STREET
Pennsylvania STREET
Ave STREET
, OUT
Washington CITY
, OUT
DC PROVINCE
20500 POSTCODE
USA COUNTRY
William Fernandes
fuente
1
No creo que un etiquetador de secuencia estándar (como un HMM de CRF) produzca muy buenos resultados en esta situación. Esto se debe a las restricciones de que los grupos de etiquetas sean contiguos y que cada etiqueta solo ocurra una vez por secuencia. No creo que pueda modificar fácilmente la búsqueda para incorporar esta información debido a la dependencia de etiquetas pasadas / futuras de distancia arbitraria (aunque podría estar equivocado sobre esto).
alto
@alto Creo que CRF toma en consideración el contexto vecino. HMM no puede ver el estado pasado, tienes razón en que probablemente no funcionaría muy bien.
JT
1

Tuve que resolver un problema muy similar para validar si una dirección es válida o no válida.

Por lo general, la dirección tiene la estructura "1600 Pennsylvania Ave, Washington DC, 20500"

Una cadena como

"Bajé 2000 escalones y llegué a Pennsylvania Ave en Washington DC".

No es una dirección válida.

Esto se puede resolver mediante técnicas de clasificación como SVM, redes neuronales, etc.

La idea es identificar un conjunto clave de características. Algunos de estos podrían ser:

1) ¿El nombre de la calle comienza con un número de bloque válido? La mayoría de los números de bloque de EE. UU. Son números (por ejemplo, 1200) o un número seguido de una sola letra (120A) o un número que sigue a una sola letra (por ejemplo, S200).

2) Si la dirección está bien formateada, los nombres de las calles terminan en sufijos como Ave para avenida, Dr para Drive, Blvd para Boulevard. Es posible obtener la lista de sufijos de calles de los EE. UU. Desde el sitio de USPS.

3) El número de palabras en el campo de la dirección de la calle también puede ser una característica interesante. Si hay demasiadas palabras, probablemente no sea una dirección válida. Por ejemplo, vea el ejemplo anterior.

4) ¿Cuántas palabras aparecen entre el número de bloque y el sufijo de la calle en el campo de dirección?

Estos pueden usarse para entrenar un algoritmo de aprendizaje y el modelo resultante puede usarse para validar si una dirección dada es válida o no.


fuente
1

Este es un truco que no requiere su propia solución: geocodificación inversa. Esto puede brindarle datos más limpios o realmente hacer todo el trabajo por usted.

Por ejemplo, aquí hay un código Stata con geocode3de SSC, que usa Google. Supongo que esto es similar a Fuzzy Gazetteer . La primera dirección es bastante desordenada, la segunda es limpia y la tercera es extranjera. Otro software puede manejar esto también.

clear
set obs 3
gen address =""
replace address = "Big Foot Museum in Felton CA" in 1
replace address = "1600 Pennsylvania Ave, Washington, DC 20500 USA" in 2 
replace address = "ул. Ильинка, д. 23 103132, Москва, Россия" in 3
geocode3, address(address)
gen coord = string(g_lat) + "," + string(g_lon)
geocode3, reverse coord(coord)

Esto funciona razonablemente bien:

. list r_addr , clean noobs

                                                                             r_addr  
                                      121 San Lorenzo Avenue, Felton, CA 95018, USA  
    1600 Pennsylvania Avenue Northwest, President's Park, Washington, DC 20500, USA  
                                         ulitsa Ilyinka, 23, Moscow, Russia, 101000  

El Kremlin tiene un formato bastante diferente.

Dimitriy V. Masterov
fuente
0

Esto suena como un problema a resolver con la clasificación bidireccional LSTM. Etiqueta cada carácter de la muestra como una categoría, por ejemplo

calle: 1 ciudad: 2 provincia: 3 código postal: 4 país: 5

1600 Pennsylvania Ave, Washington, DC 20500 USA
111111111111111111111, 2222222222, 33 44444 555

Ahora, entrene su clasificador basado en estas etiquetas. ¡Auge!

Fardin
fuente