Homepagebau
Dateiversion:
diesen Beitrag diskutieren,
ergänzen, eine Frage stellen

Ähnlichkeit zweier Namen berechnen

Schwierigkeit: für Anfänger und Fortgeschrittene

 

Skript downloadenVersion: 10.04.2004


ZIP-Archiv
6 kbyte

Skript ausprobieren

 

Beschreibung:

Sie kennen wahrscheinlich Seiten im Netz, auf denen sie 2 Namen eingeben und die Chancen ausrechnen lassen können, dass die beiden Personen als Paar zusammen passen. In diesem Artikel werden sie erfahren, wie ein solches Scherzprogramm funktioniert. Außerdem können sie sich auch gleich das fertige Skript für ihre eigene Website herunterladen.

Quelltext:

Dieses Programm ist bei uns sowohl für JavaScript, als auch für PHP verfügbar. In diesem Abschnitt wird die JavaScript-Version beschrieben.

Entweder sind sie der Meinung, dass die Personen gut zusammen passen, deren Namen besonders ähnlich sind. Oder aber die Personen, deren Namen sich stark unterscheiden. Für diesen Artikel werde ich die letztere Variante wählen.

Das Eingabeformular wird den Besucher auffordern, seinen eigenen Namen und den Namen des Liebsten einzugeben. Unser Skript erhält also 2 Strings a und b als Eingabe. Wir berechnen nun die "quadratische Summendistanz" dieser beiden Strings. Dieser Wert beschreibt, wie stark sich die Buchstaben des einen von den Buchstaben des anderen Strings unterscheiden. Das heißt, je größer die "quadratische Summendistanz" ist, umso unterschiedlicher sind die beiden Strings.

Zuerst berechnen wir für beide String a und b die Summe ihrer Buchstabenwerte.

Zuerst werden mit der Funktion String.toLowerCase() alle Buchstaben in Kleinschreibung geändert, damit Groß- oder Kleinschreibung für das Ergebnis keine Rolle mehr spielen.

a = a.toLowerCase();
b = b.toLowerCase();

Die Funktion String.charCodeAt(number) liefert den Unicode-Wert des Buchstabens, der sich an der Position "number" befindet. Wir bilden nun die Summe über alle Buchstabenwerte für den String a und den String b.
Weil der Buchstabe "a" den Unicode-Wert 97 hat, ziehen wir die Zahl 96 von jedem Summanden ab. Dadurch erreichen wir eine gewisse Normalisierung des Ergebnisses.

for (i=0; i<a.length; i++) { sum_a += a.charCodeAt(i)-96; };
for (i=0; i<b.length; i++) { sum_b += b.charCodeAt(i)-96; };

Wenn wir nun die Differenz dieser beiden Summen berechnen haben wir ein Maß für die Unterschiedlichkeit der beiden Strings. Das machen wir so:

var differenz = Math.abs(Math.pow(sum_a,2)-Math.pow(sum_b,2));

Die Funktion Math.abs(number) berechnet den Absolutwert der Zahl "number". Mit Math.pow(x, exp) wird die Zahl xexp berechnet.

Es ist allgemein üblich für solche Berechnungen die quadratische Summe zu verwenden. Dadurch erreichen wir zweierlei: erstens ist die Summe niemals negativ und zweitens vergrößern wir den Distanzeffekt zwischen den beiden Werten sum_a und sum_b. Würden wir dies nicht tun, wären die Ergebnisse so, dass sich im Mittel gerade mal zwischen 10% und 50% Differenz zwischen 2 Namen ergeben würden. Das würde bedeuten, dass kaum ein Paar wirklich gut zusammen passt. Ihre Besucher wären aber sicher nicht glücklich darüber, wenn ihr "Liebesdoktor" ständig Hiobsbotschaften verbreiten würde... die Quadrierung, welche wir hier vornehmen, verstärkt aber die Distanz und hebt den Effekt auf. Dadurch haben wir wieder viele glückliche Paare und sogar "Romeo" und "Julia" erreichen immerhin noch satte 35%. (hätten die beiden das vorher gewusst, wäre ihnen sicherlich einiges erspart geblieben...)

Fast fertig: der Unterschied der Strings a und b wurde bereits berechnet. Weil es hübscher ausschaut, soll dieses Ergebnis abschließend noch auf Prozent umgerechnet werden. Um das zu tun, müssen wir den Wert ins Verhältnis zum Maximalwert der Gleichung setzen.

Die größte Differenz wird dann erreicht, wenn die kleinere der beiden quadratischen Summen = 0 ist. In diesem Fall wäre die größere von beiden gleich der Differenz, weil: x - 0 = x. Um die größere der beiden Summen zu bestimmen wird die Funktion Math.max(arg) verwendet. Diese Funktion liefert für eine beliebig lange Liste von Zahlen die größte Zahl als Ergebnis.

var maximum = Math.pow(Math.max(sum_a,sum_b),2);

Umrechnen in Prozent:

var prozent = differenz * 100 / maximum;

Abschließend runden wir das Ergebnis auf 2 Nachkommastellen.

prozent = prozent.toFixed(2);

Die Funktion Number.toFixed(precision) ändert die Darstellung einer Zahl auf die durch den Wert "precision" angegebene Anzahl von Nachkommastellen.

Damit ist das Programm fertig und in der Lage, die Chancen für eine glückliche Beziehung zu bestimmen. Mit ein paar Zeilen Quelltext erhalten sie so ein nettes, kleines Scherzprogramm für ihre Homepage...

 

Dieses Skript darf (wie alle Skripte bei uns) nicht zu kommerziellen Zwecken oder von Firmen sondern lediglich von Privatpersonen für private Homepages und/oder gemeinnützigen Vereinen für deren Webseiten verwendet werden.
Insbesondere untersagt ist jede unerlaubte Weitergabe oder Verkauf!