10

Ho un'applicazione che raschia i risultati di calcio da diverse fonti sul web. nomi delle squadre non sono coerenti su diversi siti web - ad esempio, il Manchester United potrebbe essere chiamato 'Man Utd' su un sito, 'Man United' su un secondo, 'il Manchester United FC' su un terzo. Ho bisogno di mappare tutte le possibili derivazioni di nuovo ad un singolo nome ('Manchester United'), e ripetere il processo per ciascuna delle 20 squadre del campionato (Arsenal, Liverpool, Man Città etc). Ovviamente non voglio cattive corrispondenze [ad es. "Man City" mappata a "Manchester United"].Algoritmo per nomi corrispondenti 'rumoroso'

Al momento specificare le espressioni regolari per tutte le combinazioni possibili, ad esempio 'Manchester United' potrebbe essere 'man (chester)? (U | (utd) | (united)) (fc)?'; questo va bene per un paio di siti, ma sta diventando sempre più ingombrante. Sto cercando una soluzione che eviti di dover specificare queste regex. Ad esempio, ci deve essere un modo per 'punteggio' Man Utd in modo da ottiene un punteggio alto contro il 'Manchester United', ma un basso/zero punteggio contro 'il Liverpool' [per esempio]; Metterei alla prova il testo di esempio contro tutte le possibili soluzioni e scegliere quello con il punteggio più alto.

mia sensazione è che la soluzione può essere simile al classico esempio di una rete neurale essere addestrati a riconoscere scrittura [cioè v'è un insieme fisso di possibili risultati, e un grado di rumore nei campioni di ingresso]

Qualcuno ha qualche idea?

Grazie.

+0

Il problema con l'apprendimento automatico è che devi compilare un set di dati abbastanza grande da addestrare, un set di dati diverso da testare e poi girare liberamente nel mondo. Il titolo del tuo post mi ha fatto pensare all'algoritmo [Soundex] (http://en.wikipedia.org/wiki/Soundex), forse può essere usato per aiutare a ridurre la dimensione degli input della tua rete neurale. – sarnold

+0

@sarnold: non sempre il caso: http://en.wikipedia.org/wiki/Semi-supervised_learning – Amro

risposta

0

si potrebbe usare una certa somiglianza metrica sulle corde coinvolti e una soglia sintonizzati mano. In alternativa, la soglia potrebbe anche essere formata da alcuni un approccio di apprendimento automatico. Quale particolare metrica di somiglianza funziona meglio dipende dal tipo di stringhe che vuoi abbinare. Potrebbe anche essere necessario pre-elaborare le stringhe prima di applicare una metrica (es. Rimuovere caratteri di disturbo come spazi ecc., Normalizzare le maiuscole, risolvere le comuni abbreviazioni note in precedenza, ...)

Per una panoramica abbastanza completa di diversi metriche di similarità delle stringhe e una libreria Java vedere http://www.dcs.shef.ac.uk/~sam/stringmetrics.html

+0

Grazie. Questo e 'esattamente quello che stavo cercando. – Justin

+0

Proibito. Non hai il permesso di accedere a /people/GONEAWAY/stringmetrics.html su questo server. Per favore considera di pubblicare più di un link. I collegamenti tendono ad essere fragili. –

+0

Prova https://web.archive.org/web/20080110105916/http://www.dcs.shef.ac.uk/~sam/stringmetrics.html#ukkonen – michid

0

Si potrebbe anche voler fare un po 'l'analisi strutturale del testo. Un parser parte del discorso potrebbe alludere a cui le parole vengono utilizzate come nomi propri, dando ulteriori indizi che "mn au" era "Man U" digitato da qualcuno con le dita dislessici in fretta - qualcosa che nessun regex sta per risolvere.

Essere in grado di "addestrare" il software è probabilmente anche il migliore, aggiungendo specifiche ortografie come le trovate.

Analisi del linguaggio naturale è difficile! In bocca al lupo!

1

Sembra che sei screen scraping le stesse fonti.

Supponendo vostre fonti sono coerenti nel nominare le squadre, una conversione di stringa sarebbe la soluzione più efficace.

Man Utd -> Manchester United

Manchester United FC -> Manchester United

1

Ho risolto questo problema esatto in Python, ma senza alcun sofisticata intelligenza artificiale. Ho solo un file di testo che mappa le diverse varianti della forma canonica del nome. Non ci sono molte varianti e una volta che le hai elencate tutte cambieranno raramente.

Il mio file simile a questa:

man city=Manchester City 
man united=Manchester United 
man utd=Manchester United 
manchester c=Manchester City 
manchester utd=Manchester United 

che carico questi alias in un oggetto dizionario e poi quando ho un nome per mappare, ho convertirlo in minuscolo (per evitare eventuali problemi con diversa capitalizzazione) e poi cercalo nel dizionario.

Se sai quanti gruppi ci dovrebbero essere, puoi anche aggiungere un assegno per avvisarti se trovi nomi più distinti di quelli che ti aspetti.