2009-05-19 15 views
5

Ho bisogno di codificare una soluzione per un determinato requisito, e volevo sapere se qualcuno ha familiarità con una libreria pronta all'uso che può ottenerlo o può indirizzarmi a la migliore pratica. Descrizione:Algoritmo per confrontare parole (non in ordine alfabetico)

L'utente immette una parola che dovrebbe essere una delle varie opzioni fisse (tengo le opzioni in una lista). So che l'input deve essere presente in un membro nell'elenco, ma dal momento che è un input dell'utente, potrebbe aver commesso un errore. Sto cercando un algoritmo che mi dirà qual è la parola più probabile che l'utente intendesse. Non ho alcun contesto e non posso costringere l'utente a scegliere da una lista (cioè, deve essere in grado di inserire la parola liberamente e manualmente).

Ad esempio, dite che l'elenco contiene le parole "acqua", "quarto", "birra", "barbabietola", "inferno", "ciao" e "aardvark".

La soluzione deve tenere conto di diversi tipi di "normali" errori:

  • errori di battitura Velocità (es raddoppio caratteri, lasciando cadere caratteri ecc)
  • tastiera adiacente caratteri errori di battitura (ad esempio "Qater" per “acqua “)
  • non-native errori di battitura in inglese (ad esempio "quater" per‘quarto’)
  • e così via ...

La soluzione ovvia è confrontare lettera per lettera e dare "pesi di penalità" a ciascuna lettera, lettera aggiuntiva e lettera mancante. Ma questa soluzione ignora migliaia di errori "standard", sono sicuro che sono elencati da qualche parte. Sono sicuro che ci sono delle euristiche là fuori che trattano tutti i casi, sia specifici che generali, probabilmente usando un ampio database di mismatch standard (sono aperto a soluzioni pesanti per i dati).

Sto codificando in Python ma considero questa domanda linguaggio-agnostico.

Eventuali suggerimenti/pensieri?

risposta

10

si desidera leggere come Google fa questo: http://norvig.com/spell-correct.html

Edit: Alcune persone hanno detto algoritmi che definiscono una metrica tra un utente data parola e una parola candidato (levenshtein, soundex). Questa non è tuttavia una soluzione completa al problema, dal momento che si avrebbe anche bisogno di una infrastruttura per eseguire in modo efficiente una ricerca vicina più vicina non euclidea. Questo può essere fatto ad es. con l'albero di copertina: http://hunch.net/~jl/projects/cover_tree/cover_tree.html

2

Avete considerato algoritmi che si confrontano con suoni fonetici, come ad esempio soundex? Non dovrebbe essere troppo difficile produrre rappresentazioni soundex del tuo elenco di parole, memorizzarle, e quindi ottenere un soundex dell'input dell'utente e trovare la corrispondenza più vicina lì.

6

Una soluzione comune consiste nel calcolare il Levenshtein distance tra l'input e i testi fissi. La distanza di Levenshtein di due stringhe è solo il numero di operazioni semplici (inserzioni, cancellazioni e sostituzioni di un singolo carattere) necessarie per trasformare una stringa nell'altra.

0

Anche se potrebbe non risolvere l'intero problema, è consigliabile considerare l'utilizzo dell'algoritmo soundex come parte della soluzione. Una rapida ricerca su google di "soundex" e "python" ha mostrato alcune implementazioni python dell'algoritmo.

0

Prova a cercare "Distanza di Levenshtein" o "Modifica distanza".Conta il numero di operazioni di modifica (cancella, inserisci, cambia lettera) è necessario trasformare una parola in un'altra. È un algoritmo comune, ma a seconda del problema potresti aver bisogno di qualcosa di speciale con pesi diversi per i diversi tipi di errori di battitura.

1

Cercare l'algoritmo Bitap. Si qualifica bene per quello che vuoi fare e arriva anche con un esempio di codice sorgente in Wikipedia.

1

Se il vostro set di dati è veramente piccolo, basta confrontare la distanza Levenshtein su tutti gli articoli in modo indipendente dovrebbe essere sufficiente. Se è più grande, però, dovrai utilizzare un sistema di indicizzazione BK-Tree o simile. L'articolo che ho collegato descrive come trovare le corrispondenze all'interno di una determinata distanza di Levenshtein, ma è abbastanza semplice adattarsi per fare le ricerche più vicine (e lasciate come esercizio al lettore;).

Problemi correlati