Corrispondenza dei nomi nei messaggi SWIFT

1

Qui sto cercando fondamentalmente un miglioramento delle prestazioni.

Ho bisogno di abbinare i nomi in un messaggio SWIFT (diciamo MT 103) contro gli elenchi di sanzioni (elenchi di sanzioni da parte dell'ONU, da OFAC, alcuni elenchi personalizzati) e di seguito è ciò che ho sviluppato

  1. Poiché ci sono vari elenchi e il numero totale di nomi è più di 50 mila, quindi carico tutti i nomi in una lista invece di recuperarli ancora e ancora dal database
  2. Quindi faccio scorrere l'elenco e utilizzo distanza Levenshtein , perché potrebbero esserci errori di ortografia, per trovare la differenza tra due nomi (un nome dal database e il nome nel SWIFT messaggio) e memorizzare le loro differenze
  3. Quindi seleziono i primi 10,50 o 100 nomi con meno differenze.

Poiché i campi dei nomi nei messaggi SWIFT sono quattro righe con 35 caratteri ciascuno formattati in modo libero e non esiste alcuna regola per disporre di un delimitatore in modo da trovare il nome, l'indirizzo e i numeri di contatto mescolati insieme. Ad esempio il nome di Remitter sarebbe come

ABCXYZ INTERNATIONAL PLASTIC INDUST
RIES PVT LTD 49-A, S.I.E A JOHANNES
BURG SOUTH AFRICA 

o

Charles Philip Arthur George Mountb
atten-Windsor Buckingham Palace Wes
tminster London

Poiché non c'è modo di separare il nome con l'indirizzo, così ho deciso di creare nomi da parti di queste linee. Ad esempio

ABCXYZ
ABCXYZ INTERNATIONAL
ABCXYZ INTERNATIONAL PLASTIC
ABCXYZ INTERNATIONAL PLASTIC INDUSTRIES
ABCXYZ INTERNATIONAL PLASTIC INDUSTRIES PVT
ABCXYZ INTERNATIONAL PLASTIC INDUSTRIES PVT LTD
ABCXYZ INTERNATIONAL PLASTIC INDUSTRIES PVT LTD 49-A,
ABCXYZ INTERNATIONAL PLASTIC INDUSTRIES PVT LTD 49-A, S.I.E
...
INTERNATIONAL
INTERNATIONAL PLASTIC
INTERNATIONAL PLASTIC INDUSTRIES
...
PLASTIC 
PLASTIC INDUSTRIES 
PLASTIC INDUSTRIES PVT 
PLASTIC INDUSTRIES PVT LTD 
...

OR

Charles
Charles Philip
Charles Philip Arthur
...
George 
George Mountbatten-Windsor
George Mountbatten-Windsor Buckingham 
...
Buckingham 
Buckingham Palace
Buckingham Palace Westminster 
Buckingham Palace Westminster London
...
Westminster
Westminster London
London

Il caso sarebbe simile con il nome del Beneficiario. A volte il numero di queste combinazioni supera 200 e quindi confrontare questi 200 nomi con 50 mila nomi di elenchi di sanzioni è piuttosto costoso.

Qui ho bisogno di migliorare le prestazioni identificando il nome da queste 4 linee in qualche modo o estrapolando i nomi dei candidati da queste combinazioni per abbreviare l'elenco dei nomi da abbinare o estrarre i nomi dei candidati dagli elenchi delle sanzioni, ecc.

Sto già usando Parallel.ForEach che consuma CPU al 100% che non è una soluzione fattibile.

Ho bisogno di suggerimenti per migliorare le prestazioni di questa soluzione o una soluzione migliore.

Modifica # 1

Ho usato Veloce approssimativo corrispondenza delle stringhe con grandi distanze di modifica in Big Data (2015) di Wolf Garbe e sotto è il risultato

Sanctioned names:           48, 290
Names screened:             360
Total time by Existing* Levenshtein:    468,575 ms (7.809 min)
Total time by Wolf Garbe Levenshtein:   177,862 ms (2.964 min)

Entrambi questi algos hanno calcolato le stesse distanze per 5761 varianti di corrispondenza dei nomi. * Non ricordare la fonte di questa implementazione.

    
posta bjan 05.11.2018 - 08:32
fonte

0 risposte

Leggi altre domande sui tag