Complessa corrispondenza di stringhe con fuzzywuzzy

7

Sto tentando di scrivere un processo che corrisponda a stringhe oscure a una singola "stringa principale" per un'ulteriore elaborazione. Ho molti dati che assomigliano a questo:

Basketball
Basket Ball
Football
BasketBallR
BBall
BBall - r
FootB

... e così via. Questi devono essere mappati su un record master in questo modo:

Basketball       = Basket Ball, BBall
Basketball - R   = BasketBallR, BBall - r

Ho anche casi di dati simili a questo formato:

Football -r
FootBall - r-g/H,Q,HH

Queste situazioni devono essere separate in diverse categorie prima di essere mappate. Ad esempio FootBall - r-g/H,Q,HH dovrebbe essere:

Football - r
Football - g
Football - H
Football - Q
Football - HH

A questo punto, deve ancora essere mappato su un record master ...

Ho provato diverse combinazioni di metodi di corrispondenza fuzzywuzzy, misurazioni Levenshtein Distance, regex, ecc. e non riesco a trovare un metodo affidabile per associare logicamente diversi stili di denominazione di un singolo oggetto con un nome principale.

Sto alzando le mani per la disperazione. Ci sono risorse Python esistenti che possono aiutare a risolvere il mio problema? Ci sono altre opzioni? Qualcuno può indicare un'opzione ovvia che avrei potuto ignorare?

Fondamentalmente, qualsiasi suggerimento, soluzione, risorsa o metodo alternativo è molto apprezzato.

    
posta That1Guy 16.10.2012 - 21:18
fonte

2 risposte

4

Fortunatamente, non sono uno che si arrende facilmente. Attraverso il contatto con altre fonti / comunità ho trovato Google Refine che risolve (incredibilmente) completamente i miei problemi di abbinamento il 90% delle volte e lascia il restante 10% incredibilmente gestibile e facile da risolvere manualmente. Spero che questo possa aiutare altre persone che affrontano problemi simili.

    
risposta data 17.10.2012 - 21:07
fonte
2

Ho scritto qualcosa di molto simile in una volta in cui avevo bisogno di scrivere una logica di business per fare un buon lavoro ragionevolmente con l'abbinamento di vari nick e minuscoli nomi ai record personali con il loro nome legale completo. Per esempio. (James Smith = Jim Smith = Jimmy Smith ecc ...)

Ho risolto il problema essenzialmente compilando e creando lentamente un file CSV con un nome appropriato e ogni valore delimitato da virgole dopo il primo valore su una riga rappresentava ogni nome diminutivo noto a cui potevo pensare. Ai fini del consumo di memoria e del tempo di elaborazione, ho precaricato i dati del file CSV in una mappa di set di stringhe.

Ho creato una chiave univoca per ogni voce della mappa per ogni singolo nome, corretto e diminutivo . Perché? In modo che potessi facilmente e rapidamente recuperare * ogni nome proprio e minuscolo con un nome appropriato o discreto. Ho usato il pattern singleton perché ovviamente questo oggetto è costoso da compilare e consuma un bel po 'di memoria, tuttavia una volta costruito questo oggetto è follemente veloce recuperare non solo il nome corretto da un nome minuscolo, ma anche recuperare altri possibili diminutivi nomi.

Man mano che il sistema incontra nuovi nomi di dimensioni ridotte, procederà lentamente ad aggiungere nuove corrispondenze e ad aumentare la percentuale di successo.

Se il set di dati in questione è relativamente gestibile e la memoria è economica per il tuo scenario, potresti trovare che questa sia un'ottima idea di design.

Sfortunatamente non penso che riuscirai a trovare uno schema di regex che sta per trovare arbitrariamente partite come questa in un set di dati. Non ci sono regole chiare su come due parole possono essere paragonate nella tua situazione. Il modo migliore per farlo è pre-associare i dati una sola volta, o per associare preliminarmente i blocchi gestibili o indicizzati dei dati tutti in una volta.

Modifica

Se hai a che fare con un enorme insieme di dati, ovviamente quanto sopra non funzionerà. In questo caso, ti consiglio di esaminare una soluzione massicciamente parallela utilizzando un algoritmo di ridimensionamento della mappa . Apache Hadoop è un grande progetto open source che gestisce gran parte della complessità di questi tipi di applicazioni per linguaggi basati su JVM. Non sono sicuro che esista un progetto simile per Python.

    
risposta data 16.10.2012 - 21:39
fonte

Leggi altre domande sui tag