Algorithmus zum Implementieren einer Wortwolke wie Wordle

201

Kontext

Meine Fragen

  • Gibt es einen Algorithmus, der das tut, was Wordle tut?
  • Wenn nein, welche Alternativen führen zu ähnlichen Ausgaben?

Warum ich frage

  • nur neugierig
  • möchte lernen
namenlos
quelle
1
Es gibt eine alternative Implementierung, basierend auf Bildverarbeitung hier . Nicht sehr schnell, aber sehr flexibel und gut zum Experimentieren. (Es gibt eine vollständige Implementierung in Mathematica.)
Szabolcs
2
Ich habe mir meinen eigenen (ziemlich einfachen) Algorithmus ausgedacht und darüber gebloggt . Es ist in Python geschrieben und sollte einfach anzupassen sein. Ich habe versucht, es halbwegs effizient zu machen. ! Bildbeschreibung hier eingeben
Andreas Müller
4
Mir hat die Art und Weise, wie Sie diese Frage gestellt haben, sehr gut gefallen! +1
Kolistivra

Antworten:

472

Ich bin der Schöpfer von Wordle. So funktioniert Wordle tatsächlich:

Zähle die Wörter, wirf langweilige Wörter weg und sortiere nach der Anzahl, absteigend. Behalten Sie die oberen N Wörter für einige N bei. Weisen Sie jedem Wort eine Schriftgröße zu, die proportional zu seiner Anzahl ist. Generieren Sie mithilfe der Java2D-API eine Java2D-Form für jedes Wort.

Jedes Wort "will" irgendwo sein, beispielsweise "an einer zufälligen x-Position in der vertikalen Mitte". Führen Sie dies in absteigender Reihenfolge der Häufigkeit für jedes Wort aus:

place the word where it wants to be
while it intersects any of the previously placed words
    move it one step along an ever-increasing spiral

Das ist es. Der schwierige Teil besteht darin, die Kreuzungstests effizient durchzuführen, für die ich Last-Hit-Caching, hierarchische Begrenzungsrahmen und einen räumlichen Quadtree-Index verwende (all dies sind Dinge, über die Sie mit etwas sorgfältigem Googeln mehr lernen können).

Bearbeiten: Wie Reto Aebersold betonte, gibt es jetzt ein frei verfügbares Buchkapitel, das dasselbe Gebiet abdeckt: Schöne Visualisierung, Kapitel 3: Wordle

Jonathan Feinberg
quelle
22
"Fleißiges Googeln". Gefällt
mir
6
Weitere Informationen hier: static.mrfeinberg.com/bv_ch03.pdf - Danke Jonathan.
Reto Aebersold
Vielen Dank für die Info Jonathan - ich bin fasziniert von relativ einfachen Algorithmen, die großartige Visualisierungen wie diese erstellen können.
John Patrick
Ich bin immer noch ein bisschen verwirrt über den Teil "will irgendwo sein". Ist die Anfangsposition von Wörtern wirklich zufällig?
Adib
30
Die Schönheit von SO ... die Person, über deren Arbeit Sie Fragen stellen, könnte Ihre Frage tatsächlich beantworten!
Arnab Datta
33

Hier ist ein wirklich schönes Javascript von Jason Davies, das d3 verwendet. Sie können damit sogar Webfonts verwenden.

Demo: http://www.jasondavies.com/wordcloud/

Github: https://github.com/jasondavies/d3-cloud

Johnpolacek
quelle
Es ist sehr einfach, die src = ". Js" -Dateien zu kopieren und sie erneut hochzuladen, um sie so aufzubauen oder einfach so zu verwenden, wie sie sind. Danke fürs Teilen und funktioniert super!
Michael d
Gibt es eine Möglichkeit, die Farbpalette in etwas Ästhetischeres zu ändern? Ich habe versucht, die js-Datei aus dem JSON-Aufruf von colourlovers.com/api/palettes/random in colourlovers.com/api/palettes/top zu ändern, wie es die API der Farbliebhaber empfiehlt, aber die Palette blieb gleich.
Michael d
Hier ist ein ansprechendes Arbeitsbeispiel, das auf der Demo basiert, aber die volle Kontrolle über Wörter und Farben hat. Verwenden Sie für eine benutzerdefinierte Farbpalette stattdessen den kommentierten Code. jsbin.com/kiwojayoye/1/edit?html,js,output
Martin Braun
33

Ich habe einen von Jonathan Feinberg beschriebenen Algorithmus implementiert, der Python zum Erstellen einer Tag-Cloud verwendet. Es ist weit weg von den schönen Wolken von wordle.net, aber es gibt Ihnen eine Vorstellung davon, wie es gemacht werden könnte.

Das Projekt finden Sie hier .

Reto Aebersold
quelle
Danke für das Teilen! Ich werde auf jeden Fall Ihre Implementierung durchsehen.
Namenlos
Das ist fantastisch. Vielen Dank!
Tokudu
Link (labs.atizo.com) ist wieder defekt. Sie sollten wirklich ein oder zwei Beispielbilder veröffentlichen, damit wir den Vergleich sehen können.
smci
@RetoAebersold gibt es überhaupt eine Möglichkeit, diesen Code in das Flask- oder Django-Framework zu integrieren?
Mitul Shah
30

Ich habe eine Silverlight-Komponente erstellt, die den hier vorgeschlagenen Algorithmus verwendet. Der Quellcode und Beispielprojekte sind alle in meinem Blog verfügbar:

http://whydoidoit.com

Farbwortwolke

In meiner Cloud können Sie Wörter basierend auf unterschiedlichen Gewichtungen einfärben und dimensionieren. Sie unterstützt die Wortauswahl (aus einer Koordinate) und die Hervorhebung ausgewählter Wörter. Die Quelle liegt bei Ihnen, wie Sie es für richtig halten.

Beispiel Word Cloud

Mike Talbot
quelle
2
Ihr Blog scheint leer zu sein. Ist der Link gestorben?
ODER Mapper
Hier ist der Schnappschuss von archive.org, web.archive.org/web/20110820202717/http://whydoidoit.com/… Ich habe das Projekt auch auf github github.com/whydoidoit/WordCloud gefunden
CJK
14

Ich arbeite an WordCram , einer Verarbeitungsbibliothek zum Erstellen von Wortwolken. Es ist ziemlich stark von Wordle beeinflusst und wird durch dasselbe PDF informiert, das oben verlinkt ist. Es übernimmt die Kollisionserkennung für Sie und ermöglicht es Ihnen, sich darauf zu konzentrieren, wie Ihre Wörter angeordnet, gefärbt, gedreht usw. werden sollen.

Dan Bernier
quelle
Bietet Ihr Service eine API an?
Bart
Leider hat WordCram keine API. Es ist eine Bibliothek, kein Dienst.
Dan Bernier
8

Ich suchte nach einer wortähnlichen Visualisierung, mit der Farbe, Anfangsposition und Größe eines Strings in Bezug auf andere Daten, wie z. B. die Relevanz innerhalb eines Textes, zugewiesen werden können. Ich habe nichts gefunden, aber dank der Informationen, die ich hier gefunden habe (Besonders Jonathans Erklärung und Aebys Link), ich könnte endlich ' Cloudio ' implementieren, das Wordle relativ nahe kommt (zumindest denke ich das ...) und die Funktionen bietet, nach denen ich gesucht habe.

Es ist mit SWT und JFace implementiert, und ich habe versucht, es in das MVC-Modell von JFace zu integrieren, sodass Sie Inhalts- und Label-Anbieter so einstellen können, dass sie das Layout einer Cloud ändern und es anderen Eclipse-Plugins oder RCP hinzufügen Apps. Sie können auch die Art und Weise ändern, in der die Anfangsposition einer Zeichenfolge berechnet wird, sodass es nicht schwierig ist, sie für die Clustervisualisierung oder für andere Zwecke zu verwenden. Es ist immer noch schlecht dokumentiert und in gewisser Weise eingeschränkt (und ich habe den ersten Upload vor einigen Stunden durchgeführt, daher ist es möglicherweise immer noch ein bisschen fehlerhaft), aber wenn Sie interessiert sind, hier der Link:

Und hier ist ein Link zu einigen erstellten Clouds, falls Sie einen schnellen Eindruck wünschen: https://github.com/sschwieb/Cloudio/wiki/Example-Clouds

Prost, Stephan

sschwieb
quelle
8

Hier sehen Sie meine Implementierung von Wordle wie Cloud. Es verwendet denselben Spiralalgorithmus und die QuadTree-Datenstruktur.

http://sourcecodecloud.codeplex.com

oder

http://www.codeproject.com/Articles/224231/Word-Cloud-Tag-Cloud-Generator-Control-for-NET-Win

George Mamaladze
quelle
sourcecodecloud kann nicht heruntergeladen werden, auch der zweite Link funktioniert nicht
Sagar Nikam
Ich habe den Quellcode / Download des ersten Links überprüft. Es funktionierte. Zweiter Link wurde verschoben. Jetzt behoben.
George Mamaladze
4

Lion and Lamb ist eine Open-Source-iOS-App, die Wortwolken mit den häufigsten Wörtern aus einem ausgewählten Buch der Bibel erstellt.

Es basiert auf dem von Jonathan Feinberg beschriebenen Algorithmus. Beim Hit-Test wird zwar ein Quad-Baum verwendet, die Begrenzungsrahmen basieren jedoch auf dem Begrenzungsrechteck des Glyphen. Ich möchte die Glyphe in viele kleinere Begrenzungsbereiche aufteilen, um die Wortplatzierung innerhalb des Begrenzungsrahmens einer Glyphe zu ermöglichen.

GitHub: https://github.com/PetahChristian/LionAndLamb

Eine Wortwolke aus dem Bibelbuch der Offenbarung


quelle
4

Ich habe hier einen Tag Cloud Generator, den ich Disorganizer nenne :)

Quellen TagCloudService und das Rasiermesser-Markup-Steuerelement sowie eine WinForm zu Testzwecken , die Sie mit einem kleinen Wrapper in Ihr Blog, Profil usw. einfügen können. Es verwendet stark C # 4.0 & System.Drawing-Namespace.

Ich habe es erstellt, weil Sie mit den anderen Cloud-Generatoren nicht auf Tags klicken können, um zu navigieren, und keine Hover-Animationen erstellen können, um zu zeigen, dass sie anklickbar sind. Da das Anzeigen der Hover-Animation in HTML für mich erforderlich ist (ich mache dies mit überlagerten, absolut positionierten <a>Tags), habe ich keine Wortanzeige in einem beliebigen Winkel entwickelt - sie sind entweder vertikal oder horizontal.

Warnung: Die oben genannten Links können in einigen Monaten ungültig werden. Ich plane, sie langsam vom umgebenden Projekt in ein separates Projekt zu lösen.

Sie können eine funktionierende Demo in diesem Beispiel-Blog-Beitrag sehen , diese ist jedoch unvollständig und befindet sich auf einer unvollständigen Website. Kontaktieren Sie mich, wenn jemand etwas beitragen möchte. Ich werde es so schnell wie möglich trennen.

Zasz
quelle
Links sind ungültig geworden. Ich mag die Benutzeroberfläche in Ihrem Blog.
Doug S
Danke, habe sie gerade behoben
Zasz
2

Hier ist noch eine weitere End-to-End- Implementierung von wordle in Python 3, die weitgehend auf dem ursprünglichen Entwurf von Jonathan Feinberg (QuadTrees, Spiralen usw.) basiert.

Der Code (kommentiert, mit detaillierter ReadMe-Datei) ist in diesem Github-Repository frei verfügbar. Dies ist ein Beispielwort, das mit dem Code erstellt wurde.

Macbeth

Hayk
quelle
0

Es gibt eine hübsche kleine JavaScript-Bibliothek von Tim Dream:

https://github.com/timdream/wordcloud2.js/blob/gh-pages/API.md

Es kann eine Wortwolke auf einer Leinwand oder mit HTML-Tags mit vielen Optionen zum Ändern des Ergebnisses erstellen. Es kommt der Ausgabe von wordle sehr nahe.

nr
quelle