[SQL] Levenshtein Functie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Hallo,

Ik wil graag de Levenshtein functie kunnen gebruiken bij een select query. Zodat ik bij kleine typfoutjes van een gebruikersnaam een suggestie kan weergeven (zoals Facebook doet)

Nu heb ik gevonden op internet dat daar een algoritme voor bestaat: http://nl.wikipedia.org/wiki/Levenshteinafstand

En ik vond een bijhorende MySQL functie: http://www.artfulsoftware.../queries.php?&bw=1280#552 (Hail to the Internet)

Ik ben wel wat gewoon om gewone, standaard SQL te schrijven, maar functies maken enzo, ken ik weinig van. Nu, als ik die functie in phpMyAdmin invoer, om ze te maken, krijg ik deze error terug:
SQL-query:

CREATE FUNCTION `levenshtein` (
s1 text,
s2 text
) RETURNS int( 11 ) DETERMINISTIC BEGIN DECLARE s1_len,
s2_len,
i,
j,
c,
c_temp,
cost INT;

MySQL retourneerde: Documentatie
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4
Nu, als ik naar deze versie uit, ziet die er wel wat verkapt uit, ik plakte hem gewoon in het SQL veld zoals ik hem vond op bovengenoemde website.

Iemand een idee wat deze syntax fout zou kunnen zijn?
Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

delimiter $$ erboven zetten en beide functiedefinities eindigen met END$$ in plaats van met END;. ;)

Verder heeft dit niets te maken met Software Engineering & Architecture. Zoals je in Waar hoort mijn topic? kan lezen horen implementatieproblemen in Programming. :)

SEA>>PRG

edit:
Afhankelijk van de precieze toepassing zou je ook kunnen kijken naar SOUNDS LIKE (of eigenlijk: soundex).

[ Voor 21% gewijzigd door NMe op 06-01-2012 16:58 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Sorry dat ik mijn topic verkeerd plaatste, dacht dat dit iets met database implementatie ofzo zou te maken hebben. Mijn fout.

Wel hartelijk dank voor je hulp, want zo werkt het inderdaad!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Begrijp je ook waarom? Want anders heb je nog niks aan mijn hulp gehad natuurlijk. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Je zult dan bij iedere typefout de verkeerd getypte naam moeten gaan vergelijken met alle andere namen. Niet erg efficient. Ik sla bij waarden waar een 'spellingcontrole' voor nodig is een soundex waarde op (soort fonetische vertaling van de string), query de waardes met een soundex die overeenkomt met de soudex van de ingevoerde waarde en kies op basis van de Levenshteinafstand de beste suggesties.

Voorbeeld (text -> soundex met Perl Text::Soundex):
tweakers -> T262
tweekers -> T262
levenshtein -> L152

Typt iemand 'tweekers' zoek je op 'T262' en vind je 'tweakers' met een Levenshtein afstand één.

Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
NMe schreef op zaterdag 07 januari 2012 @ 15:56:
Begrijp je ook waarom? Want anders heb je nog niks aan mijn hulp gehad natuurlijk. :P
Ik heb wat voorgezocht op delimiter, en met een delimiter vervang je de normale delimiter ';' naar '$$' en daarom zet je er dus ook achteraan END $$ als vervanging van ';'?

Dat is wat ik er uit afleid, of het echt zo is kan jij me misschien vertellen?
Je zult dan bij iedere typefout de verkeerd getypte naam moeten gaan vergelijken met alle andere namen. Niet erg efficient. Ik sla bij waarden waar een 'spellingcontrole' voor nodig is een soundex waarde op (soort fonetische vertaling van de string), query de waardes met een soundex die overeenkomt met de soudex van de ingevoerde waarde en kies op basis van de Levenshteinafstand de beste suggesties.

Voorbeeld (text -> soundex met Perl Text::Soundex):
tweakers -> T262
tweekers -> T262
levenshtein -> L152

Typt iemand 'tweekers' zoek je op 'T262' en vind je 'tweakers' met een Levenshtein afstand één.
Ik heb ook naar soundex gekeken inderdaad, maar het lijkt me toch niet zo efficiënt te zijn, ook het feit dat ik met emailadressen werk, en een emailadres is vrij lang, komt voor in alle talen, met speciale tekens e.d.

Naar wat ik vond op internet, leek het erop dat Soundex echt maar goed werkt in het Engels, en met alleen letters, leek het mij beter om levenshtein te gebruiken.

Ook door het feit dat ik maar 1 resultaat terug geef, ik geef geen lijstje terug met zoekresultaten die erop lijken, maar echt maar 1, dus het mag niet erg foutgevoelig zijn.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Foutgevoelig is het probleem niet. Traag wel, eventueel. Het levert je namelijk een full table scan op. :)

Wat betreft de reden dat het nodig is: in het kort (en niet 100% accuraat) stuur je je database commando's, en die commando's zijn standaard gescheiden door puntkomma's. Je wil je functie ook als compleet commando sturen, maar omdat er ín die functie ook puntkomma's staan snapt MySQL niet meer wat je nu bedoelt zodra hij vroegtijdig een puntkomma tegenkomt. Door te zeggen dat $$ nu een delimiter is kun je in je functiedefinitie zelf wel gewoon puntkomma's gebruiken zonder dat de queryparser daarvan in de war raakt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1