[php] zoeken in array en suggesties geven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • XdeckX
  • Registratie: September 2002
  • Niet online
Ik zit met de volgende uitdaging.

ik heb een textfile met daarin regel voor regel titels van boeken.

ik heb inmiddels de textfile ingelezen en in een array geplaatst (elke arrayrecord is 1 titel).

Nu wil ik dus een zoekopdracht geven die:
1) of bij correcte naam de titel van het boek laat zien
2) of bij onvolledige of onjuiste (bijv. tikfout) naam een aantal suggesties geeft van titels die het mogelijk zouden kunnen zijn. hierna kan er verder worden gezocht


Het zoeken en laten zien van de correcte titel is uiteraard geen probleem maar de moeilijkheid zit em in het geven van suggesties op basis van 'foute' invoer.

Heeft iemand enig idee hoe ik dit moet aanpakken en wat de makkelijkste oplossing hiervoor is?

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Je zou kunnen kijken naar functies als levenshtein() en soundex()? :)

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • corani
  • Registratie: December 2000
  • Laatst online: 05-10-2017

corani

__,,,_(^_^)_,,,__

'soundex' ;)

edit: wat JeRa zegt

[ Voor 65% gewijzigd door corani op 24-10-2005 23:32 ]

Laat me nou toch eens met rust man!
Iedereen die in telekinese gelooft, steek a.u.b. mijn hand op


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Je moet lopen door je array. Dan eerst kijken of de ingevoerde naam geconverteerd naar kleine letters gelijk is aan de naar kleine letters geconverteerde versie van de huidige titel. Als die niet gelijk is, dan kun je levenshtein of soundex gebruiken om te berekenen hoeveel twee strings op elkaar lijken. :)

edit:
Spuit 11-modje. :P

[ Voor 4% gewijzigd door NMe op 24-10-2005 23:33 ]

'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!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Ik weet natuurlijk niet hoe groot de textfile is, en ook niet hoevaak er in gezocht gaat worden, en ook al niet wat je precies bedoelt met een textfile inlezen en in een array plaatsen... Maar als je overweegt om een zoekfunctionaliteit aan te bieden is een database doorgaans sowieso aan te bevelen.

Iets directer op de vraag kent PHP naast levenshtein en soundex ook nog similar_text(). Als het om Engelse titels gaat zou je ook nog kunnen kijken naar metaphone() wat accurater is dan soundex (voor Engels althans).

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Voordeel uiteraard van soundex (en metaphone en varianten) is dat het een key genereert voor het losse woord. Deze kun je opslaan in bijvoorbeeld een database om het zoeken te vereenvoudigen als het om grote hoeveelheden data gaat.

levenshtein/similar_text vereisen 2 woorden (of strings, maar in feite gaat het om losse woorden) en zijn dus niet voor te bereiden.

[ Voor 6% gewijzigd door Bosmonster op 25-10-2005 09:02 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Ik heb ditzelfde gedaan maar dan voor artiesten en hun nummers

Ivm snelheid zou ik alle titels in een database importeren. Een keer de normale titel, 1 keer met alle vage karakters vervangen met normale karakters (é => e, ü => u, etc) en een van elk woord de soundex (Bijv 'De Davinci Code' => D302 C021 ofzo. 'De' heeft geen soundex).
Vervolgens schrijf je een aantal select-querys.
De eerste zoekt een exacte match
De tweede zoekt zonder vage karakters
De derde zoekt alleen de auteur, of alleen de titel
De volgende naar de soundex
De volgende naar delen van woorden
etc.. ten deze selecties voor je omstebeurt uit tot je genoeg resultaten hebt.

Resultaat bij mij was dat "britney spears" werd gevonden met "bitchie spiers" en "ferry krosten" bij "ferdy borsten". Hoe onnauwkeurig de hits worden heb je zelf in de hand. Maar ik zou, in verband met snelheid, niet door een array loopen en dergelijke acties utivoeren.
Pagina: 1