Intelligente suggesties, deel 4: Aantallen, caching en Protocol Buffers
Dit is deel 4 in een serie over de techniek uit een 'intelligente' zoekbox.
Lees verder »
- 1. Introductie en 'StartsWith'
- 2. Volledige matching en typfouten
- 3. Uitspraak en hierarchie
- 4. Aantallen, caching en Protocol Buffers
Lees verder »
Intelligente suggesties, deel 3: Uitspraak en hierarchie
Dit is deel 3 in een serie over de techniek uit een 'intelligente' zoekbox.
Lees verder »
- 1. Introductie en 'StartsWith'
- 2. Volledige matching en typfouten
- 3. Uitspraak en hierarchie
- 4. Aantallen, caching en Protocol Buffers
Lees verder »
Intelligente suggesties, deel 2: Volledige matching en typfouten
Dit is deel 2 in een serie over de techniek uit een 'intelligente' zoekbox.
Burkhard-Keller tree
Een BK-tree is een tree-based datastructuur om snel en efficiënt woorden te vinden die op elkaar lijken. We moeten dus eerst een algoritme hebben dat woorden kan vergelijken, en een getal kan geven aan het verschil. Hiervoor heb ik eerder al de Levenshtein-distance voor gekozen, en als implementatie de 'YetiLevenshtein' methode uit het Tenka.Text project.
De 400.000 verschillende 'keys' die we in deel 1 hebben bepaald gaan we nu rangschikken in deze boom. Als voorbeeld de volgende set:
Lees verder »
- 1. Introductie en 'StartsWith'
- 2. Volledige matching en typfouten
- 3. Uitspraak en hierarchie
- 4. Aantallen, caching en Protocol Buffers
Burkhard-Keller tree
Een BK-tree is een tree-based datastructuur om snel en efficiënt woorden te vinden die op elkaar lijken. We moeten dus eerst een algoritme hebben dat woorden kan vergelijken, en een getal kan geven aan het verschil. Hiervoor heb ik eerder al de Levenshtein-distance voor gekozen, en als implementatie de 'YetiLevenshtein' methode uit het Tenka.Text project.
De 400.000 verschillende 'keys' die we in deel 1 hebben bepaald gaan we nu rangschikken in deze boom. Als voorbeeld de volgende set:
Lees verder »
Intelligente suggesties, deel 1: Introductie en 'StartsWith'
Dit is deel 1 in een serie over de techniek uit een 'intelligente' zoekbox.
Doelen
Lees verder »
- 1. Introductie en 'StartsWith'
- 2. Volledige matching en typfouten
- 3. Uitspraak en hierarchie
- 4. Aantallen, caching en Protocol Buffers
Doelen
- Tonen van suggesties op basis van de input van de gebruiker
- Suggesties kunnen zowel geheel matchen ('Amsterdam'), of gedeeltelijk ('Amste')
- Hierarchie moet ondersteunt worden ('Amsterdam, Noord-Holland'; 'Wibautstraat, Amsterdam')
- Het aantal woningen dient naast de suggestie getoond te worden
- Tolerant in invoer ('Köog a/d Zaan' moet 'Koog aan de Zaan' als suggestie geven)
- Op basis van uitspraak gebieden vinden die hetzelfde klinken ('Wiboudstraat' en 'Wibautstraat')
- Tolerantie voor typfouten ('Utrect')
- Omdraaien van de opdracht ('Amsterdam, Pijp' wordt 'Pijp, Amsterdam')
Lees verder »
Typfouten, Levenshtein en Burkhard-Keller trees
Momenteel nog aan het werk aan een project waar ik al eerder helemaal los op ging, alwaar ik vandaag aankwam op de mogelijkheid van typfouten.
Levenshtein distance
De levenshtein distance is het minimale aantal bewerkingen dat nodig is om van het ene woord naar het andere woord te komen.
code:
In bovenstaand geval dus één mutatie. Netjes van wikipedia gejat is dit voorbeeld, van kitten -> sitting:
code:
Waar is het goed voor?
We kunnen veel met Soundex en alternatieve woorden, maar fuzzy matching is daarmee niet mogelijk. Door alle plaatsen / straten / etc. te vinden die een afstand van één hebben tot de zoekterm kan je vrij eenvoudig een lijst met alternatieven geven (natuurlijk samen met Soundex).
Lees verder »
Levenshtein distance
De levenshtein distance is het minimale aantal bewerkingen dat nodig is om van het ene woord naar het andere woord te komen.
code:
1
2
3
4
5
6
| 1: Amsterdam
2: Amsteldam
A m s t e r d a m
^
A m s t e d a m |
In bovenstaand geval dus één mutatie. Netjes van wikipedia gejat is dit voorbeeld, van kitten -> sitting:
code:
1
2
3
| 1. kitten -> sitten (substitution of 'k' with 's') 2. sitten -> sittin (substitution of 'e' with 'i') 3. sittin -> sitting (insert 'g' at the end). |
Waar is het goed voor?
We kunnen veel met Soundex en alternatieve woorden, maar fuzzy matching is daarmee niet mogelijk. Door alle plaatsen / straten / etc. te vinden die een afstand van één hebben tot de zoekterm kan je vrij eenvoudig een lijst met alternatieven geven (natuurlijk samen met Soundex).
Lees verder »