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
- 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
- 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
- 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.