/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Hvordan finder man ud af om 2 Variabler er~
Fra : EnjoyNews


Dato : 15-06-07 16:24

Hej

Hvordan finder man ud af om to variable ligner næsten hinanden.
Altså hvis jeg skriver IF($var1 = = $var){echo 'Korrekt';}
Men det er jo kun hvis de er 100% ens.

Hvis nu der er lavet en stave fejl i den ene så $var1 = 'Der Var Engang' og
$var2 = 'Der ar Enganh'
Kan man så ikke få den til at se at de er måske 85% ens og så sætte en
grænse på ex. 70% og hvis de er mere end 70% ens så skal den godkendes.


Håber nogle har en god idet.



 
 
Martin Mouritzen (15-06-2007)
Kommentar
Fra : Martin Mouritzen


Dato : 15-06-07 17:33

On Fri, 15 Jun 2007 17:23:39 +0200, "EnjoyNews" <mh-nyheder@mail.dk>
wrote:

>Hvordan finder man ud af om to variable ligner næsten hinanden.
>Altså hvis jeg skriver IF($var1 = = $var){echo 'Korrekt';}
>Men det er jo kun hvis de er 100% ens.
>
>Hvis nu der er lavet en stave fejl i den ene så $var1 = 'Der Var Engang' og
>$var2 = 'Der ar Enganh'
>Kan man så ikke få den til at se at de er måske 85% ens og så sætte en
>grænse på ex. 70% og hvis de er mere end 70% ens så skal den godkendes.

Jeg tænkte først på at bruge soundex, og lavede et eksempel til dig
her:
<URL:http://siteloom.dk/~martin/soundex/> (Kildekode her:
<URL:http://siteloom.dk/~martin/soundex/index.phps>)

Men den fejler på dit eksempel - Og kan desuden også kun bruges til at
måle om ting lyder ens, ikke om der er slåfejl.

Men jeg har nu lavet et eksempel der bruger similar_text, du kan se
det her:
<URL:http://siteloom.dk/~martin/similar_text/> (Kildekode her:
<URL:http://siteloom.dk/~martin/similar_text/index.phps>)

Den er nok mere brugbar til formålet, og testen med dine 2 sætninger
var ihvertfald vellykket.
--
Med venlig hilsen,
Martin Mouritzen.
http://www.siteloom.dk

EnjoyNews (18-06-2007)
Kommentar
Fra : EnjoyNews


Dato : 18-06-07 01:02


"Martin Mouritzen" <martin@siteloom.dk> skrev i en meddelelse
news:c4f57393rioc7cfe2ti492p4b54a7gmd4o@4ax.com...
> On Fri, 15 Jun 2007 17:23:39 +0200, "EnjoyNews" <mh-nyheder@mail.dk>
> wrote:
>
>>Hvordan finder man ud af om to variable ligner næsten hinanden.
>>Altså hvis jeg skriver IF($var1 = = $var){echo 'Korrekt';}
>>Men det er jo kun hvis de er 100% ens.
>>
>>Hvis nu der er lavet en stave fejl i den ene så $var1 = 'Der Var Engang'
>>og
>>$var2 = 'Der ar Enganh'
>>Kan man så ikke få den til at se at de er måske 85% ens og så sætte en
>>grænse på ex. 70% og hvis de er mere end 70% ens så skal den godkendes.
>
> Jeg tænkte først på at bruge soundex, og lavede et eksempel til dig
> her:
> <URL:http://siteloom.dk/~martin/soundex/> (Kildekode her:
> <URL:http://siteloom.dk/~martin/soundex/index.phps>)
>
> Men den fejler på dit eksempel - Og kan desuden også kun bruges til at
> måle om ting lyder ens, ikke om der er slåfejl.
>
> Men jeg har nu lavet et eksempel der bruger similar_text, du kan se
> det her:
> <URL:http://siteloom.dk/~martin/similar_text/> (Kildekode her:
> <URL:http://siteloom.dk/~martin/similar_text/index.phps>)
>
> Den er nok mere brugbar til formålet, og testen med dine 2 sætninger
> var ihvertfald vellykket.
> --
> Med venlig hilsen,
> Martin Mouritzen.
> http://www.siteloom.dk

