Tecniche di apprendimento automatico per l'analisi delle stringhe?


30

Ho molte stringhe di indirizzi:

1600 Pennsylvania Ave, Washington, DC 20500 USA

Voglio analizzarli nei loro componenti:

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

Ma ovviamente i dati sono sporchi: provengono da molti paesi in molte lingue, scritti in modi diversi, contengono errori di ortografia, mancano pezzi, hanno spazzatura extra, ecc.

In questo momento il nostro approccio è quello di utilizzare le regole combinate con la corrispondenza fuzzy gazetteer, ma vorremmo esplorare le tecniche di apprendimento automatico. Abbiamo etichettato i dati di addestramento per l'apprendimento supervisionato. La domanda è: che tipo di problema di apprendimento automatico è questo? Non sembra davvero essere il raggruppamento, la classificazione o la regressione ...

Il più vicino che posso trovare sarebbe classificare ogni token, ma poi vorrai davvero classificarli tutti contemporaneamente, soddisfacendo vincoli come "ci dovrebbe essere al massimo un paese;" e in realtà ci sono molti modi per tokenizzare una stringa, e tu vuoi provare ognuna e scegliere il meglio .... So che esiste una cosa chiamata analisi statistica, ma non ne so nulla.

Quindi: quali tecniche di apprendimento automatico potrei esplorare per l'analisi degli indirizzi?


Non sono un esperto del tuo problema di alto livello nel pubblicare una risposta, ma penso che il primo passo per l'apprendimento automatico sia la costruzione di funzionalità informative, quindi la scelta del metodo giusto in base alla loro struttura. Hai molta struttura; caratteri alnum vs non alnum, token numerici vs alfa, conteggi token tra ',' divisioni, lunghezze token numeriche. ad es. dividere "," e contare il numero di token in ciascuna suddivisione (indirizzo stradale vs città / stato vs informazioni specifiche geografiche); calc strlen dei token numerici (indirizzo e codice postale). Ti offrono funzionalità su cui puoi raggruppare.
muratoa,

Dai un'occhiata a blocchi di testo .
alto,

2
Guarda anche il riconoscimento dell'entità nominata e l'attività più generale di Estrazione
Yuval F

@YuvalF Suggerisco di farne una risposta. Puoi elaborare un po ', forse un documento di esempio in cui è stato utilizzato un metodo ML?
Steffen,

Sono anche molto interessato a questo specifico problema, che sta strutturando gli indirizzi postali nelle sue parti componenti. Stiamo tentando di farlo in un dispositivo mobile senza presunzioni sulla connettività a un servizio di geo-codifica inversa come Google. Va bene supporre che abbiamo una fonte integrata di dati collegati relativi a città, stato, paese e CAP. Qualsiasi aiuto - puntatori - o disposti a impegnarsi con un folle team di avvio su questo problema è di cuore e apertamente benvenuto.

Risposte:


10

Questo può essere visto come un problema di etichettatura di sequenza , in cui hai una sequenza di token e vuoi dare una classificazione per ognuno. È possibile utilizzare modelli Markov nascosti (HMM) o campi casuali condizionali (CRF) per risolvere il problema. Ci sono buone implementazioni di HMM e CRF in un pacchetto open source chiamato Mallet .

Nel tuo esempio, dovresti convertire l'input nel formato seguente. Inoltre, dovresti generare funzionalità extra.

1600 STREET
Pennsylvania STREET
Ave STREET
, OUT
Washington CITY
, OUT
DC PROVINCE
20500 POSTCODE
USA COUNTRY

1
Non credo che un tagger di sequenza standard (come un HMM di CRF) produrrà ottimi risultati in questa situazione. Ciò è dovuto alle restrizioni che i gruppi di tag sono contigue e che ogni tag si verifica solo una volta per sequenza. Non penso che tu possa facilmente modificare la ricerca per incorporare queste informazioni a causa della dipendenza da tag passati / futuri di distanza arbitraria (potrei sbagliarmi su questo però).
alto,

@alto Credo che CRF prenda in considerazione il contesto vicino. HMM non può vedere lo stato passato, hai ragione che probabilmente non funzionerebbe molto bene.
JT

1

Ho dovuto risolvere un problema molto simile per verificare se un indirizzo è valido o non valido.

Tipicamente indirizzo hanno la struttura "1600 Pennsylvania Ave, Washington DC, 20500"

Una stringa come

"Ho sceso 2000 gradini e ho raggiunto la Pennsylvania Ave a Washington DC."

non è un indirizzo valido.

Ciò può essere risolto mediante tecniche di classificazione come SVM, reti neurali ecc.

L'idea è quella di identificare un insieme chiave di funzionalità. Alcuni di questi potrebbero essere:

1) Il nome della via inizia con un numero di blocco valido. La maggior parte dei numeri di blocco statunitensi sono numeri (ad esempio 1200) o un numero seguito da una singola lettera (120A) o un numero che segue una singola lettera (ad esempio S200).

2) Se l'indirizzo è ben formattato, i nomi delle strade finiscono in suffissi come Ave per Avenue, Dr per Drive, Blvd per Boulevard. È possibile ottenere l'elenco dei suffissi stradali statunitensi dal sito USPS.

3) Anche il numero di parole nel campo dell'indirizzo può essere una caratteristica interessante. Se ci sono troppe parole, probabilmente non è un indirizzo valido. Ad esempio, vedere l'esempio sopra.

4) Quante parole compaiono tra il numero di blocco e il suffisso stradale nel campo dell'indirizzo?

Questi possono essere usati per addestrare un algoritmo di apprendimento e il modello risultante può essere usato per validare se un dato indirizzo è valido o meno.


1

Questo è un po 'un trucco che non richiede la tua soluzione: il geocoding inverso. Questo può darti dati più puliti o effettivamente fare tutto il lavoro per te.

Ad esempio, ecco un codice Stata con geocode3da SSC, che utilizza Google. Immagino che sia simile a Fuzzy Gazetteer . Il primo indirizzo è piuttosto disordinato, il secondo è pulito e il terzo è estraneo. Anche altri software possono gestirlo.

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)

Funziona abbastanza bene:

. 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  

Il Cremlino ha un formato piuttosto diverso.


0

Sembra un problema da risolvere con la classificazione bidirezionale LSTM. Ad esempio, ogni carattere dell'esempio viene taggato come una categoria

via: 1 città: 2 provincia: 3 codice postale: 4 paese: 5

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

Ora, allena il tuo classificatore in base a queste etichette. Boom!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.