Hacer una nube de palabras de un texto

12

El código debe tomar texto de la entrada estándar:

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

El resultado debe ser un archivo PNG que contenga la nube de palabras correspondiente a ese texto:

ingrese la descripción de la imagen aquí

Lo anterior nube de palabras fue creado usando una aplicación en línea especializada y se filtra la palabra They otras palabras comunes ( of, is, and, not, y the). Como se trata de código de golf, las palabras comunes no se filtrarán y dejo la estética secundaria de la nube de palabras a elección de cada codificador. A diferencia de la imagen que se muestra aquí, no se deben excluir palabras, comunes o no. La definición de una palabra se define a continuación.

En este caso, una palabra es cualquier cosa alfanumérica; los números no actúan como separadores. Entonces, por ejemplo, 0xAFcalifica como una palabra. Los separadores serán cualquier cosa que no sea alfanumérica, incluidos .(punto) y -(guión). Por lo tanto, i.e.o pick-me-updaría como resultado 2 o 3 palabras, respectivamente. Debería distinguir entre mayúsculas Thisy minúsculas, y thisserían dos palabras diferentes, 'también sería un separador wouldny tserían 2 palabras diferentes wouldn't.

Las etiquetas deben aparecer agrupadas pero no superpuestas y el tamaño de fuente debe ser directamente proporcional al número de apariciones de esa palabra en el texto. La palabra debería aparecer solo una vez. No se requiere color de fuente específico en este caso. La asociación semántica no es un requisito.

Sugerencia : este otro código de golf podría ayudar: contar las palabras en un texto y mostrarlas

Eduard Florinescu
fuente
Por favor explique lo que considera una nube de palabras . Además, no entiendo sus definiciones de salida. ¿Puede aclarar qué quiere decir con salida debe imprimirse con una nueva línea después de cada carácter ?
Howard
3
La imagen de muestra no parece coincidir con los requisitos. También crea una pregunta sobre cuántas veces debe aparecer cada palabra en la nube, que no responde en ningún lado.
Peter Taylor
2
@TimSeguine No creo que las presentaciones de código de golf tengan ningún tipo de reutilización ...
Wander Nauta
1
@TimSeguine Preocupación legítima, pero ¿por qué lo necesitaría si hay muchas aplicaciones gratuitas para hacerlo?
Eduard Florinescu
1
Su nube de palabras creador también parece haber filtrado of, is, and, not, y the.
Pomo de la puerta

Respuestas:

7

Ejemplo de salida

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))

Llamarlo así: python cloud.py file.txt. El script usa el fdpgenerador de gráficos de fuerza dirigida de Graphviz para generar la imagen (escupirá un archivo GraphViz a file.txt.dot y un archivo de imagen PNG a file.txt.png). Esto significa que necesitará tener Graphviz instalado.

La imagen de arriba es la nube que hace de Hamlet de Shakespeare, se nota, ya que contiene "Ser o no ser". También hay algunas tonterías deliciosas que se encuentran:

Es, para ti y para mí, el jamón de Not que oh señor nos tiene, lo que ahora ...

Wander Nauta
fuente
Es posible que deba ajustar la constante /5en la penúltima línea dependiendo de qué tan grande sea su texto. 5 funciona bien para textos del tamaño de Hamlet, 500 para entradas de longitud bíblica, etc.
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)}

Demo sin golf

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

ingrese la descripción de la imagen aquí

rafaelcastrocouto
fuente
¿Estás seguro de que esto produce un archivo PNG?
manatwork
¡Ahora sí!
rafaelcastrocouto
1
Con respecto al golf, esta versión abreviada parece hacerlo en 360 caracteres: pastebin.com/C4dpYLP8
manatwork
3
... 296 caracteres: pastebin.com/5BUPavYH
Mathieu Rodic
1
También voy a jugar esto aún más en 405 bytes. Pruébalo aquí!
haykam