Avatar billede jensen363 Forsker
15. december 2016 - 12:00 Der er 4 kommentarer

Tæl forekomster af ord

I forbindelse med en kundetilfredshedsmåling har jeg I en database nu omkring 200.000 besvarelser I klar tekst I en kolonne I min database.

Jeg har behov for

1.  Få en liste over antallet af unikke ord
2.  Få en statistik over hvor ofte hvert enkelt ord er benyttet
Avatar billede supertekst Ekspert
15. december 2016 - 13:39 #1
Hej Jensen363

Kunne du evt. sende/uploade en mindre udgave af databasen for at man kan se eksempler på besvarelser?
Avatar billede bvirk Guru
15. december 2016 - 15:18 #2
Tabel undersogelse har feltet svar

'in access 2000 RegExp belongs to reference 'Microsoft VBScript Regular Expressions'
Function regex(pattern, Optional ignoreCase = True, Optional isGlobal = True)
    Set regex = New RegExp
    With regex
        .pattern = pattern
        .ignoreCase = ignoreCase
        .Global = isGlobal: End With
End Function

'in access 2000 Dictionary belongs to reference 'Microsoft Scripting Runtime'
Sub testWordCount()
    Dim word, wcnt, dic As New Dictionary
    With rsi("Undersogelse") 'replace with conventional record looping
        While Not .EOF
            For Each word In regex("\b[\wæøåÆØÅ]+\b").Execute(!svar)
                word = CStr(word): wcnt = wcnt + 1
                If dic.Exists(CStr(word)) Then dic(word) = dic(word) + 1 Else dic.Add word, 1
               
                'Stop
            Next
        Wend: End With
    'print all words count
    For Each word In dic.Keys
        Debug.Print word & ": " & dic.Item(word) & "=" & 100# * dic.Item(word) / wcnt & "%"
    Next
End Sub
Avatar billede jensen363 Forsker
16. december 2016 - 08:02 #3
bvirk >
lidt forklaring til hvorledes dette virker, - kan ikke umiddelbart få det til at virke.

Jeg er opmærksom på de nødvendige referencer
Avatar billede bvirk Guru
16. december 2016 - 12:53 #4
Denne:
With rsi("Undersogelse") 'replace with conventional record looping

skal opfattes som psedokode - jeg gider, ikke i eget regi, hver gang der skal loopes gennem poster at gentage: set db= ..., set rs=..., movenext..., derfor har jeg kogt det ned til en recordset iterator - og tænke at kommentaren bag gav et hint om hvad rsi(tabel) med (manglende) indesluttede ting skal erstattes med.
I loopen:
with rsi(tabel)
  ...
end with

indholder udtrykket !svar feltet 'svar' i tabel 'undersogelse.

"\b[\wæøåÆØÅ]+\b" er et reular expression pattern der søger efter matches af ordbogstaver: \w eller et af tegnende æøåÆØÅ som forekommer efter hinanden 1 eller flere gange og som er omskuttet af ordseparerende tegn \b (space, tab, cr, lf, start på strengen, slut på strengen mm.
Regular expressions  erstatter meget snørklet kode
Hvis man vil teste kan man prøve patterns i en editor der understøtter søgning med regular expressions -  Jeg anvender Jedit.

http://www.regular-expressions.info/
http://chimera.labs.oreilly.com/books/1234000001805/ch10.html#learnjava3-CHP-10-SECT-7

For Each word In regex("\b[\wæøåÆØÅ]+\b").Execute(!svar) looper gennem alle ord med VARIANTEN word - som så, fordi den er forskellig for selv ens ord, i hvert loop bliver lavet til string med cstr(word)

Det er iøvrigt en fejl (overflødigt)at det sker en gang til i udtrykket linie under

word er key i directory objekt 'dic' - det der er i andre sprog hedder map eller hash - en liste af noget (keys) er lig noget andet (value) på den måde at keys er unikke.  Value er her antal gange et ord forekommer - linien:

If dic.Exists(word) Then dic(word) = dic(word) + 1 Else dic.Add word, 1

søger for for oprettelse eller optælning af value

tror så jeg har udpeget det ikke helt oplagte, men skriver gerne mere
er regular expressions ikke bare stærkt tool?

Mvh Benny
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