Crie uma nuvem de palavras a partir de um texto

12

O código deve receber texto da entrada padrão:

The definition of insanity is quoting the same phrase again and again and not expect despair.

A saída deve ser um arquivo PNG que contenha a nuvem de palavras correspondente ao texto:

insira a descrição da imagem aqui

O acima da nuvem da palavra foi criado usando um aplicativo on-line especializada e filtrada a palavra Thee outras palavras comuns ( of, is, and, not, e the). Como se trata de código de golfe, as palavras comuns não serão filtradas e deixo a estética secundária da nuvem de palavras à escolha de cada codificador. Ao contrário da imagem aqui examinada, nenhuma palavra deve ser excluída, comum ou não. A definição de uma palavra é definida abaixo.

Nesse caso, uma palavra é qualquer coisa alfanumérica; números não estão atuando como separadores. Então, por exemplo, 0xAFqualifica-se como uma palavra. Separadores serão qualquer coisa que não seja alfanumérica, incluindo .(ponto) e -(hífen). Assim i.e.ou pick-me-upresultaria em 2 ou 3 palavras, respectivamente. Deve diferenciar maiúsculas de minúsculas - Thise thisseriam duas palavras diferentes, 'também seria um separador wouldne tserão 2 palavras diferentes de wouldn't.

As marcas devem aparecer agrupadas, mas não sobrepostas, e o tamanho da fonte deve ser diretamente proporcional ao número de ocorrências dessa palavra no texto. A palavra deve aparecer apenas uma vez. Cor de fonte específica não é necessária neste caso. A associação semântica não é um requisito.

Dica - Este outro código de golfe pode ajudar: Conte as palavras em um texto e exiba-as

Eduard Florinescu
fonte
Explique o que você considera uma nuvem de palavras . Também não entendo suas definições de saída. Você pode esclarecer o que você quer dizer com saída deve ser impresso com nova linha após cada caractere ?
Howard
3
A imagem de amostra não parece corresponder aos requisitos. Também cria uma pergunta sobre quantas vezes cada palavra deve aparecer na nuvem, que você não responde em lugar algum.
Peter Taylor
2
@TimSeguine Eu não acho que submissões de código-golfe têm qualquer tipo de reutilização ...
Wander Nauta
1
@TimSeguine Preocupação legítima, mas por que eu precisaria disso quando há dezenas de aplicativos gratuitos para fazer isso?
Eduard Florinescu
1
Sua palavra criador nuvem também parece ter filtrado of, is, and, not, e the.
Maçaneta

Respostas:

7

Exemplo de saída

Python 3, 363 308 293 274 caracteres

import os,sys,re,collections as C
c=C.Counter()
n=sys.argv[1]
o="graph d{"
for w in re.findall("\w*",open(n).read()):c[w]+=1
for w,x in c.most_common(75)[1:]:o+="%s[fontsize=%s,shape=none];"%(w,x/5)
open(n+'.dot','w').write(o+"}")
os.system("fdp -Tpng %s.dot>%s.png"%(n,n))

Chamá-lo assim: python cloud.py file.txt. O script usa o fdpgerador de gráfico direcionado à força do Graphviz para gerar a imagem (ele cuspirá um arquivo GraphViz em file.txt.dot e um arquivo de imagem PNG em file.txt.png). Isso significa que você precisará ter o Graphviz instalado.

A imagem acima é a nuvem que faz do Hamlet de Shakespeare - você pode dizer, pois contém "Ser ou não ser". Há também algumas bobagens deliciosas a serem encontradas:

É, para você e eu, o presunto de não que, ó senhor, nos tenha, o que agora ...

Wander Nauta
fonte
Pode ser necessário ajustar a constante /5na penúltima linha, dependendo do tamanho do seu texto. 5 funciona bem para textos do tamanho de Hamlet, 500 para textos bíblicos e assim por diante.
Wander Nauta
5

JAVASCRIPT 473

var wordCloud=function(e){var t=e.split(/[\s-.,;]+/);var n={},r;for(r in t){var i=t[r];n[i]=n[i]+1||1}var s=document;var o=s.createElement("canvas");o.width=600;o.height=400;o.style.display="none";s.body.appendChild(o);var u=o.getContext("2d");var a=0,f=50;for(var i in n){u.font=n[i]*50+"px monospace";u.fillText(i,a,f+n[i]*5);a+=i.length*n[i]*50;if(a>o.width*.6){a=0;f+=n[i]*5+100}}var l=o.toDataURL("image/png");var c=s.createElement("img");c.src=l;s.body.appendChild(c)}

Demonstração ungolfed

wordCloud("string;abc,test-omg shouldn't test omg lalala. s2 s2 s2")

insira a descrição da imagem aqui

rafaelcastrocouto
fonte
Tem certeza de que isso produz um arquivo PNG?
manatwork
Agora faz !!!
Rafaelcastrocouto 21/03
1
Em relação ao golfe, esta versão reduzida parece fazê-lo em 360 caracteres: pastebin.com/C4dpYLP8
manatwork
3
... 296 caracteres: pastebin.com/5BUPavYH
Mathieu Rodic
1
Também vou jogar isso ainda mais em 405 bytes. Experimente aqui!
haykam