Avatar billede kovalt Nybegynder
07. april 2008 - 15:32 Der er 6 kommentarer

Ordtælling i string

Hej

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.

Eks.

Her kommer der en tekst som er en tekst.

Tekst: 2
En: 2
Der: 1
Her: 1
Kommer: 1
Som: 1
Er: 1

På forhånd tak
Avatar billede soerenlyn Nybegynder
07. april 2008 - 15:51 #1
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
%>
Avatar billede soerenlyn Nybegynder
07. april 2008 - 15:52 #2
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
Avatar billede 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
%>

\Dan
Avatar billede soerenlyn Nybegynder
07. april 2008 - 18:28 #4
---> dannielsen.

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..
Avatar billede soerenlyn Nybegynder
07. april 2008 - 19:22 #5
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)

    aOccurrence(iOne) = aOccurrence(iTwo)
    aOccurrence(iTwo) = sTemp

    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>"
%>
Avatar billede kovalt Nybegynder
08. april 2008 - 22:07 #6
hej soerenlyn

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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester