Ord spotter

Tags:    php

Hej.

Jeg har en lille idé til en ord spotter, som skal bruges til fx. At fange ord som bandeord, eller sexuelle ord.

Jeg har ikke lavet scriptet så det virker endnu, det er mere en idé til andre, som vil have den slags "beskyttelse" på deres site.

Det kunne være noget lign flg: (Som sagt virker den ikke!!!)
Fold kodeboks ind/udPHP kode 


Man skal dog nok ligge lidt energi i at få den til at køre rigtigt, fx. skulle det hele nok laves om til en funktion eller klasse, så der kan skiftes imellem bandeord og sexual indhold, eller begge sammentidigt.

Input er som man nok har set $text, og der hvor der står print true og false kan man jo lave en insert query, også lave en liste over hvilken poster der indholder inten bandeord, sexual indhold, eller andet.

Et lille simpelt system, der naturligvis kræver at man har de rigtige ord at arbejde med.
Jeg overvejer sammen tidigt at lave et ord register over bandeord og sex-indhold i sql.

Bare det jeg lige ville dele.

Giv gerne din mening til kende, og fortæl hvordan du eventuelt ville bruge idé'en hvis du vil tage scriptet i brug.

Mvh. Danni.



Tag nu følgende scenarie:
Jeg skriver en kommentar på din hjemmeside, og trykker på send knappen.
Kommentaren sendes og tekstens input går i gennem din funktion.
Funktionen looper igennem et usorteret array for at finde ordet 'fuck'.
Ordet 'fuck' forekommer som det sidste element i dit array
Jeg har tilfældigvis skrevet ordet fuck 10 gange i hele min besked.
Funktionen vil nu køre løkken til ende hver eneste gang, ordet fuck forekommer. Desuden vil funktionen køre hele løkken igennem hvis et 'bandeord' ikke forekommer.

Dette vil altså gøre at hvis jeg har et array med lad os sige 100 bandeord, så skal jeg køre min løkke 100 gange for hvert ord i min besked. Lad os så sige at jeg har skrevet 100 ord i min besked og ingen af dem er bandeord, så vil den lede 100 * 100 gange, altså 10000 gange på hvert ord i dit array.

Min pointe er at arbejder du med meget data, så er det ofte en god ide at foretage søgninger efter søge algoritmer der er kendte og meget brugte. Jeg kunne f.eks. godt for dette scenarie jeg har opstillet her anbefale at bruge en søge algoritme der hedder binær søgning.

Binær Søgning
Binær søgning er en algoritme der tager begynder sin søgning i midten af et sorteret array. Grunden til at det skal være sorteret er at man så med den binære algoritme tjekker om input ligger i den større halvdel, eller mindre halvdel af arrayet, og herefter har man allerede udelukket halvdelen af ens data.

Et eksempel kunne være:

- Jeg har følgende array [5, 1, 8, 3, 0, 2, 6, 2, 9, 4, 8]
- Først skal arrayet sorteres, så det ser således ud [0, 1, 2, 2, 3, 4, 5, 6, 8, 8, 9]
- Herefter kan vi begynde søgning. Lad os sige at vi gerne vil finde tallet 9 i vores array
- Algoritmen starter nu i midten af vores sorterede array, hvilket er ved tallet 4 (index 5).
- Herefter tjekker vi om 9 er mindre end 4, dette er falskt, så derfor må vores element ligge i den højere halvdel af vore array.
- Vores resterende array ser således ud - [5, 6, 8, 8, 9]
- Herefter gør vi processen om igen, og tjekker om vores input (9) er mindre end vores midterste element, som er 8. Dette er falskt og vores element må altså ligge højere oppe i vores array.
- Vores resterende element hedder [8, 9], og den tager nu en af de to resterende, f.eks. vores 2 element (som er 9 tallet), og den laver nu tjekket igen.
- Den finder nu ud af at elementet matcher følgende element og vi har derfor fundet det vi ledte efter. Vores søgning slutter nu.

Det smarte ved dette er at vi istedet for at skulle lede et array igennem ord for ord, så kan vi i stedet fra starten af halvere problemet. Vi kan altså allerede fra første hug halvere antallet af ord der skal tjekkes. Hvis vi derfor havde 100 ord vi skulle gennemtjekke, kunne vi med den binære metode nå et maximum på syv tjek, altså syv gange vi skulle lave vores algoritme, i stedet for 100 gange, hvis vi så havde 100 ord at tjekke, ville vi derimod nu kun skulle lave tjekkende højst 700 gange, frem for 10000 gange. Dette er jo i sig selv en massiv forbedring.

Bemærk at dette eksempel var med tal, men du kan selvfølgelig også sortere ord i alfabetisk rækkefølge.

Man kan sige at hvis du kun arbejder med 10 ord i dit array, vil binær søgning måske ikke forbedre tiden markant, da selve algoritmen jo også tager lidt tid at køre, men hele pointen er bare at jeg syntes at du skulle prøve at forbedre dit script, til at blive så hurtigt, men også indholdsrigt som overhovedet muligt, og så selvfølgelig lægge det hele ind i en metode i en klasse, så den kan bruges nemt af andre.

Håber at det satte dine tanker i gang om at forbedre dit script.



Eller noget i retning af dette:
$sex_content = array("sex", "knep");
if(preg_match('/\b('.implode('|',).')\b/gi', $matches, PREG_SET_ORDER) > 0){
print true; //Fandt noget
} else {
print false; //Fandt intet
}



Hvis det var mig ville jeg lave et index over hvilke bogstaver du har "forbudte ord" med. Altså hvis du har "sex" og "knep" som "forbudte ord" så skal du sortere dit array og fjerne de ord der starter med andet end "s" og "k".
Så har du selvfølgelig lister fordelt på bogstaver, således at når du finder et ord med "s", leder du listen af forbudte ord igennem du ved der starter med "s".
Jeg kender ikke PHP så ved ikke hvordan dette skulle laves, men i må vel også ha mulighed for at have noget dictionary objekt således man kan slå op på "s" og få en liste som en ordbog.
Hvert ord kan så også have en type der beskriver om det er bandeord eller sexord, eller hvad det er (i tilfælde af du skal bruge det til noget specifikt senere siden du har opdelt det sådan)



Hej Martin.

Lækkert input du kom med der, og det kan altid bruges :) Og det sætter hvertfald tankegangen igang :)

---

Laurits du kommer også med et fint forslag, men, jeg tror jeg hægter mig ved Martins idé/forslag. :)



t