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

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


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


É 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 .


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


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.


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


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


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


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.


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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.