Avatar billede mesterhakkeren Nybegynder
03. oktober 2005 - 00:05 Der er 10 kommentarer og
1 løsning

sammenlign 2 strenge

jeg skal have sammenlignet 2 strenge, men på en lidt speciel måde.
PHP fra en funktion som kan sammenligne 2 strenge, og angive hvor mange procent forskel der er.

hvis f.eks

a = "hej med dig jeg flyver hurtigt"

b = "hej med dig jeg hopper hurtigt"


så kunne man sige at de var 85 % ens, eller noget i den stil.


hvor gør man i VB sådan noget ligende ??
Avatar billede sjh Nybegynder
03. oktober 2005 - 00:57 #1
Nej sådan en funktion har vb ikke.. men jeg har leget lidt med det.. og er kommet frem til det her..


Option Explicit

Private Sub Form_Load()
Dim a As String, b As String
  a = "hej med dig jeg flyver hurtigt"
  b = "hej med dig jeg hopper hurtigt"

  Me.Caption = SimilarText(a, b) & "%"
End Sub

Public Function SimilarText(strFirst As String, strSecond As String, Optional strDelimiter As String = " ") As Integer
Dim i As Integer
Dim j As Integer
Dim intMax As Integer
Dim intCount As Integer
Dim arrFirst() As String
Dim arrSecond() As String

  If Len(strFirst) = Len(strSecond) Then
    intCount = 1
  End If

  arrFirst = Split(strFirst, strDelimiter)
  arrSecond = Split(strSecond, strDelimiter)
 
  If UBound(arrFirst) > UBound(arrSecond) Then
    intMax = UBound(arrFirst)
      Else
    intMax = UBound(arrSecond)
  End If
 
  For i = LBound(arrFirst) To UBound(arrFirst)
    For j = LBound(arrSecond) To UBound(arrSecond)
      If arrSecond(j) = arrFirst(i) Then
        intCount = (intCount + 1)
        Exit For
      End If
    Next
  Next

  SimilarText = Int(intCount / (intMax + 2) * 100)
End Function
Avatar billede ksoren Nybegynder
03. oktober 2005 - 02:18 #2
sjh, jeg tror den bliver for simpel. Hvis man f.eks. indsætter ét ord efter 'hej', så går der helt ged i procenten. Denne er løst oversat fra PHPs similar_text()


Dim txt1 As String, txt2 As String
Dim len1 As Integer, len2 As Integer

txt1 = "hej med dig jeg flyver hurtigt"
txt2 = "hej med dig jeg hopper hurtigt"
len1 = Len(txt1)
len2 = Len(txt2)

sim = vb_similar_char(txt1, len1, txt2, len2)

'udregn procent
percent = sim * 200 / (len1+len2)


Function vb_similar_char(ByVal txt1 As String, ByVal len1 As Integer, ByVal txt2 As String, ByVal len2 As Integer) As Integer

    Dim sum As Integer
    Dim pos1 As Integer, pos2 As Integer, max As Integer

    Call vb_similar_str(txt1, len1, txt2, len2, pos1, pos2, max)

    sum = max
    If sum <> 0 Then
        If (pos1 <> 0) AND (pos2 <> 0) Then
            sum = sum + vb_similar_char(txt1, pos1, txt2, pos2)
        End If

        If (pos1 + max < len1) And (pos + max < len2) Then
            sum = sum + vb_similar_char(Mid(txt1, pos1+max+1), len1-pos1-max, Mid(txt2, pos2+max+1), len2-pos2-max)
        End If
    End If

    vb_similar_char = sum
End Function


Sub vb_similar_str(txt1 As String, len1 As Integer, txt2 As String, len2 As Integer, ByRef pos1 As Integer, ByRef pos2 As Integer, ByRef max As Integer)
    Dim p As Integer, q As Integer, l As Integer

    max = 0

    For p=0 To len1
        For q=0 To len2
            l = 0
            Do Until 1 <> 1

                If p+l >= len1 Then Exit Do
                If q+l >= len2 Then Exit Do
                If Mid(txt1, p+l+1, 1) <> Mid(txt2, q+l+1, 1) Then Exit Do
                l = l + 1
            Loop


            If l > max Then
                max = l
                pos1 = p
                pos2 = q
            End If

        Next
    Next
End Sub
Avatar billede sjh Nybegynder
03. oktober 2005 - 10:17 #3
ksoren > Ja det kan da godt være jeg var lidt hurtig.. :D
Avatar billede martin_moth Mester
03. oktober 2005 - 11:07 #4
I skal jo også bestemme hvordan %-erne skal måles.

Der kan jo være flere forskellige måder at gøre det på. Måler man alene på hvilke karakterer der er i strengene, måler man på hvor mange tegn der afviger osv...

