03. oktober 2005 - 00:05Der 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.
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
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
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
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
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.
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
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)
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...
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.