Jeg har en string som jeg ikke kender indholdet af. Med udgangspunkt i denne ønsker jeg en liste over alle de ord som er i stringen (kun én forekomst pr. ord) samt antal gange ordet forekommer. Herefter skal jeg have en top 5 over ordene.
Dette er lige en hurtig hjemme-brygget algoritme, så det kan godt være der er nogle små-fejl, men jeg tænker den virker. Jeg er ikke helt sikker på de dynamic-size arrays, om det er sådan man laver dem i ASP.. Den har en køretid på O(n * m) (hvis det siger dig noget), hvor n er antal ord i teksten man søger i, og m er antal forskellige ord..
<% sText = "....." aText = Split(sText," ")
dim aWords() dim aOccurrence() iLen = 0
Function UpdateWord(sWord) bFound = False For u = 0 To UBound(aWords) If aWords(u) = sWord Then aOccurrence(u) = aOccurrence(u) + 1 bFound = True End If Next
If Not bFound Then aWords(iLen) = sWord aOccurrence(iLen) = 1 End If End Function
For i = 0 To UBound(aText) UpdateWord(aText(i)) Next %>
Hvis de dynamic-size arrays ikke virker, så kan du skrive
dim aWords(UBound(aText)) dim aOccurrence(UBound(aText))
, de kan hvert fald ikke blive større. Så ved jeg dog igen ikke om man henter længden af et array med UBOund :P
Synes godt om
Slettet bruger
07. april 2008 - 16:13#3
hvad med noget a la det her:
<% streng = "tjae... hvad med noget a la det her?" strstreng = split(streng," ") for a=0 to ubound(strstreng) antalgange=0 strdel = split(streng," ") for b=0 to ubound(strdel) if (lcase(trim(strstreng(a)))=lcase(trim(strdel(b)))) then antalgange=antalgange+1 end if next response.write strstreng(a) & ": " & antalgange & "<br>" next %>
Den finder jo ikke de fem størte - den udskriver dem bare :) I mit array kan man derefter løbe det igennem og finde de 5 største. Derudover vil din løbe array flere gange igennem end min, og dermed tage længere tid..
Jeg har lige implementeret Quicksort, så du ikke kun behøver finde de 5 mest brugte ord frem, men de "n" mest brugte ord. Samlet ser det således ud:
<% sText = "HER HAR DU DIN TEKSTSTRENG. JA HER ER DEN SÅ. HVORDAN ER DEN. DET FÅR VI AT SE. FOR HER ER DEN ALTSÅ." aText = Split(sText," ")
dim aWords() redim aWords(UBound(aText)) dim aOccurrence() redim aOccurrence(UBound(aText)) iLen = 0
Function UpdateWord(sWord) bFound = False For u = 0 To UBound(aWords) If aWords(u) = sWord Then aOccurrence(u) = aOccurrence(u) + 1 bFound = True End If Next
If Not bFound Then aWords(iLen) = sWord aOccurrence(iLen) = 1 iLen = iLen + 1 End If End Function
Function EvaluateString() For i = 0 To UBound(aText) Call UpdateWord(aText(i)) Next Call Quicksort(0,UBound(aOccurrence)) End Function
Function Swap(iOne, iTwo) sTemp = aOccurrence(iOne) sTemp1 = aWords(iOne)
aWords(iOne) = aWords(iTwo) aWords(iTwo) = sTemp1 End Function
Function Partition(iStart, iEnd) x = aOccurrence(iEnd) i = iStart - 1 For j = iStart To iEnd - 1 If Not aOccurrence(j) > x Then i = i + 1 Call Swap(i, j) End If Next Call Swap(i + 1, iEnd) Partition = i + 1 End Function
Function Quicksort(iStart, iEnd) If iStart < iEnd Then iSlice = Partition(iStart, iEnd) Call Quicksort(iStart, iSlice - 1) Call Quicksort(iSlice + 1, iEnd) End If End Function
Call EvaluateString()
' Dette er de 5 mest forekomne ord, hvor det øverste ord er forekommet mest. Response.Write aWords(UBound(aWords)) & "<br>" Response.Write aWords(UBound(aWords) - 1) & "<br>" Response.Write aWords(UBound(aWords) - 2) & "<br>" Response.Write aWords(UBound(aWords) - 3) & "<br>" Response.Write aWords(UBound(aWords) - 4) & "<br>" %>
Det ser jo ganske fornuftigt ud. Jeg takker for det.
Kunne du hurtigt lavet det muligt at udskrive antallet af gange ordre forekommer. Eks.:
Ord 1 (10 forekomster) Ord 2 (5 forekomster) Ord 3 (1 forekomst)
Smid et svar
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.