1=Hej
2=jeh

De er 100% ens på længde og de karakterer der er i sætningerne
de er 33% ens mht. placeringerne af tegnene (1 ud af 3 tegn står samme sted)

1=Katten sover
2=Missen hviler

De er næsten helt ens i betydning, men næsten fuldstændig uens i de karakterer der sammenlignes (at udregne hvor ens de er i betydning er vist en større opgave i VB;o)
Men de er 100% ens i opbygning - et navneord, et udsagnsord, adskildt af et mellemrum.

1=Undskyld, ved du hvad klokken er
2=Ved du hvad klokken er

Sammenlignes karakter for karakter, er de 100% uens. Men ignoreres første ord, er de 100% ens

Osv osv.

_________________________________________________


Spørgsmålet lader sig simpelthen ikke besvare, med mindre man gør sig nogle forudsætninger. Kan ikke lure af hvilke forudsætninger der er i svar fra ksoren.

Så mesterhakkeren skal gøre sig klar, hvad det egenligt er han ønsker at vide. Med mindre han stiller sig tilfreds med et svar, som giver en-eller-anden %, som han kan bruge i en-eller-anden sammenhæng, hvor det ikke behøver at blive uddybet, hvad der egenligt menes med den %. Altså - at han kan leve med at opgive en %, som han ikke ved hvad dækker over.
Avatar billede martin_moth Mester
03. oktober 2005 - 11:19 #5
PS: Har forsøgt at copy-paste ovenstående kode.

bil / hus = 0% ens
bil / cykel = 25% ens??? (forskellige ord m. et fælles bogstav-står bagest i begge ord)
bil / fly = 33% ens??? (kun et fælles bogstav, står forskellige steder)
bil / lib = 33% ens??? (samme ord stavet bagfra)

Går ud fra at l'et gør, at de to sidste er lidt ens. Men for at det kan bruges til noget, skal man vide, hvad det er der målet på...

Alt dette skriveri blot for at mesterhakkeren får en ide om hvad det egenligt er han spørger om, og hvad han kan bruge svarene til

Ikke et ondt ord om svaret fra ksoren :o)
Avatar billede sjh Nybegynder
03. oktober 2005 - 14:20 #6
her en test fra php's similar_text()

  echo similar_text("bil", "hus"); // 0% (længde på de to ord er da begge på 3 skulle det så ikke være 1%)
  echo similar_text("bil", "cykel"); // 1% (passer meget godt med 1%)
  echo similar_text("bil", "fly"); // 1% (længde på de to ord er også på 3 så skulle de væl være 2% da der er "L" i dem begge)
  echo similar_text("bil", "lib"); // 1% (her skulle den vel så være 5%.. samme længde samme bogstaver + "I" står på samme plads)

  echo similar_text("Katten", "Missen"); // 2%
  echo similar_text("sover", "hviler"); // 3%
  echo similar_text("Katten sover", "Missen hviler"); // 6%

  echo similar_text("Kattensover", "Missenhviler"); // 5%
  echo similar_text("rKsteoveatn", "lishisveMnre"); // 4%
Avatar billede bak Forsker
03. oktober 2005 - 17:16 #7
mrexcel havde på et tidspunkt en VBA-konkurence vedr. fuzzy match i %
se link
http://www.mrexcel.com/pc07.shtml
Avatar billede martin_moth Mester
03. oktober 2005 - 17:44 #8
Jeg ser ikke problemet i at kode løsningen

Problemet er at opsætte regler for, hvordan sætninger skal sammenlignes.

1 = "Hat"
2 = "Kage"

2 er 25% længere end 1, derfor er forskellen 25%
Der er et fælles bogstav (2*a) ud af i alt 7 bogstaver, derfor er de 2/7 ens = 28,6%
1 er et enstavelsesord, 2 er et 2-stavelsesord, derfor 0% ens
De er begge navneord, derfor 100%
De er forskellige navneord, derfor 0%
Placeringen af det fælles bogstav (a) er ens (nr. to bogstav) - det må også tælle

osv osv

Så det spørgsmål der stilles er lidt at sammenligne med

"Hvor langt er et stykke snor?"

Før allemulige begynder at sige "2 meter", "1 cm", ..., skal der lige nogle flere ting på plads...
Avatar billede mesterhakkeren Nybegynder
03. oktober 2005 - 18:12 #9
ok.. sejt.. smid et svar ind med jer
Avatar billede sjh Nybegynder
03. oktober 2005 - 22:08 #10
Hvor langt er et stykke snor?  fra den ene ende til den anden ;)
Avatar billede mesterhakkeren Nybegynder
05. oktober 2005 - 23:00 #11
ok.. lukker :)
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
Kategori
Kurser inden for grundlæggende programmering

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