Algoritmo per determinare se il nome del file contiene un "nome" o meno

1

Vorrei qualche consiglio su come affrontare questo problema. Ho un database di ~ 3000 immagini di persone. I loro nomi sono incorporati nel nome del file ma non esiste un formato standard. Ecco alcuni formati di nome comuni: MarySue-042; henry higgins03; J. H. Doe; Jones, Peter; and M N Shyamalan, MD. Alcuni hanno un secondo nome e altri no; a volte il cognome viene prima, a volte no.

Ci sono anche alcuni nomi di non-persone, come " 1122 Lundee Street" , "MemorialHospital" ecc.

Li sto rinominando in un formato standard. Mi piacerebbe costruire un modello che può

  1. Riconosci un probabile formato del nome e / o
  2. Determina il formato seguito dal nome.

Vorrei qualche consiglio sul modo migliore per farlo. Il mio piano al momento è quello di creare un gruppo di espressioni regex per i formati più comuni e verificare se il nome del file si adatta a uno. Se un nome one-off viene trascurato, posso cambiarlo manualmente.

Ciò che ho provato finora:

Ho creato un'espressione regolare per il formato nome più comune, FirstLast- [0-9]. È [A-Z][a-z]+[A-Z][a-z]+-[0-9]+ . Il problema è che questo raccoglie anche nomi di località come "MemorialHospital-02" . Ho pensato di scartare quelli in cui le lettere in entrambe le posizioni superano una certa lunghezza, ma ho alcune persone con nomi molto lunghi che questo approccio ignorerebbe.

Inoltre, sebbene questo sia il formato di nome più comune, c'è una quantità significativa di nomi in diversi formati, quindi mi manca ancora molto.

    
posta kc m 13.02.2017 - 18:55
fonte

5 risposte

6

Ecco come vorrei affrontare il problema.

  1. Inizia trovandoti da qualche parte in un dizionario di nomi ("John").
  2. Ottieni un dizionario di parole ("ospedale") e posizioni geografiche ("Londra").
  3. Per ogni stringa tra i 3 000, calcola il numero di occorrenze dei nomi delle persone e il numero di occorrenze di parole e posizioni geografiche.

Se una determinata stringa contiene solo nomi di persone, è probabile che sia una persona. Se contiene solo parole e posizioni, probabilmente non è una persona.

Si spera che quelli che contengono entrambi non siano troppo numerosi. Quelli potrebbero essere gestiti manualmente.

    
risposta data 13.02.2017 - 20:05
fonte
1

Se devi farlo solo una volta:

Scrivi abbastanza algoritmi di conversione per ottenere l'elenco delle eccezioni fino a ... (tiene il dito umido in aria) ... circa 300. Poi il bulbo oculare per il resto. Se le eccezioni sono ancora 600 dopo aver passato circa un'ora su questo, allora basta fermarsi lì e guardare gli ultimi 600.

Se devi individuare e convertire i nomi per sempre:

Scrivi abbastanza convertitori per ridurre le eccezioni a circa il 5-10%. Se sei in dubbio, vai al 10%.

In generale, ci sono lontano troppe eccezioni per denominare le regole da gestire. (C'è un post sul blog che non riesco a trovare al momento, elencando 40 eccezioni alle regole comunemente credute sui nomi. Se potessi prenderle tutte, probabilmente potresti risolvere il strong problema di intelligenza artificiale.) Quindi non perdere tempo provando. Detto questo, farai tutto bene seguendo la regola 80-20 o anche un 90-10.

    
risposta data 13.02.2017 - 20:04
fonte
1

L'approccio semplice di suddividere i nomi in base alla capitalizzazione e suddividere manualmente la lista in nomi, possibili nomi e non nomi ti darà un buon inizio dato che qualsiasi nome di file che consiste solo di non nomi probabilmente non è una persona ma esiste sono probabilmente un numero di casi d'angolo, anche se tutti i nomi sono tutti di origine inglese.

Potresti potenziarlo con uno strumento come OpenCV e un riconoscitore di persone, ad es. peopledetect.py per le persone in posizione verticale o facedetect.py per le immagini del tipo di profilo, (entrambi questi esempi sono ciascuno con 80 righe di codice) . Se tutte le tue foto sono di tipo profilo o passaporto, una regola secondo cui il volto rilevato deve essere superiore al 50% dell'area dell'immagine potrebbe ulteriormente perfezionare la selezione.

Supponendo che tutte le immagini delle persone includano una singola persona mentre è probabile che le immagini del luogo non abbiano o nessuna persona, o più, dovrebbe permettere che la maggior parte delle immagini non possano essere filtrate al 100% dando un numero molto limitato numero da categorizzare manualmente.

Se devi eseguire regolarmente un numero molto elevato di filtri di questo tipo, puoi prendere in considerazione la possibilità di addestrare un sistema di apprendimento automatico per entrambi, o per la combinazione della convenzione di denominazione o del contenuto dell'immagine.

    
risposta data 13.02.2017 - 21:15
fonte
0

Per un approccio generale, vorrei:

  1. Costruisci alcune espressioni regolari per una potenziale corrispondenza positiva, cosa che stai già facendo.

  2. Crea anche parole / espressioni per la corrispondenza negativa. Ad esempio, la presenza di "[A | a] venue" (o Hospital) garantisce sostanzialmente un non nome.

  3. ~ 3000 elementi è un set abbastanza piccolo per poter finalmente usare il bulbo oculare. Vorrei scaricare l'output di # 1 e # 2 su un foglio di calcolo e cercare i casi d'angolo da correggere manualmente.

risposta data 13.02.2017 - 20:03
fonte
0

Se hai solo 3000 file, fallo manualmente. Diciamo che ci vogliono 10 secondi per rinominare e spostare il file. Sono solo più di 8 ore di lavoro e sarai sicuro di averle corrette.

Ci sarà sempre un tasso di errore in qualsiasi approccio algoritmico, quindi hai davvero bisogno di avere molti dati e tempo per evolvere qualcosa che è meglio di un umano

    
risposta data 13.02.2017 - 20:37
fonte

Leggi altre domande sui tag