2007-02-18

Wolkige Worte

Vermutlich sind die meisten schon mal über sogenannte "Tag Clouds" gestolpert. Wenn nicht: Flickr hat ein ziemlich gutes Beispiel. Dabei handelt es sich um ein recht intuitives Verfahren, Begriffe und ihre relativen Häufigkeiten z.B. innerhalb einer Website übersichtlich darzustellen. Natürlich musste ich ausprobieren, ob ich sowas nicht auch für mein Blog hinbekomme. Eine klassische tag-basierte Auswertung wäre aber in diesem Fall nicht so spannend gewesen, da die Anzahl der von mir verwendeten tags (bei mir "Kategorien") recht überschaubar ist, und die zugehörige Statistik von Blogger sowieso schon erstellt wird. Aber vielleicht verstecken sich ja im Volltext meiner Beiträge irgendwelche Tendenzen, von denen ich bisher selber nichts geahnt habe. Da es Tag Clouds sowieso nicht mit richtigen Text-Analyse- und Data-Mining-Techniken aufnehmen können, wie sie etwa im Projekt "Wortschatz" der Universität Leipzig demonstriert werden, fand ich es gerechtfertigt, mit einer recht einfachen Heuristik für die Erstellung meiner Wort-Wolke anzufangen. Nachbessern kann man ja immer noch. Das Ergebnis ist nun in der Navigationsleiste meines Blogs zu sehen. Zumindest, wenn man es direkt liest, und nicht über einen RSS-Reader. Und wenn man einen geeigneten Browser verwendet. Firefox und Opera stellen die Wort-Wolke korrekt dar, der Internet Explorer leider nicht. Und die von ihm angezeigte "Fehlermeldung" (die Anführungszeichen sind noch geschmeichelt) trägt nicht im geringsten dazu bei, die Ursache dafür zu finden. Zunächst wollte ich die Auswertung durch ein CGI-Skript machen lassen, das die Wort-Wolke generiert hätte. Das Problem war, das Ergebnis einzubinden. Egal, ob dies über einen inline frame oder per object-Element erfolgt wäre, man hätte im Voraus die Größe der Wolke kennen müssen. Die Methode, per JavaScript die Größe nachträglich anzupassen, gefiel mir überhaupt nicht. Das Ergebnis des CGI-Skripts per XMLHttpRequest (also Ajax) einzubinden, scheiterte an der Same Origin Policy von JavaScript. Also blieb als einzige Möglichkeit, die Sache komplett in JavaScript und Client-seitig zu realisieren. Dabei wird Ajax verwendet, die Rohdaten für die Auswertung zu holen, nämlich einfach den oben schon erwähnten RSS-Feed. Derzeit ist die Verarbeitung nicht ganz so elegant, wie ich mir das gewünscht hätte. Vor allem analysiere ich den reinen Text, und verwende nicht die XML-Struktur der RSS-Daten. Dadurch geht mir z.B. die Verknüpfung eines Begriffs zu seinem Artikel verloren. Daher verweisen die in der Wolke angezeigten Begriffe auf die Suchfunktion von Blogger. Warum dann bei einer Suche auch Artikel angezeigt werden, in denen der Begriff garnicht vorkommt, kann ich aber nicht sagen. Für einen ersten Versuch kann ich aber mit dem Ergebnis leben. Ein kleiner Vorteil ist, dass man die Lösung durch drei Zeilen HTML-Code in jedes andere Blogger-Blog einbauen könnte. Aber es gibt noch diverse Stellen, die verbessert werden müssten. Derzeit werden nur freistehende Worte berücksichtigt, die also rechts und links von Leerzeichen umgeben sind. Dadurch gehen natürlich vor allem Worte in Überschriften verloren, die direkt hinter einem öffnenden Tag stehen. Dann könnten Variationen von Worten zu Wortstämmen zusammengefaßt werden. Ich könnte mir vorstellen, über den longest common prefix die meisten Pluralformen herausfiltern zu können. Optimal wäre es natürlich, Begriffe identifizieren zu können, die aus mehreren Worten zusammengesetzt sind. Das bei mir recht häufig vorkommende "Google Maps" wird in "Google" und "Maps" zerlegt. Derzeit kann ich aber nicht abschätzen, ob das gleichzeitig in JavaScript und halbwegs performant realisiert werden kann. Update: Was verlasse ich mich auch auf die Angaben von SELFHTML bezüglich der Funktion split? Ein Blick in die Spezifikation zeigt, dass man sehr wohl eine regular expression zur Trennung eines Strings verwenden kann. Und wenn man dann noch ein wenig bastelt, dann werden auch die Umlaute mitgenommen. Die Wort-Wolke sollte jetzt etwas realistischer sein. Das Problem mit den Wort-Varianten besteht aber nach wie vor.

Kommentare:

Steve hat gesagt…

Hi Örn,

das ist ja beeindruckend. Ich hätte vorher nicht gedacht, dass eine Tag-Wolke so erstaunlich gut funktioniert. Glückwunsch!

Schönen Gruß, Steve

spiegeleule hat gesagt…

hi, ich möchte meine labels in meinem blog auch durch eine wolke anzeigen lassen, habe dazu aber nur eine englische anleitung gefunden. kannst du mir weiterhelfen, bitte. sieht nämlich toll aus bei dir ;D

Örn hat gesagt…

Genaugenommen sind das nicht meine Labels, sondern die am häufigsten vorkommenden Worte im Volltext. Da ich nicht sooooo viele Labels verwende, wäre das relativ langweilig geworden. Aber ich muss bei Gelegenheit die Liste der herauszufilternden Worte mal wieder anpassen...

Dafür kann man meine Lösung bei Blogger relativ leicht einbinden: In den Einstellungen unter "Vorlage" und "Seitenelemente" ein Element "HTML/JavaScript" einfügen, und dort

<div id="tagcloud" style="width: 66%; text-align: center;">
<script src="http://www.oe-files.de/tagcloud/tagcloud.js" type="text/javascript"></script>
</div>

eintragen. Das ist alles.

insertissimo hat gesagt…

ich würde gerne dein kompletter Tagwolken Skript haben, stellst du den zur Verfügung?

meine Adresse: inseratissimo(at)bluewin.ch

Danke und Gruss

http://www.inseratissimo.ch

inseratissimo hat gesagt…

Danke erstmals für die Zustellung des Codes!

Dieser verursacht leider bei IE in der Statusleiste eine Fehlermeldung, bei Safri und Firefox geht es aber.
Kannst du mir bitte noch sagen, ob und wie man die Anzahl der anzuzeigenden Wörter begrenzen kann?

Nochmals vielen lieben Dank

http://www.inseratissimo.ch

Örn hat gesagt…

Wenn Sachen von mir in IE nicht laufen, dann ist das erstmal Pech. Wenn es einen einfachen und offensichtlichen Workaround gibt, dann baue ich den gerne ein. Aber wenn sich IE noch nicht einmal die Mühe macht, die Stelle und die Art des Fehlers halbwegs brauchbar zu beschreiben, dann tun mir dieser Browser und alle seine Verwender leid. Es gibt reichlich Alternativen, die sich an gängige Standards halten.

Die einzige Begrenzung der Wortliste im derzeitigen Code besteht darin, dass ein Wort mehr als dreimal vorkommen muss:

if (uwords[sortuwordslist[i]] > 3) {

Man kann diese Zahl natürlich einfach verändern. Ein anderes Verfahren (z.B. "nur die 30 meistverwendeten Begriffe werden angezeigt") könnte man auch nehmen, man müsste es eben nur programmieren.

inseratissimo hat gesagt…

ok ok
ich benutze ja selber Safari (Mac) oder manchmal Firefox!
Aber es wäre schon gut, wenn es barrierefrei wäre.

Zur stopwordslist:
ist deren Funktion dafür da, dass gewisse Wörter nicht in der Wolke erscheinen?
Wenn ja, geht das auch nicht, denn obwohl Wörter eingetragne, Erscheinen sie trotzdem...

Dein Script ist ansonsten genau dass was ich schon lange gesucht habe, schade nur, dass es noch einwenig Bugi ist. Würde gerne helfen es weiter zu entwickeln, aber bin leider im Programmieren eine grosse Null.
http://www.inseratissimo.ch

Örn hat gesagt…

Sorry, aber barrierefrei hat nicht das geringste mit "wir unterstützen jeden nicht-Standard-konformen Browser auf Biegen und Brechen" zu tun. Genaugenommen ist es sogar das Gegenteil: Die oberste Regel für barrierefreies Design ist es, sich an Standards wie XHTML, CSS und ECMAScript zu halten.

Mir ist klar, dass Du als Anbieter eines kommerziellen Angebots schlecht 80% aller potentiellen Kunden beschimpfen kannst, sie hätten sich für den falschen Browser entschieden - ich kann mir diesen Luxus erlauben. Oder andersrum formuliert: Ich kann mir keinen professionellen Web-Designer leisten, der die Schwächen von IE kennt und weiß, wie man um sie herumprogrammiert.

Was die stopwords angeht: Bei mir funktioniert die Liste, d.h. diese Worte werden herausgefiltert. Schick mir mal per Mail einen Link zu Deinem JavaScript.

Anonym hat gesagt…

Das kann ich so hier nicht stehen lassen!
Ich will dir noch sagen, dass ich keinen "Anbieter eines kommerziellen Angebots" bin!
Bei mir ist das Einstellen der inserate komplett kostenlos, ich verdiene, wenn man es so sagen kann einwig mit den
Banner! (Das reicht zur Zeit nicht einmal um die laufenden Betriebskosten rein zu holen!
Die Seite basiert auf einem komerzielen Script, dass ich einweig umgekrempelt habe..

so das war es von mir..
bye

Larissa hat gesagt…

Ciao Örn
könntest du mir auch dein script zustellen?
blaser(dot)larissa(ät)gmx.ch

vielen lieben Dank
Larissa

Larissa hat gesagt…

hi
ich habe es nun selber gesehen wie ich dein script downloaden kann!

Eine Frage habe ich da aber noch. Gib es eine Möglichkeit, dass die generierten Tags nicht Alphabetisch sortiert angezeigt werden? Ich hätte sie gerne willkürlich durcheinander (ich liebe das Chaos)

Danke dir