Algoritmo para implementar una nube de palabras como Wordle

201

Contexto

Mis preguntas

  • ¿Hay un algoritmo disponible que haga lo que hace Wordle?
  • Si no, ¿cuáles son algunas alternativas que producen tipos similares de salida?

Por qué estoy preguntando

  • Sólo curioso
  • querer aprender
namenlos
fuente
1
Hay una implementación alternativa, basada en el procesamiento de imágenes aquí . No muy rápido, pero muy flexible y bueno para la experimentación. (Hay una implementación completa dada en Mathematica.)
Szabolcs
2
Se me ocurrió mi propio algoritmo (bastante simple) y escribí en un blog al respecto . Está escrito en Python y debería ser fácil de personalizar. Traté de hacerlo medio eficiente. ! ingrese la descripción de la imagen aquí
Andreas Mueller
44
¡Realmente me gustó la forma en que hiciste esta pregunta! +1
kolistivra

Respuestas:

472

Soy el creador de Wordle. Así es como funciona realmente Wordle:

Cuente las palabras, deseche las palabras aburridas y ordene por la cuenta, descendiendo. Mantenga las N palabras principales para algunos N. Asigne a cada palabra un tamaño de fuente proporcional a su recuento. Genere una forma Java2D para cada palabra, utilizando la API Java2D.

Cada palabra "quiere" estar en algún lugar, como "en alguna posición x aleatoria en el centro vertical". En orden decreciente de frecuencia, haga esto para cada palabra:

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

Eso es. El duro parte es hacer las pruebas de intersección de manera eficiente, para lo cual uso el almacenamiento en caché de último golpe, los cuadros de delimitación jerárquica y un índice espacial quadtree (todos los cuales son cosas sobre las que puede aprender más con un poco de búsqueda diligente).

Editar: como señaló Reto Aebersold, ahora hay un capítulo de libro, disponible gratuitamente, que cubre este mismo territorio: Beautiful Visualization, Capítulo 3: Wordle

Jonathan Feinberg
fuente
22
"Google diligente". Me gusta :)
zengr
66
Más información aquí: static.mrfeinberg.com/bv_ch03.pdf - Gracias Jonathan.
Reto Aebersold
Gracias por la información Jonathan: estoy fascinado por algoritmos realmente simples que pueden crear visualizaciones excelentes como esta.
John Patrick
Todavía estoy un poco perplejo en la parte de "quiere estar en algún lugar". ¿La posición inicial de las palabras es realmente aleatoria?
adib
30
la belleza de SO..la persona sobre cuyo trabajo está haciendo preguntas, ¡en realidad podría responder su pregunta!
Arnab Datta
33

Aquí hay un javascript realmente bueno de Jason Davies que usa d3. Incluso puedes usar webfonts con él.

Demostración: http://www.jasondavies.com/wordcloud/

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

johnpolacek
fuente
Es muy fácil copiar los archivos src = ". Js" y volver a cargarlos para construirlos o simplemente usarlos tal cual. Gracias por compartir y funciona genial!
Michael d
¿Hay alguna manera de cambiar la paleta de colores a algo más estético? Intenté modificar el archivo js de la llamada JSON desde: colourlovers.com/api/palettes/random a colourlovers.com/api/palettes/top como recomienda la API de colourlovers, pero la paleta siguió siendo la misma.
Michael d
Aquí hay un ejemplo de trabajo receptivo basado en la demostración pero con control total sobre las palabras y el color. Para una paleta de colores personalizada, utilice el código comentado. jsbin.com/kiwojayoye/1/edit?html,js,output
Martin Braun
33

Implementé un algoritmo como lo describe Jonathan Feinberg usando Python para crear una nube de etiquetas. Está muy lejos de las hermosas nubes de wordle.net, pero le da una idea de cómo podría hacerse.

Puedes encontrar el proyecto aquí .

Reto Aebersold
fuente
¡Gracias por compartir! Definitivamente examinaré tu implementación.
namenlos
Esto es asombroso ¡Gracias!
tokudu
El enlace (labs.atizo.com) está roto nuevamente. Realmente debería publicar una imagen de muestra o dos para que podamos ver la comparación.
smci
@RetoAebersold ¿hay alguna forma de integrar este código con el marco de matraz o django?
Mitul Shah
30

He creado un componente Silverlight que usa el algoritmo que Jonathan sugiere aquí. El código fuente y los proyectos de ejemplo están disponibles en mi blog:

http://whydoidoit.com

Nube de palabras de color

Mi nube le permite colorear y dimensionar palabras según diferentes ponderaciones y admite la selección de palabras (desde una coordenada) y el resaltado de palabras seleccionadas. La fuente es suya para usarla como mejor le parezca.

Ejemplo de nube de palabras

Mike Talbot
fuente
2
Tu blog parece estar vacío. ¿Ha muerto el enlace?
O Mapper
Aquí está la instantánea de archive.org, web.archive.org/web/20110820202717/http://whydoidoit.com/… También encontré el proyecto en github github.com/whydoidoit/WordCloud
CJK
14

Estoy trabajando en WordCram , una biblioteca de procesamiento para hacer nubes de palabras. Está bastante influenciado por Wordle, y está informado por el mismo PDF aeby vinculado anteriormente. Maneja la detección de colisión por usted y le permite enfocarse en cómo desea que sus palabras sean presentadas, coloreadas, rotadas, etc.

Dan Bernier
fuente
¿Su servicio ofrece una API?
Bart
Lo sentimos, WordCram no tiene una API. Es una biblioteca, no un servicio.
Dan Bernier
8

Estaba buscando una visualización similar a una palabra que permitiera asignar color, posición inicial y tamaño de una Cadena relacionada con otros datos, como la relevancia dentro de un texto, no encontré nada, pero gracias a la información que encontré aquí (Especialmente la explicación de Jonathan y el enlace de aeby), finalmente pude implementar ' Cloudio ', que se acerca relativamente a Wordle (al menos eso creo ...) y ofrece las características que estaba buscando.

Se implementa con SWT y JFace, y traté de integrarlo en el modelo MVC de JFace, de modo que pueda configurar proveedores de contenido y etiquetas para modificar el diseño de una nube y agregarlo a otros complementos de Eclipse o RCP aplicaciones También puede modificar la forma en que se calcula la posición inicial de una cadena, de modo que no sea difícil usarla para la visualización del clúster o de lo contrario. Todavía está poco documentado y limitado de alguna manera (e hice la carga inicial hace unas horas, por lo que aún puede ser un poco defectuoso), pero si está interesado, aquí está el enlace:

Y aquí hay un enlace a algunas nubes creadas, en caso de que desee una impresión rápida: https://github.com/sschwieb/Cloudio/wiki/Example-Clouds

Saludos, Stephan

sschwieb
fuente
8

Aquí puede ver mi implementación de Wordle como la nube. Utiliza el mismo algoritmo espiral y la estructura de datos QuadTree.

http://sourcecodecloud.codeplex.com

o

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

George Mamaladze
fuente
sourcecodecloud no se puede descargar, tampoco funciona el segundo enlace
Sagar Nikam
Verifiqué el código fuente / descarga del primer enlace. Funcionó. El segundo enlace fue movido. Ahora arreglado.
George Mamaladze
4

Lion and Lamb es una aplicación iOS de código abierto que crea nubes de palabras usando las palabras más frecuentes de un libro elegido de la Biblia.

Se basa en el algoritmo descrito por Jonathan Feinberg. La prueba de impacto utiliza un árbol cuádruple, pero los cuadros delimitadores se basan en el rectángulo delimitador del glifo. Quiero dividir el glifo en muchos rectificadores de límite más pequeños para permitir la colocación de palabras dentro del cuadro delimitador de un glifo.

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

Una nube de palabras del libro bíblico de Apocalipsis


fuente
4

Tengo un generador de Tag Cloud aquí, al que llamo Desorganizador :)

Fuentes TagCloudService y el control de marcado de la maquinilla de afeitar y un WinForm para fines de prueba que puede poner en su blog, perfil, etc., con un pequeño envoltorio alrededor. Utiliza C # 4.0 y System. Dibuja mucho el espacio de nombres.

Lo creé porque con los otros generadores de nubes no puede hacer clic en las etiquetas para navegar y no puede crear animaciones de desplazamiento, para mostrar que se puede hacer clic. Dado que mostrar animación de desplazamiento en HTML es necesario para mí (lo estoy haciendo con superposición, posición absoluta<a> etiquetas ) No he desarrollado ninguna visualización de palabras en ángulo: son verticales u horizontales.

Advertencia: los enlaces anteriores pueden dejar de ser válidos en unos pocos meses, planeo desatarlo lentamente del proyecto circundante en un proyecto separado.

Puede ver una demostración en funcionamiento en esta publicación de blog de muestra , pero está incompleta y en un sitio incompleto. Contácteme si alguien quiere contribuir, continuaré separándolo lo antes posible.

Zasz
fuente
Los enlaces se han vuelto inválidos. Me gusta la interfaz de usuario en tu blog.
Doug S
Gracias, solo los arreglé
Zasz
2

Aquí es otra de extremo a extremo implementación de wordle en Python 3 basada en gran medida en el esquema inicial de Jonathan Feinberg (QuadTrees, espirales, etc.).

El código (comentado, con el archivo Léame detallado) está disponible gratuitamente en este repositorio de Github y este es un wordle de muestra creado con el código.

Macbeth

Hayk
fuente