Hej

Jeg kan kun sige tusind tak
Nogle gange bliver man altså lidt overrasket over hvor let det er... At der
ligefrem var en kommando til det vidste jeg ikke...
Men det virker præcis som det skal...

Dog er der lige en enkelt ting.
For at folk ikke skriver titlerne forskelligt har jeg fjernet kommaer og
parenteser fra titlerne sådan her:
$title=str_replace("(","",$title);
$title=str_replace(")","",$title);
$title=str_replace(",","",$title);

men hvis jeg prøver at fjerne ' sådan her
$title=str_replace("'","",$title);
så laver den fejl.
Hvorfor kan man ikke det, eller kan de fjernes på en anden måde ?



Bertel Lund Hansen (19-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 19-06-07 12:59

EnjoyNews skrev:

> Dog er der lige en enkelt ting.
> For at folk ikke skriver titlerne forskelligt har jeg fjernet kommaer og
> parenteser fra titlerne sådan her:
> $title=str_replace("(","",$title);
> $title=str_replace(")","",$title);
> $title=str_replace(",","",$title);

Det kan forenkles:
$unwanted=array('(', ')', ',', "'");
$title=str_replace($unwanted, '',$title);

Det er ofte ligemeget om man i PHP bruger enkelte eller dobbelte
anførselstegn, men jeg har valgt den konvention at jeg kun bruger
dobbelte når de er nødvendige.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Bertel Lund Hansen (15-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 15-06-07 17:39

EnjoyNews skrev:

> Hvordan finder man ud af om to variable ligner næsten hinanden.

Man sætter et menneske til at kikke på dem.

> Hvis nu der er lavet en stave fejl i den ene så $var1 = 'Der Var Engang' og
> $var2 = 'Der ar Enganh'

En mulig metode der måske kan klare nogle af problemerne:

SQL har et reserveret ord, LIKE. Det kan bruges til at finde
elementer der ligner hinanden, men ikke nødvendigvis er ens.

Det kræver blot at du lægge den ene kandidat i en database og så
laver et udtræk derfra hvor du skriver:

   SELECT column FROM table WHERE column LIKE pattern

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Arne Feldborg (16-06-2007)
Kommentar
Fra : Arne Feldborg


Dato : 16-06-07 06:33

Bertel Lund Hansen <unospamo@lundhansen.dk> skrev Fri, 15 Jun 2007
18:38:33 +0200


>Det kræver blot at du lægge den ene kandidat i en database og så
>laver et udtræk derfra hvor du skriver:
>
>    SELECT column FROM table WHERE column LIKE pattern
>
Skal det opfattes som en vittighed.?

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Arne Feldborg (23-06-2007)
Kommentar
Fra : Arne Feldborg


Dato : 23-06-07 00:35

Bertel Lund Hansen <unospamo@lundhansen.dk> skrev Fri, 15 Jun 2007
18:38:33 +0200

>SQL har et reserveret ord, LIKE. Det kan bruges til at finde
>elementer der ligner hinanden, men ikke nødvendigvis er ens.
>
>Det kræver blot at du lægge den ene kandidat i en database og så
>laver et udtræk derfra hvor du skriver:
>
>    SELECT column FROM table WHERE column LIKE pattern
>
Selvom det ovenstående er rent nonsens, så synes jeg stadigvæk det er
interessant, hvordan man løser den oprindlige spørgers problem i et
databasekald.

Hvordan laver man mest hensigstmæssigt, og med mindst mulig belastning
af serveren, en similar_text(), i et MySql kald.?

N.B. SoundEx er udelukket - duer ikke til danske forhold.

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Christian Bohr-Halli~ (15-06-2007)
Kommentar
Fra : Christian Bohr-Halli~


Dato : 15-06-07 18:11

"EnjoyNews" <mh-nyheder@mail.dk> posting:

>Hvordan finder man ud af om to variable ligner næsten hinanden.

Er der tale om to tekster, kunne en simpel metode være at gennemløbe
hver streng tegn for tegn og tjekke, om de disse er ens. Er de
dette, kunne denne tegn-lighed dække en given brøkdel af den samlede
lighed, og den samlede lighed ville være summen af enkeltlighederne.

Se evt. <http://cbh.softwolves.dk/temp/owa.pdf>, primært det sidste.

--
What is life, except excuse for death,
or death, but an escape from life. -Ukendt

Fly Opera - http://opera.softwolves.dk

Bertel Lund Hansen (15-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 15-06-07 18:17

Christian Bohr-Halling skrev:

> Er der tale om to tekster, kunne en simpel metode være at gennemløbe
> hver streng tegn for tegn og tjekke, om de disse er ens.

Indsæt et enkelt tegn i begyndelsen af den ene af to identiske
tekster, og din metode vil sige at der 0 % ens.

Jeg kendte ikke similar_text(), men det gør jeg nu. Den skal jeg
da lige afprøve.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Christian Bohr-Halli~ (15-06-2007)
Kommentar
Fra : Christian Bohr-Halli~


Dato : 15-06-07 18:23

Bertel Lund Hansen <unospamo@lundhansen.dk> posting:

>Indsæt et enkelt tegn i begyndelsen af den ene af to identiske
>tekster, og din metode vil sige at der 0 % ens.

Du har ret. Dårligt forslag.

--
What is life, except excuse for death,
or death, but an escape from life. -Ukendt

Fly Opera - http://opera.softwolves.dk

Peter Brodersen (16-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 16-06-07 04:53

On Fri, 15 Jun 2007 19:17:11 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Jeg kendte ikke similar_text(), men det gør jeg nu. Den skal jeg
>da lige afprøve.

Jeg bruger similar_text() i en håndfuld søgefunktioner, hvor jeg
bevidst ofrer cpu-tid til fordel for bedre søgeresultater.

Når en bruger netop laver en aktiv søgning, er det lidt min holdning,
at der ikke behøves at blive sparet på ressourcerne i forhold til mere
rutinemæssige operationer. Alternativet vil være, at brugeren
alligevel laver en lang række søgninger, hvis den første ikke giver
noget resultat, og så er der ingen grund til at han skal sidde og lege
Mastermind mod hjemmesidens søgefunktionalitet.

similar_text() skalerer ikke nødvendigvis hensigtsmæssigt, men for
webprojekter med en 5-10.000 korte tekststrenge (fx navne, titler,
m.m.) kan det stadigvæk være acceptabelt nok, hvis man ikke har den
vilde mængde søgehungrende besøgende.

--
- Peter Brodersen
Kendt fra Internet

Arne Feldborg (17-06-2007)
Kommentar
Fra : Arne Feldborg


Dato : 17-06-07 22:24

Peter Brodersen <usenet2007@ter.dk> skrev Sat, 16 Jun 2007 05:52:55
+0200

>Jeg bruger similar_text() i en håndfuld søgefunktioner, hvor jeg
>bevidst ofrer cpu-tid til fordel for bedre søgeresultater.
>
Den tankegang kan jeg godt følge, men hvordan gør du det sådan rent
praktisk.

Hiver du bare en masse poster ud af databasen som du så efterfølgende
behandler i PHP. Eller er det baseret på søgning i tekstfiler.?

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Peter Brodersen (17-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 17-06-07 23:05

On Sun, 17 Jun 2007 23:24:04 +0200, Arne Feldborg
<feldborg@haunstrup.dk> wrote:

>>Jeg bruger similar_text() i en håndfuld søgefunktioner, hvor jeg
>>bevidst ofrer cpu-tid til fordel for bedre søgeresultater.
>>
>Den tankegang kan jeg godt følge, men hvordan gør du det sådan rent
>praktisk.
>
>Hiver du bare en masse poster ud af databasen som du så efterfølgende
>behandler i PHP. Eller er det baseret på søgning i tekstfiler.?

Lige nu er det lidt en blanding af alting, men det ville nok være
hurtigere at hælde det ud i PHP.


Proceduren er omtrent som følger (og kan tydeligvis optimeres i stedet
for at lave databaseopslag hver gang):

Jeg opererer med tre kategorier for mulige resultater: Perfekte
matches, gode matches og nogenlunde matches.

- Jeg søger i alle relevante tabeller med søgeordet. Er der et præcist
match, kommer resultatet (eller resultaterne - flere entries kan i
princippet godt hedde det samme, specielt når man søger på tværs af
kategorier) i "Perfekte match"-kategorien.

- Derefter søger jeg i tabeller om hvorvidt, søgeordet optræder som en
del af en streng (fx vil "Fogh" matche "Anders Fogh Rasmussen"). Er
søgeordet på 4 eller flere tegn, kommer resultater her i
gode-kategorien, ellers i nogenlunde-kategorien.

- Derefter laver jeg soundex-matches og smider resultater i
gode-kategorien.

- Derefter tjekker jeg alle entries igennem med similar_text op imod
søgeordet, og får en procentværdi ud for alle entries.
+ Hvis der er lige præcis ét match over 80 %, kommer det match i
"god"-kategorien.
+ Ellers kommer alle matches over 65 % i "nogenlunde"-kategorien.


Resultatet bliver så behandlet på denne måde:

- Hvis der er én entry i "Perfekt match"-kategorien, bliver brugeren
viderestillet til resultatet med det samme.

- Hvis der ikke er nogen entryes i "Perfekt match"-kategorien, og én
entry i "God match"-kategorien (og søgeordet er på mindst fire tegn),
så bliver brugeren også viderestillet til det resultat med det samme.

- Ellers vises en liste af de resultater, som er fundet undervejs.


Hvis jeg skulle lave en del af koden om, ville jeg nok fjerne
soundex-matchet undervejs. Det kan naturligvis også optimeres ved at
gemme soundex-resultatet for hver entry på forhånd.

I mit tilfælde bruger jeg det på op imod fem tabeller med et par
tusinde entries hver. Det giver acceptable svartider for mig ud fra en
balance mellem at bruge CPU-tid på at give brugeren bedre resultater.

Der er vel at mærke tale om korte tekststrenge, fx titler, navne og
enkelte kortere sætninger. Jeg ved ikke, om det kan bruges med længere
stykker indhold.

--
- Peter Brodersen
Kendt fra Internet

Arne Feldborg (21-06-2007)
Kommentar
Fra : Arne Feldborg


Dato : 21-06-07 00:16

Peter Brodersen <usenet2007@ter.dk> skrev Mon, 18 Jun 2007 00:04:45
+0200


>Lige nu er det lidt en blanding af alting, men det ville nok være
>hurtigere at hælde det ud i PHP.
>
>Proceduren er omtrent som følger (og kan tydeligvis optimeres i stedet
>for at lave databaseopslag hver gang):
>
Mange tak for dit uddybende svar.

En umiddelbar indskydelse må nok være, at du ihvertfald har ret mht. at
du prioriterer brugervenlighed frem for performane. .-))

Men der kan der da også sagtens være tilfælde hvor dette er beretiget.
Og der er givetvis ting i dit svar jeg skal have afprøvet og måske
senere selv kan bruge.

Som amatørslægtsforsker støder man jo dagligt på det problem, at det
samme navn, og den samme persons navn, op gennem tiderne staves på vidt
forskellige måder.

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Peter Brodersen (23-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 23-06-07 02:14

On Thu, 21 Jun 2007 01:15:54 +0200, Arne Feldborg
<feldborg@haunstrup.dk> wrote:

>En umiddelbar indskydelse må nok være, at du ihvertfald har ret mht. at
>du prioriterer brugervenlighed frem for performane. .-))

Yep, men jeg vil også gerne se tingene i et større perspektiv.
Følgende tal er semi-fiktive, men...:

Et hurtigt index-opslag tager måske 0.1 millisekund. Mit søgeopslag
tager måske 50 millisekunder, hvilket altså er en belastning, som er
500 gange så stor som index-opslaget, plus at belastningen stiger mere
end lineært, jo flere entries, der skal kigges igennem.

Men 50 millisekunder er stadigvæk ikke lang tid for en bruger at vente
ekstra på et tilsvarende bedre resultat. Og det kan være at alt muligt
andet overhead vil betyde, at det alligevel er mere belastende, hvis
brugeren skal lave 4-5 søgninger og reloads, før han får det resultat,
han er interesseret i. Dertil kan man lægge min opfattelse om at
søgninger er særtilfælde og ikke en del af den normale navigation og
sidegenerering. Så hvis der foretages en søgning for hvert 20.
sidebesøg, så er det jo også værd at "modregne" det i forhold til den
overordnede belastning.

>Men der kan der da også sagtens være tilfælde hvor dette er beretiget.
>Og der er givetvis ting i dit svar jeg skal have afprøvet og måske
>senere selv kan bruge.
>
>Som amatørslægtsforsker støder man jo dagligt på det problem, at det
>samme navn, og den samme persons navn, op gennem tiderne staves på vidt
>forskellige måder.

Jeg synes da helt sikkert, du skulle prøve at lege lidt med
funktionerne - måske i noget mere simpel grad end jeg gør :) Men i mit
tilfælde bliver der både foretaget flere former for graduering samt en
efterfølgende beslutningstagen om repræsentationen af resultatet -
altså om man bare skal vise en resultatliste eller om man skal
viderestille brugeren til det mest sandsynlige resultat.

I praksis kan man jo altid lave funktionen og se, om man selv føler at
ens side er blevet mere sløv. Hvis den ikke føles mere sløv, er
"problemet" med den højere belastning måske ikke så vigtig.

--
- Peter Brodersen
Kendt fra Internet

Datalogikeren Jensen (15-06-2007)
Kommentar
Fra : Datalogikeren Jensen


Dato : 15-06-07 22:41

On 15 Jun., 18:38, Bertel Lund Hansen <unosp...@lundhansen.dk> wrote:
> En mulig metode der måske kan klare nogle af problemerne:
>
> SQL har et reserveret ord, LIKE. Det kan bruges til at finde
> elementer der ligner hinanden, men ikke nødvendigvis er ens.
>
> Det kræver blot at du lægge den ene kandidat i en database og så
> laver et udtræk derfra hvor du skriver:
>
> SELECT column FROM table WHERE column LIKE pattern

Fedt! Det var lige, hvad jeg manglede. Jeg er ved at skrive bachelor i
datalogi på Århus Universitet og har i forbindelse med et user
interface brug for at kunne sammenligne brugerinput med nogle
fastlagte værdier, og jeg har bare ikke kunne finde ud af hvordan. Jeg
havde tænkt på at træne et neuralt netværk til at identifcere
forskelle, men takke være dit FINE forslag her, kan det gøre meget
lettere

<?php

function ligner($var1, $var2) {
list($var1, $var2) = array(mysql_escape_string($var1),
mysql_escape_string($var2));
mysql_connect();
mysql_query("CREATE TABLE tabel ( var1 VARCHAR(255), var2
VARCHAR(255) )");
mysql_query("INSERT INTO tabel VALUES ('$var1', '$var2')");
$res = mysql_query("SELECT var1 FROM tabel WHERE var1 LIKE var2");
mysql_query("DROP TABLE tabel");
return mysql_num_rows($res);
}

if (ligner("Det her er virkelig smart", "Det her er idiotiskt"))
print "Tak Bertel";

?>

Hvad skulle vi dog gøre uden pensionister, der ikke har andet at lave
end at uddanne sig til datamatikere...



Tank (23-06-2007)
Kommentar
Fra : Tank


Dato : 23-06-07 01:01

On Jun 15, 5:23 pm, "EnjoyNews" <mh-nyhe...@mail.dk> wrote:
> Hej
>
> Hvordan finder man ud af om to variable ligner næsten hinanden.
> Altså hvis jeg skriver IF($var1 = = $var){echo 'Korrekt';}
> Men det er jo kun hvis de er 100% ens.
>
> Hvis nu der er lavet en stave fejl i den ene så $var1 = 'Der Var Engang' og
> $var2 = 'Der ar Enganh'
> Kan man så ikke få den til at se at de er måske 85% ens og så sætte en
> grænse på ex. 70% og hvis de er mere end 70% ens så skal den godkendes.
>
> Håber nogle har en god idet.

http://dk2.php.net/manual/en/function.levenshtein.php

Kig på den første kommentar. Den fungerer rigtig godt og du kan få de
procenter du selv nævnte.

Venlig Hilsen
Dan


Søg
Reklame
Statistik
Spørgsmål : 177549
Tips : 31968
Nyheder : 719565
Indlæg : 6408820
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste