/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Fuzzy søgning
Fra : Lars Hoffmann


Dato : 08-08-02 14:09

Jeg har en side med en SQL server hvor man kan søge i. Søgningen foregår
noget alá:
.....WHERE info LIKE '%" & request.form("soegeord") & "%'...
og det virker jo også fint nok.

Nu er der blot det ved det at en stor del af det der bliver søgt på er
filmtitler og mange folk kan ikke stave ordentligt på engelsk. Derfor vil
jeg gerne implementere en fuzzy search, således at hvis jeg søger på "srek"
eller "sherk" finder man også de steder hvor der optræder "Shrek".
www.imdb.com har noget i den stil på deres side
Hvordan kommer jeg igang med det?

Med venlig hilsen
Lars Hoffman






 
 
Mark S. Rasmussen (08-08-2002)
Kommentar
Fra : Mark S. Rasmussen


Dato : 08-08-02 14:15

> Hvordan kommer jeg igang med det?

Hvis det bare er nogle få ting du vil søge efter, så lav en manuel replace
funktion. Hvis du derimod vil kunne udbygge den, så lav en tabel som
indeholder fejlord, og hvad de burde være. Så kan du ved søgningen loope
igennem hvert ord i søgningen, og se om det er forkert (hvor du slår op imod
db'en og ser om ordet findes deri). Sørg også for ikke at slå ord som "og,
and, if" alle sådanne små ubetydelige ord, som nemt kan checkes med en InStr
og Replace.

Mvh Mark
--
www.improve.dk



Lars Hoffmann (08-08-2002)
Kommentar
Fra : Lars Hoffmann


Dato : 08-08-02 18:29

Mark S. Rasmussen escribió / skrev

> Hvis det bare er nogle f† ting du vil s›ge efter, s† lav en manuel
> replace funktion.

Den går desværre ikke. Der kan søges på over 1000 filmtitler (der alle
kan skrives på 20 forskellige måder) og de varierer konstant, desuden
kan der søger på artikler, beskeder i et forum og meget andet, så det
går desværre ikke.
Med venlig hilsen
Lars Hoffmann

Jakob Andersen (08-08-2002)
Kommentar
Fra : Jakob Andersen


Dato : 08-08-02 14:22

Lars Hoffmann wrote:
> Nu er der blot det ved det at en stor del af det der bliver søgt på er
> filmtitler og mange folk kan ikke stave ordentligt på engelsk. Derfor
> vil jeg gerne implementere en fuzzy search, således at hvis jeg søger
> på "srek" eller "sherk" finder man også de steder hvor der optræder
> "Shrek". www.imdb.com har noget i den stil på deres side
> Hvordan kommer jeg igang med det?

I BOL prøv at kigge på SOUNDEX, denne kan give dig et bud på hvor tæt to ord
er i ordlyd.

F.eks. vil både
SELECT SOUNDEX('srek')
og
SELECT SOUNDEX('shrek')

Returnere:
S620

--
Jakob Andersen



Lars Hoffmann (08-08-2002)
Kommentar
Fra : Lars Hoffmann


Dato : 08-08-02 18:40

Jakob Andersen escribió / skrev

> SOUNDEX

Kanon, lige det jeg søgte efter. Mange tak
Med venlig hilsen
Lars Hoffmann

MS (08-08-2002)
Kommentar
Fra : MS


Dato : 08-08-02 20:41

>I BOL prøv at kigge på SOUNDEX, denne kan give dig et bud på hvor tæt to ord
>er i ordlyd.
>
>F.eks. vil både
>SELECT SOUNDEX('srek')
>og
>SELECT SOUNDEX('shrek')
>
>Returnere:
>S620
>

Lyder spændende, er det muligt at få lidt mere kode, eller ligesågodt, et
link omhandlende metoden.

/Martin

Jakob Andersen (08-08-2002)
Kommentar
Fra : Jakob Andersen


Dato : 08-08-02 21:24

"MS" <ms@msv.dk.NOT> wrote
> Lyder spændende, er det muligt at få lidt mere kode, eller ligesågodt, et
> link omhandlende metoden.

<http://msdn.microsoft.com/library/en-us/tsqlref/ts_setu-sus_3o6w.asp>


En simpel søgning på f.eks. "srek" kunne se sådan her ud:

SELECT felt1, felt2 FROM tabel WHERE SOUNDEX(felt1) = SOUNDEX('srek')

--
Jakob Andersen
http://www.stresscd.dk/ - Udnyt stress positivt



Martin Svenningsen (09-08-2002)
Kommentar
Fra : Martin Svenningsen


Dato : 09-08-02 08:02

-><http://msdn.microsoft.com/library/en-us/tsqlref/ts_setu-sus_3o6w.asp>
->
->
->En simpel søgning på f.eks. "srek" kunne se sådan her ud:
->
->SELECT felt1, felt2 FROM tabel WHERE SOUNDEX(felt1) =
SOUNDEX('srek')
->

>>Jeg har en side med en SQL server hvor man kan søge i. Søgningen..

Arrgh, SQL-server, mon der findes noge tilsvarende til Access
databaser ?

Martin



Lars Hoffmann (09-08-2002)
Kommentar
Fra : Lars Hoffmann


Dato : 09-08-02 08:18


"Martin Svenningsen" <ms@REMOVEmartinsvenningsen.com> escribió

> Arrgh, SQL-server, mon der findes noge tilsvarende til Access
> databaser ?

Saa skal du have fat i noget trediepart software eller selv skrive en
soundex funktion. dette kan maaske interessere dig:
http://www.hallogram.com/soundxx/index.html

Med venlig hilsen
Lars Hoffmann



ms (09-08-2002)
Kommentar
Fra : ms


Dato : 09-08-02 10:32

->Saa skal du have fat i noget trediepart software eller selv skrive
en
->soundex funktion. dette kan maaske interessere dig:
->http://www.hallogram.com/soundxx/index.html

De ved hvist godt at det er er smart, $$
SoundX/X Single User License (Download Only).........$119.00

Nå men vi har før snakket om at vi skal have ændret vores intranet
news site til at køre på vores SQL server istedet for sin egen Access
database, det er bare aldrig blevet, men her er der en rigtig god
grund til at gøre det.

Jeg siger mange tak for informationerne.

mvh.
Martin Svenningsen

Lars Hoffmann (09-08-2002)
Kommentar
Fra : Lars Hoffmann


Dato : 09-08-02 11:10


"ms" <ms@msv.dk.NOT> escribió

> De ved hvist godt at det er er smart, $$
> SoundX/X Single User License (Download Only).........$119.00

Så må du jo bare implementere den selv :




Function SoundEx(sWord As String) As String
Dim Num As String ' Holds the generated code
Dim sChar As String
Dim lWordLength As Long
Dim sLastCode As String

Num = UCase(Mid$(sWord, 1, 1)) ' Get the first letter
sLastCode = GetSoundCodeNumber(Num)
lWordLength = Len(sWord)

' Create the code starting at the second letter.
For I = 2 To lWordLength
sChar = GetSoundCodeNumber(UCase(Mid$(sWord, I, 1)))
' If two letters that are the same are next to each other
' only count one of them
If Len(sChar) > 0 And sLastCode <> sChar Then
Num = Num & sChar
End If
sLastCode = sChar
Next

SoundEx = Mid$(Num, 1, 4) ' Make sure code isn't longer then 4 letters
If Len(Num) < 4 Then ' Make sure the code is at least 4 characters long
SoundEx = SoundEx & String(4 - Len(Num), "0")
End If
End Function






Private Function GetSoundCodeNumber(sChar As String) As String
Select Case sChar
Case "B", "F", "P", "V"
GetSoundCodeNumber = "1"
Case "C", "G", "J", "K", "Q", "S", "X", "Z"
GetSoundCodeNumber = "2"
Case "D", "T"
GetSoundCodeNumber = "3"
Case "L"
GetSoundCodeNumber = "4"
Case "M", "N"
GetSoundCodeNumber = "5"
Case "R"
GetSoundCodeNumber = "6"
End Select
End Function



ms (09-08-2002)
Kommentar
Fra : ms


Dato : 09-08-02 13:24

->"Lars Hoffmann" <lars@intercambiodvd.com> wrote:
->Så må du jo bare implementere den selv :

Nu har jeg forsøgt at "omskrive" koden til vbs, men den retunerer kun
nuller.
Jeg har en mistanke til mid hvor jeg har fjernet $ tegnet for ikke at
få fejl. Har mid og mid$ forskellige funktioner ?

Martin


<%

Function Soundex(Word)

Dim strCode
Dim strChar
Dim lngWordLength
Dim strLastCode

'Grabs the first letter
strCode = UCase(mid(Word, 1, 1))
Response.write "<BR>" & strCode & "<BR>"
strLastCode = GetSoundCodeNumber(strCode)

'Stores the word length
lngWordLength = Len(Word)

'Continues the code, starting at the second letter
For i = 2 To lngWordLength
   strChar = GetSoundCodeNumber(UCase(Mid(Word, i, 1)))

   ' If adjacent numbers are the same,
   ' only count one of them
   If Len(strChar) > 0 And strLastCode <> strChar Then
      strCode = strCode & strChar
   End If
   strLastCode = strChar

Next

'Trim it down to a maximum of four characters...
Soundex = Mid(strCode, 1, 4)

'... but if it's less than four characters, pad
'it out with a bunch of zeros...
If Len(strCode) < 4 Then
   Soundex = Soundex & String(4 - Len(strCode), "0")
End If

End Function

Function GetSoundCodeNumber(Character)' As String) As String

'Accepts a character and returns the
'appropriate number from the Soundex table

Select Case Character
   Case "B", "F", "P", "V"
    GetSoundCodeNumber = "1"
   Case "C", "G", "J", "K", "Q", "S", "X", "Z"
    GetSoundCodeNumber = "2"
   Case "D", "T"
      GetSoundCodeNumber = "3"
   Case "L"
      GetSoundCodeNumber = "4"
   Case "M", "N"
      GetSoundCodeNumber = "5"
   Case "R"
      GetSoundCodeNumber = "6"
End Select

End Function




response.write "shrek " & SoundEX(shrek)



%>

Peter Lykkegaard (09-08-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 09-08-02 14:38


"ms" <ms@msv.dk.NOT> wrote in message
news:3d53b2dc.182506750@news.inet.tele.dk...
> ->"Lars Hoffmann" <lars@intercambiodvd.com> wrote:
> ->Så må du jo bare implementere den selv :
>
> Nu har jeg forsøgt at "omskrive" koden til vbs, men den retunerer kun
> nuller.
> Jeg har en mistanke til mid hvor jeg har fjernet $ tegnet for ikke at
> få fejl. Har mid og mid$ forskellige funktioner ?
>
Det er samme funktion
Vær opmærksom på at _alt_ er dimmet som variant i VBScript
Det kan godt drille

mvh/Peter Lykkegaard



MS (09-08-2002)
Kommentar
Fra : MS


Dato : 09-08-02 19:17

On Fri, 09 Aug 2002 12:23:30 GMT, ms@msv.dk.NOT (ms) wrote:

>Nu har jeg forsøgt at "omskrive" koden til vbs, men den retunerer kun
>nuller.
>
>response.write "shrek " & SoundEX(shrek)

Sådan skal linien være, OG DET VIRKER
response.write "shrek " & SoundEX("shrek")

Kanont og mange tak for hjælpen til jer alle

Mvh.
Martin

Lars Hoffmann (08-08-2002)
Kommentar
Fra : Lars Hoffmann


Dato : 08-08-02 23:47

Jakob Andersen escribió / skrev

> SOUNDEX

Lige en hurtig opfølgning....
Det virker skide godt. Feks vil "Harry potter" findes selv om der søges
på "Hari Poter", og "Mission Impossible" findes også ved at søge på
"mychon ymbociple" Nu kan selv den mest ordblinde finde film på mit
site.

Jeg endte med at bruge funktionen difference(), som regner forskellen på
på to soundex ud. difference returnere et tal mellem 4 og 1 hvor 4 er en
fonetisk exact match og 1 er to ord der intet har med hinanden at gøre.

Helt konkret ser min søgning således ud:

SELECT IdEdicion,Titulo,Distribuidora
FROM Blacklist
WHERE difference(Titulo,'" & Request.querystring("Titulo") & "')=4
ORDER BY titulo"

Jeg bruger en SQL server til min database

Med venlig hilsen og tak for hjælpen
Lars Hoffmann



Jakob Andersen (08-08-2002)
Kommentar
Fra : Jakob Andersen


Dato : 08-08-02 22:00

"Lars Hoffmann" <lars@hoffmann.ac> wrote
> Det virker skide godt. Feks vil "Harry potter" findes selv om der søges
> på "Hari Poter", og "Mission Impossible" findes også ved at søge på
> "mychon ymbociple" Nu kan selv den mest ordblinde finde film på mit
> site.

Godt at høre

> Jeg endte med at bruge funktionen difference(), som regner forskellen på
> på to soundex ud. difference returnere et tal mellem 4 og 1 hvor 4 er en
> fonetisk exact match og 1 er to ord der intet har med hinanden at gøre.

Difference er også god hvis man skal vise et søgeresultat sorteret efter
relevans.

--
Jakob Andersen
http://www.stresscd.dk/ - Udnyt stress positivt



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste