Algoritmo para implementar uma nuvem de palavras como Wordle

201

Contexto

Minhas perguntas

  • Existe um algoritmo disponível que faça o que o Wordle faz?
  • Se não, quais são algumas alternativas que produzem tipos semelhantes de saída?

Por que estou perguntando

  • apenas curioso
  • quero aprender
namenlos
fonte
1
Há uma implementação alternativa, baseada no processamento de imagem aqui . Não é muito rápido, mas muito flexível e bom para experimentação. (Há uma implementação completa dada no Mathematica.)
Szabolcs
2
Eu vim com meu próprio algoritmo (bastante simples) e escrevi sobre ele . É escrito em Python e deve ser fácil de personalizar. Tentei torná-lo meio eficiente. ! digite descrição da imagem aqui
Andreas Mueller
4
Gostei muito da maneira como você fez essa pergunta! 1
kolistivra

Respostas:

472

Eu sou o criador do Wordle. Veja como o Wordle realmente funciona:

Conte as palavras, jogue fora as palavras chatas e classifique pela contagem, descendo. Mantenha as N palavras principais por um número N. Atribua a cada palavra um tamanho de fonte proporcional à sua contagem. Gere um Java2D Shape para cada palavra, usando a API Java2D.

Cada palavra "quer" estar em algum lugar, como "em alguma posição aleatória x no centro vertical". Em ordem decrescente de frequência, faça o seguinte para cada palavra:

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

É isso aí. A parte difícil é fazer o teste de interseção com eficiência, para o qual eu uso o cache de última ocorrência, caixas delimitadoras hierárquicas e um índice espacial de quadtree (todas as coisas sobre as quais você pode aprender mais com alguns investigadores diligentes).

Edit: Como Reto Aebersold apontou, agora existe um capítulo do livro, disponível gratuitamente, que cobre o mesmo território: Beautiful Visualization, Chapter 3: Wordle

Jonathan Feinberg
fonte
22
"Pesquisa diligente". Like it :)
zengr
6
Mais informações aqui: static.mrfeinberg.com/bv_ch03.pdf - Obrigado Jonathan.
Reto Aebersold
Obrigado pela informação Jonathan - Estou fascinado por algoritmos realmente simples que podem criar ótimas visualizações como essa.
22411 John Patrick
Ainda estou um pouco intrigado com a parte "quer estar em algum lugar". A posição inicial das palavras é realmente aleatória?
adib
30
a beleza de SO..a pessoa cujo trabalho você está fazendo perguntas, pode realmente responder à sua pergunta!
Arnab Datta
33

Aqui está um javascript muito bom de Jason Davies que usa d3. Você pode até usar webfonts com ele.

Demonstração: http://www.jasondavies.com/wordcloud/

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

johnpolacek
fonte
É muito fácil copiar os arquivos src = ".js" e recarregá-los para criar ou usar como estão. Obrigado por compartilhar e funciona muito bem!
18746 Michael D
Existe uma maneira de mudar a paleta de cores para algo mais estético? Tentei modificar o arquivo js da chamada JSON de: colourlovers.com/api/palettes/random para colourlovers.com/api/palettes/top como a API dos colourlovers recomenda, mas a paleta permaneceu a mesma.
Michael d
Aqui está um exemplo de trabalho responsivo baseado na demonstração, mas com controle total sobre palavras e cores. Para uma paleta de cores personalizada, use o código comentado. jsbin.com/kiwojayoye/1/edit?html,js,output
Martin Braun
33

Implementei um algoritmo como descrito por Jonathan Feinberg usando python para criar uma nuvem de tags. Está longe das belas nuvens do wordle.net, mas dá uma idéia de como isso pode ser feito.

Você pode encontrar o projeto aqui .

Reto Aebersold
fonte
Obrigado por compartilhar! Definitivamente vou olhar sua implementação.
Namenlos #
Isso é incrível. Obrigado!
21411 tokudu # 03:
O link (labs.atizo.com) está quebrado novamente. Você realmente deve publicar uma imagem de amostra ou duas para que possamos ver a comparação.
SMCI
@RetoAebersold existe alguma maneira de integrar esse código com o framework flask ou django?
Mitul Shah 02/09/16
30

Eu criei um componente Silverlight que usa o algoritmo que Jonathan sugere aqui. O código fonte e os exemplos de projetos estão disponíveis no meu blog:

http://whydoidoit.com

Nuvem de palavras coloridas

Minha nuvem permite colorir e dimensionar palavras com base em diferentes ponderações e suporta a seleção de palavras (a partir de uma coordenada) e o realce de palavras selecionadas. A fonte é sua para usar como achar melhor.

Exemplo de nuvem de palavras

Mike Talbot
fonte
2
Seu blog parece estar vazio. O link morreu?
OU Mapper
Aqui está o instantâneo do archive.org, web.archive.org/web/20110820202717/http://whydoidoit.com/… Também encontrei o projeto no github github.com/whydoidoit/WordCloud
CJK
14

Estou trabalhando no WordCram , uma biblioteca de Processamento para criar nuvens de palavras. É bastante influenciado pelo Wordle e é informado pelo mesmo PDF vinculado acima. Ele lida com a detecção de colisão e permite que você se concentre em como deseja que suas palavras sejam dispostas, coloridas, giradas etc.

Dan Bernier
fonte
Seu serviço oferece uma API?
24514 Bart
Desculpe, o WordCram não possui uma API. É uma biblioteca, não um serviço.
Dan Bernier
8

Eu estava procurando por uma visualização semelhante a uma palavra que permitisse atribuir cor, posição inicial e tamanho de uma String relacionada a outros dados, como a relevância em um texto - não encontrou nada, mas graças às informações que encontrei aqui (Especialmente a explicação de Jonathan e o link de aeby), finalmente pude implementar o ' Cloudio ', que fica relativamente próximo do wordle (pelo menos acho que sim ...) e oferece os recursos que eu estava procurando.

Ele é implementado com SWT e JFace e tentei integrá-lo ao modelo MVC do JFace, para que você possa configurar provedores de conteúdo e rótulo para modificar o layout de uma nuvem e adicioná-lo a outros plug-ins ou RCP do Eclipse. aplicativos. Você também pode modificar a maneira como a posição inicial de uma string é calculada, de modo que não seja difícil usá-la para visualização de cluster ou então. Ele ainda está mal documentado e limitado de algumas maneiras (e eu fiz o upload inicial algumas horas atrás, por isso ainda pode ser um pouco complicado), mas se você estiver interessado, aqui está o link:

E aqui está um link para algumas nuvens criadas, caso você queira uma impressão rápida: https://github.com/sschwieb/Cloudio/wiki/Example-Clouds

Cheers, Stephan

sschwieb
fonte
8

Aqui, veja minha implementação do Wordle como nuvem. Ele usa o mesmo algoritmo espiral e a estrutura de dados QuadTree.

http://sourcecodecloud.codeplex.com

ou

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

George Mamaladze
fonte
sourcecodecloud não é transferível, também segundo link não está funcionando
Sagar Nikam
Eu verifiquei o código-fonte / download do primeiro link. Funcionou. O segundo link foi movido. Agora consertado.
George Mamaladze 15/03
4

Lion and Lamb é um aplicativo iOS de código aberto que cria nuvens de palavras usando as palavras mais frequentes de um livro escolhido da Bíblia.

É baseado no algoritmo descrito por Jonathan Feinberg. O teste de acerto utiliza uma árvore quádrupla, mas as caixas delimitadoras são baseadas no retângulo delimitador do glifo. Eu quero dividir o glifo em várias linhas delimitadoras menores para permitir o posicionamento da palavra na caixa delimitadora de um glifo.

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

Uma nuvem de palavras do livro bíblico de Apocalipse


fonte
4

Eu tenho um gerador de nuvem de tags aqui, que chamo de desorganizador :)

Fontes TagCloudService e o controle de marcação de barbear e um WinForm para fins de teste que você pode colocar em seu blog, perfil etc., com um pequeno invólucro. Ele usa o namespace C # 4.0 e System.Drawing fortemente.

Eu o criei porque, com os outros geradores de nuvem, você não pode clicar nas tags para navegar e não pode criar animações flutuantes, para mostrar que elas são clicáveis. Como mostrar a animação instantânea em HTML é necessária para mim (estou fazendo isso com <a>tags sobrepostas e absolutamente posicionadas ), não desenvolvi a exibição de palavras em nenhum ângulo - elas são verticais ou horizontais.

Aviso: os links acima podem ficar inválidos em alguns meses, pretendo desatá-lo lentamente do projeto ao redor em um projeto separado.

Você pode ver uma demonstração funcional nesta postagem de blog de exemplo , mas está incompleta e em um site incompleto. Entre em contato comigo se alguém quiser contribuir, vou continuar separando o mais rápido possível.

Zasz
fonte
Os links ficaram inválidos. Eu gosto da interface do usuário no seu blog.
Doug S
Obrigado, apenas fixa-los
Zasz
2

Aqui está mais uma implementação de ponta a ponta do wordle no Python 3, amplamente baseada no esboço inicial de Jonathan Feinberg (QuadTrees, espirais etc.).

O código (comentado, com arquivo Leia-me detalhado) está disponível gratuitamente neste repositório do Github e este é um exemplo de wordle criado com o código.

Macbeth

Hayk
fonte
0

Existe uma pequena e agradável biblioteca JavaScript criada por Tim Dream:

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

Ele pode criar uma nuvem de palavras em uma tela ou com tags HTML com muitas opções para modificar o resultado. Ele chega muito perto da saída do wordle.

nr
fonte