2016-01-09 14 views
5

Voglio creare un dizionario e ho bisogno di avere una query che possa trovare le parole con errori di ortografia (intendo Typos/errore ortografico o errore di battitura), se la query non riesce a trovare la parola esatta poi cercare di ottenere con altre grafie ...Query SQL che può trovare errori di battitura in lingua araba

allora, qual è l'arabo: In arabo ci sono alcuni lettera con (quasi) stessa pronuncia ma diverso lettera, la gente a volte non sanno quale dovrebbe uso. Ad esempio ci sono 4 tipi di Z in arabo "ز/ظ/ذ/ض" la pronuncia è diversa (un po ') ma la gente dimenticherà qual è l'ortografia corretta. un esempio di una parola con differente utilizzando della lettera "z":

مریز/مریض/مریظ/مریذ

la correttezza è مریض

Ecco altri mondi che ha più di un quest'ultimo:

z: ض/ز/ذ/ظ 

T: ت/ط/

S: ث/س/ص/

Gh: ق/غ 

Allora, qual è la tua idea? Come dovrebbe essere la domanda?

voglio se un utente ha cercato "مریز" invece di mostrare lui un errore di 404 (non trovato) cercare il database con altra lettera (tutto Z) poi risultato tornare se ho trovato nulla.

+0

so l'arabo, ma non so se si è tentato qualcosa. Vedi, qualcuno ti darà il negativo, perché non hai nemmeno posto alcuna domanda dove si possa vedere se ci si è persino provati. – Amel

+0

@Amel Non voglio la query esatta, voglio un'idea (non conosco bene l'arabo) grazie per il tuo commento – kiokoshin

risposta

5

In tedesco, abbiamo lo stesso problema per te tt o dt - soprattutto nei nomi.

Un modo per avvicinarsi a questo sarebbe memorizzare una colonna normalizzata aggiuntiva contenente il nome/parola con trasformazione fissa.

tt -> t 
dt -> t 
ß -> s 
ss -> s 

Così tabella conterrebbe

WORD | NORMALIZED 
schmitt | schmit 
schmidt | schmit 

Al momento della query, applicare queste stesse trasformazioni alla query e quindi confrontare con colonna normalizzata.

+0

Grazie, non sapevo che ci fosse lo stesso problema in tedesco (la mia lingua madre non è l'arabo!) , sai che è un ottimo dizionario, sto cercando un buon algoritmo (e una query) perché ci sono circa mezzo milione di parole per la ricerca! – kiokoshin

+0

La polizia dovrebbe usare un algoritmo simile sulle targhe automobilistiche - è O o 0; I o 1; Z o 2. Anche E vs F può essere un problema se c'è un "plate surround". –

4

C'è un algoritmo chiamato Levenshtein distance (ce ne sono anche altri), che indica la distanza di modifica tra due stringhe.

Si potrebbe derivare da questo, cercare di trovare le parole più simili nel tuo dizionario rispetto al tuo input.

In seguito è possibile assegnare il peso per le sostituzioni in base alle lettere tuple menzionate per perfezionare la ricerca.

In realtà non v'è un'implementazione per MySQL è sicuramente dovrebbe verificare: https://www.artfulsoftware.com/infotree/qrytip.php?id=552
maggior parte delle domande Levenshtein + mysql qui a punto in modo da questa pagina.

2

Una soluzione più semplice utilizza espressioni regolari all'interno di una dichiarazione simile. Per le lettere che potrebbero essere errate si possono mantenere le varietà in un carattere jolly con espressione regolare. Per le lettere corrispondenti a z jolly è "[زذظض]" È possibile sostituire tutte le ز, ذ, ظ, ض lettere con il carattere jolly e quindi eseguire una query con una dichiarazione come:

select * from searched_table where word like "%[مرى[زذظض%" 

Dopo aver trovato tutte le versioni della parola cercata, si può mostrare all'utente tutti loro, o si può calcolare la distanza levenshtein (risposta di koshinae) e mostrare le parole più vicine.

Edit: solo per la lettera Z, interrogazione sarebbe come di seguito

set @word = 'مرىض'; -- take this text from user 
set @word = replace(@word, 'ذ', 'Z'); 
set @word = replace(@word, 'ظ', 'Z'); 
set @word = replace(@word, 'ض', 'Z'); 
set @word = replace(@word, 'ز', 'Z'); 
set @word = replace(@word, 'Z', '[زظضذ]'); 
set @word = Concat('%', @word, '%'); 
select @word; 

select * from mydb.searchTable where word like @word; 
+0

Grazie caro amico. ma voglio avere una query dinamica. – kiokoshin

+0

Prego, ed è possibile creare una query dinamica con la query precedente utilizzando le istruzioni preparate-execute –

Problemi correlati