Algorithme pour implémenter un nuage de mots comme Wordle


201

Le contexte

Mes questions

  • Existe-t-il un algorithme qui fait ce que fait Wordle?
  • Si non, quelles sont les alternatives qui produisent des types de sortie similaires?

Pourquoi je demande

  • juste curieux
  • vouloir apprendre

1
Il existe une implémentation alternative, basée sur le traitement d'image ici . Pas très rapide, mais très flexible et bon pour l'expérimentation. (Il existe une implémentation complète donnée dans Mathematica.)
Szabolcs

2
J'ai trouvé mon propre algorithme (assez simple) et j'ai blogué à ce sujet . Il est écrit en Python et devrait être facile à personnaliser. J'ai essayé de le rendre à mi-chemin efficace. ! entrez la description de l'image ici
Andreas Mueller

4
J'ai vraiment aimé la façon dont vous avez posé cette question! +1
kolistivra

Réponses:


472

Je suis le créateur de Wordle. Voici comment fonctionne réellement Wordle:

Comptez les mots, jetez les mots ennuyeux et triez par ordre décroissant. Conservez les N premiers mots pour certains N. Attribuez à chaque mot une taille de police proportionnelle à son nombre. Générez une forme Java2D pour chaque mot, à l'aide de l'API Java2D.

Chaque mot "veut" être quelque part, comme "à une position x aléatoire au centre vertical". Dans l'ordre décroissant de fréquence, procédez comme suit pour chaque mot:

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

C'est tout. La partie difficile consiste à effectuer efficacement les tests d'intersection, pour lesquels j'utilise la mise en cache du dernier hit, des boîtes de délimitation hiérarchiques et un index spatial à quatre arbres (qui sont des choses que vous pouvez en savoir plus avec une recherche Google assidue).

Edit: Comme l'a souligné Reto Aebersold, il y a maintenant un chapitre de livre, disponible gratuitement, qui couvre ce même territoire: Beautiful Visualization, Chapter 3: Wordle


22
"Googler Diligent". Like it :)
zengr

6
Plus d'informations ici: static.mrfeinberg.com/bv_ch03.pdf - Merci Jonathan.
Reto Aebersold

Merci pour l'info Jonathan - Je suis fasciné par des algorithmes vraiment simples qui peuvent créer de superbes visualisations comme celle-ci.
John Patrick

Je suis toujours un peu perplexe sur la partie "veut être quelque part". La position initiale des mots est-elle vraiment aléatoire?
adib

30
la beauté de SO..la personne dont vous posez des questions sur le travail, pourrait en fait répondre à votre question!
Arnab Datta

33

Voici un très bon javascript de Jason Davies qui utilise d3. Vous pouvez même utiliser des polices Web avec lui.

Démo: http://www.jasondavies.com/wordcloud/

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


Il est très facile de simplement copier les fichiers src = ". Js" et de les télécharger à nouveau pour les construire ou les utiliser tels quels. Merci pour le partage et fonctionne très bien!
Michael d

Existe-t-il un moyen de changer la palette de couleurs en quelque chose de plus esthétique? J'ai essayé de modifier le fichier js de l'appel JSON à partir de: colourlovers.com/api/palettes/random en colourlovers.com/api/palettes/top comme le recommande l'API des colourlovers mais la palette est restée la même.
Michael d

Voici un exemple de travail réactif basé sur la démo mais avec un contrôle total sur les mots et la couleur. Pour une palette de couleurs personnalisée, utilisez plutôt le code commenté. jsbin.com/kiwojayoye/1/edit?html,js,output
Martin Braun

33

J'ai implémenté un algorithme tel que décrit par Jonathan Feinberg en utilisant python pour créer un nuage de tags. Il est loin des beaux nuages ​​de wordle.net mais il vous donne une idée de la façon dont cela pourrait être fait.

Vous pouvez retrouver le projet ici .


Merci d'avoir partagé! Je regarderai certainement votre implémentation.
namenlos

C'est génial. Merci!
tokudu

Le lien (labs.atizo.com) est à nouveau rompu. Vous devriez vraiment poster un exemple d'image ou deux afin que nous puissions voir la comparaison.
smci

@RetoAebersold existe-t-il de toute façon d'intégrer ce code avec le framework flask ou django?
Mitul Shah

30

J'ai créé un composant Silverlight qui utilise l'algorithme que Jonathan suggère ici. Le code source et les exemples de projets sont tous disponibles sur mon blog:

http://whydoidoit.com

Nuage de mot de couleur

Mon nuage vous permet de colorer et de dimensionner les mots en fonction de différentes pondérations et prend en charge la sélection de mots (à partir d'une coordonnée) et la mise en surbrillance des mots sélectionnés. Vous pouvez utiliser la source comme bon vous semble.

Exemple de nuage de mots


2
Votre blog semble vide. Le lien est-il mort?
OR Mapper

Voici l'instantané archive.org, web.archive.org/web/20110820202717/http://whydoidoit.com/… J'ai également trouvé le projet sur github github.com/whydoidoit/WordCloud
CJK

14

Je travaille sur WordCram , une bibliothèque de traitement pour créer des nuages ​​de mots. Il est assez fortement influencé par Wordle et est informé par le même fichier PDF lié à ce qui précède. Il gère la détection de collision pour vous et vous permet de vous concentrer sur la façon dont vous souhaitez que vos mots soient disposés, colorés, tournés, etc.


Votre service propose-t-il une API?
bart

Désolé, WordCram n'a pas d'API. C'est une bibliothèque, pas un service.
Dan Bernier


8

Je cherchais une visualisation de type wordle qui permettrait d'attribuer la couleur, la position initiale et la taille d'une chaîne liée à d'autres données, telles que la pertinence dans un texte - je n'ai rien trouvé, mais grâce aux informations que j'ai trouvées ici (Surtout l'explication de Jonathan et le lien d'Aeby), j'ai enfin pu implémenter ' Cloudio ', qui se rapproche relativement de wordle (du moins je le pense ...) et offre les fonctionnalités que je cherchais.

Il est implémenté avec SWT et JFace, et j'ai essayé de l'intégrer dans le modèle MVC de JFace, de sorte que vous pouvez définir des fournisseurs de contenu et d'étiquettes pour modifier la disposition d'un cloud et l'ajouter à d'autres plug-ins Eclipse ou RCP applications. Vous pouvez également modifier la façon dont la position initiale d'une chaîne est calculée, de sorte qu'il n'est pas difficile de l'utiliser pour la visualisation de cluster ou autre. Il est toujours mal documenté et limité à certains égards (et j'ai fait le téléchargement initial il y a quelques heures, donc cela pourrait encore être un peu bogué), mais si vous êtes intéressé, voici le lien:

Et voici un lien vers certains nuages ​​créés, au cas où vous voudriez une impression rapide: https://github.com/sschwieb/Cloudio/wiki/Example-Clouds

À la vôtre, Stephan


8

Voir ici mon implémentation de Wordle comme cloud. Il utilise le même algorithme en spirale et la structure de données QuadTree.

http://sourcecodecloud.codeplex.com

ou

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


sourcecodecloud n'est pas téléchargeable, également le deuxième lien ne fonctionne pas
Sagar Nikam

J'ai vérifié le code source / téléchargement du premier lien. Ça a marché. Le deuxième lien a été déplacé. Maintenant corrigé.
George Mamaladze

4

Lion and Lamb est une application iOS open source qui crée des nuages ​​de mots en utilisant les mots les plus fréquents d'un livre choisi de la Bible.

Il est basé sur l'algorithme décrit par Jonathan Feinberg. Les tests de hit utilisent un arbre quadruple, mais les cadres de délimitation sont basés sur le rectangle de délimitation du glyphe. Je souhaite décomposer le glyphe en de nombreux rects de délimitation plus petits pour permettre le placement des mots dans le cadre de délimitation d'un glyphe.

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

Un nuage de mots du livre biblique de l'Apocalypse


4

J'ai ici un générateur de Tag Cloud, que j'appelle Disorganizer :)

Sources TagCloudService et le contrôle de balisage du rasoir et un WinForm à des fins de test que vous pouvez mettre dans votre blog, votre profil, etc., avec un petit wrapper autour. Il utilise fortement l'espace de noms C # 4.0 et System.Drawing.

Je l'ai créé parce qu'avec les autres générateurs de cloud, vous ne pouvez pas cliquer sur les balises pour naviguer et ne pouvez pas créer d'animations en survol, pour montrer qu'elles sont cliquables. Étant donné que l'affichage d'animation de survol en HTML est nécessaire pour moi (je le fais avec des <a>balises superposées et absolument positionnées ), je n'ai pas développé d'affichage de mots sous n'importe quel angle - ils sont verticaux ou horizontaux.

Avertissement: Les liens ci-dessus peuvent devenir invalides dans quelques mois, je prévois de le délier lentement du projet environnant dans un projet distinct.

Vous pouvez voir une démonstration de travail sur cet exemple de billet de blog , mais elle est incomplète et dans un site incomplet. Contactez-moi si quelqu'un veut contribuer, je vais le séparer dès que possible.


Les liens sont devenus invalides. J'aime l'interface utilisateur de votre blog.
Doug S

Merci, juste de les
corriger

2

Voici encore une autre implémentation de bout en bout de wordle en Python 3 largement basée sur le schéma initial de Jonathan Feinberg (QuadTrees, spirales, etc.).

Le code (commenté, avec un fichier ReadMe détaillé) est disponible gratuitement dans ce référentiel Github et c'est un exemple wordle créé avec le code.

Macbeth


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.