| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| Erfahrener Benutzer Registriert seit: 21.07.2003
Beiträge: 340
PHP-Kenntnisse: Fortgeschritten ![]() | [edit] Die fertige PHP Klasse gibts mittlerweile unter folgender Adresse: http://simbo.de/blog/code/php-klasse-tagcloud/ [/edit] Servus miteinander... ich arbeite gerade an einer PHP Klasse, die anhand eines Arrays mit Tags und deren Häufigkeit eine Tag-Cloud erstellen soll. Die minimale und maximale Schriftgröße sollen frei wählbar sein, ebenso die Einheit (px, pt, oder em). Als Formel zur Berechnung der Schriftgröße hab ich zuerst die bei Wikipedia genannte Formel verwendet. http://de.wikipedia.org/wiki/Tag_cloud Mit dem Ergebnis bin ich aber sehr unzufrieden. Ich hätte gerne "weichere Abstufungen". Ich hab auf dieser Seite eine Beschreibung für eine "Logarithmische Verteilung der Schriftgrößen" gefunden: http://www.echochamberproject.com/node/247 Die Graphen dort sehen vielversprechend aus, und ich würde gerne dieselbe Formel verwenden. Leider komme ich aber mit der Beschreibung dort überhaupt nicht zurecht... und Drupal kann ich nicht... Kann mir jemand diese Logarithmische Drupal-Formel in PHP übersetzen? Oder mir zumindest mal in verständlicher Form sagen, wie diese Formel aussieht... Meine Funktion zur Berechnung der Schriftgröße sieht derzeit so aus: Code: function TagCloudFontsizeDistribution( $count, $mincount, $maxcount, $minsize, $maxsize ) {
$s = ( ( ($maxsize-$minsize)*($count-$mincount) ) / ( $maxcount-$mincount ) ) + $minsize;
return round($s,0);
}
Gruß, Simon |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Forenpolitikum Registriert seit: 21.05.2008
Beiträge: 41.251
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | unabhängig von der verlinkten Formel, schau Dir einfach mal die Logarithmuskurve an: http://de.wikipedia.org/wiki/Bild:Log4.png Benutze f = logn(x) mit n>1, begrenze Minimum und Maximum von y mit php's min () und max () Funktionen. Jetzt brauchst Du nur noch die auftretenden Werte linear auf einen bestimmten, begrenzten x Bereich abbilden. Sollte zu schaffen sein. |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 21.07.2003
Beiträge: 340
PHP-Kenntnisse: Fortgeschritten ![]() | Hmm... ...ich hab jedenfalls ne Lösung... Kevin Hoffmann's Whitepaper "In Search of the perfect Tag Cloud" hat mir dabei sehr geholfen. Wen's interessiert: http://dotnetaddict.dotnetdevelopersjournal.com/tw.htm Die dort beschriebene Funktion ist im Grunde genau dieselbe wie auf der Seite des EchoChamberProjects, aber nicht in Pseudo-Programmiersprache... ![]() Wie auch immer... ich hab sie in PHP übersetzt und dabei ziemlich gekürzt... Am Ende kam das dabei raus: Code: function GetTagSizeLogarithmic( $count, $mincount, $maxcount, $minsize, $maxsize ) {
$steps = $maxsize-$minsize;
$delta = ($maxcount-$mincount)/$steps;
while( log($count+2)>log($mincount+$a*$delta+2) && $a<$steps ) $a++;
return $minsize+$a;
}
Falls einer von euch mal in irgendeiner Form ne Tag-Cloud machen will, viel Spaß damit... Die Funktion lässt sich auch z.B. für Farbwerte verwenden. Gruß Simon
__________________ simbo.de |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 21.07.2003
Beiträge: 340
PHP-Kenntnisse: Fortgeschritten ![]() | jo... mittlerweile hat sich die Funktion auch ein wenig weiterentwickelt... Nachdem ich ein bißchen damit rumgespielt hab, stellte ich fest, dass ein fließender Übergang von z.B. 10-24px in 1px-Schritten den Nachteil hat, dass man nicht mehr klar unterscheiden kann, welche Tags nun wie stark gewertet wurden. Also mussten unabhängig von den festgelegten Schriftgrößen Grenzbereiche her. Bei 10-24px also 8 Schriftarten, 7 Schritte Ã* 2px. Den Algorithmus mit der Schleife und den natürlichen Logarithmen hatte ich wie gesagt von Kentbye's Artikel http://www.echochamberproject.com/node/247. Das klang auch alles ganz plausibel (schöne Diagramme ) allerdings hab ich den Pseudo-Code dort nicht richtig verstanden.Dann fand ich http://www.car-chase.net/2007/jan/16...clouds-python/ und http://files.blog-city.com/files/J05...cttagcloud.pdf die meiner Meinung nach von Kentbye abgeschrieben haben aber den Code für mich verständlicher präsentierten. Zum Testen hab ich den den Datensatz von Kentbye's Seite genommen. Jedoch kam ich nie auf das gewünschte Ergebnis. Die Tag-Cloud veränderte sich nur minimal im Vergleich zur linearen Funktion. Und mit meinen Tags von del.icio.us konnte ich auch nicht dieselbe Tag-Cloud wie auf der del.icio.us-Seite anzeigen lassen - die Schritftgrößenverteilung hat einfach nicht gestimmt. Dann hab ich http://blogoforum.com/tag/blogoforum...nued-3294.html gefunden und das hats letztendlich gebracht. Komischerweise konnte ich mit dieser Formel nicht nur die del.icio.us TagCloud nachbilden sondern auch die von Kentbye angeblich mit seiner Formel erstellten Wolke. Und wie ihr seht ohne Schleife: PHP-Code: ![]() |
| | |
| | |
| Forenpolitikum Registriert seit: 21.05.2008
Beiträge: 41.251
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Na siehste. Optimal wäre jetzt noch eine Art Caching, also das Vorhalten der bereits errechneten Werte in einem Array, um zu verhindern, dass für identische Ausgangswerte jeweils die aufwendige Berechnung neu gestartet werden muß. |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 21.07.2003
Beiträge: 340
PHP-Kenntnisse: Fortgeschritten ![]() | Da die Funktion sowieso Teil einer Klasse ist, wäre es kein Problem jeden bereits errechneten Wert für $count in ein Array zu pushen. Aber ist das wirklich nötig? Ich mein, kann man bei so zwei kleinen Logarithmen bereits von aufwändiger Berechnung sprechen? Darf ich einem DualCore-CPU nur Addition/Subtraktion zum Rechnen geben weil er für alles andere zu lange braucht?
__________________ simbo.de |
| | |
| | ||
| Forenpolitikum Registriert seit: 21.05.2008
Beiträge: 41.251
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Kommt darauf an, wie groß die Wolke so wird, wa? Der Logarithmus ist nicht gerade die trivialste Rechenart. Fällt mir gerade auf: Zitat:
| |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Tag Cloud: Daten bereitstellen? | Curanai | Off-Topic Diskussionen | 3 | 23.01.2008 13:19 |
| Pathfinding Algorithmus optimieren? (Algorith. von Dijkstra) | Martin13 | PHP Tipps 2007 | 19 | 04.09.2007 19:20 |
| Bruteforce Algorithmus | aceflow | PHP Tipps 2008 | 4 | 04.09.2007 16:53 |
| Algorithmus für Suchwortrelevanz | tinchen | PHP Tipps 2006 | 3 | 06.12.2006 01:27 |
| Algorithmus, verschlüsselungssystem | notyyy | PHP Tipps 2006 | 7 | 22.08.2006 09:08 |
| Algorithmus für binomische Formeln... | PHP-Fortgeschrittene | 19 | 02.12.2004 09:03 | |
| Algorithmus Bestimmung d. äußeren Polygons im 2D-Punktfeld? | tapferesschneiderlein | Off-Topic Diskussionen | 4 | 31.08.2004 15:12 |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| tag cloud php, php tag cloud, tagcloud php, php tagcloud, tag cloud algorithm, tag cloud algorithmus, clouds in php, tagcloud formel, tagcloud berechnung, tagcloud algorithmus, schriftgrößen berechnung, tag cloud berechnen, tag clouds php, algorithmus tagcloud, tag cloud formel, tagcloud logarithmus, tag-cloud php, berechnung tagcloud, tagcloud schriftgröße, schriftgröße berechnen |

Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.