Crea una nuvola di parole da un testo


12

Il codice dovrebbe prendere il testo dall'input standard:

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

L'output dovrebbe essere un file PNG contenente la nuvola di parole corrispondente a quel testo:

inserisci qui la descrizione dell'immagine

Quanto sopra della nube di parola è stato creato utilizzando un'applicazione online specializzata ed è filtrata la parola Thee altre parole comuni ( of, is, and, not, e the). Poiché si tratta di codice golf, le parole comuni non verranno filtrate e lascio l'estetica secondaria della nuvola di parole alla scelta di ciascun programmatore. A differenza dell'immagine qui illustrata, nessuna parola dovrebbe essere esclusa, comune o altro. La definizione di una parola è definita di seguito.

In questo caso una parola è qualunque cosa alfanumerica; i numeri non agiscono come separatori. Quindi, per esempio, si 0xAFqualifica come una parola. I separatori saranno tutto ciò che non è alfanumerico, inclusi .(punto) e -(trattino). Pertanto, i.e.o pick-me-upsi tradurrebbe rispettivamente in 2 o 3 parole. Dovrebbe fare distinzione tra maiuscole Thise minuscole - e thissarebbero due parole diverse, 'sarebbe anche un separatore così wouldne tsaranno 2 parole diverse da wouldn't.

I tag dovrebbero apparire raggruppati ma non sovrapposti e la dimensione del carattere dovrebbe essere direttamente proporzionale al numero di occorrenze di quella parola nel testo. La parola dovrebbe apparire solo una volta. In questo caso non è richiesto il colore del carattere specifico. L'associazione semantica non è un requisito.

Suggerimento : questo altro codice golf potrebbe essere d'aiuto: contare le parole in un testo e visualizzarle


Spiega cosa consideri una nuvola di parole . Inoltre non capisco le tue definizioni di output. Puoi chiarire cosa intendi per output dovrebbe essere stampato con una nuova riga dopo ogni carattere ?
Howard,

3
L'immagine di esempio non sembra corrispondere ai requisiti. Crea anche una domanda su quante volte ogni parola dovrebbe apparire nel cloud, a cui non rispondi da nessuna parte.
Peter Taylor,

2
@TimSeguine Non credo che le presentazioni di code-golf abbiano alcun tipo di riusabilità ...
Wander Nauta

1
@TimSeguine Preoccupazione legittima, ma perché dovrei averne bisogno quando ci sono decine di app gratuite per farlo.
Eduard Florinescu,

1
La tua parola nuvola creatore sembra anche aver filtrato of, is, and, not, e the.
Maniglia della porta

Risposte:


7

Esempio di output

Python 3, 363 308 293 274 caratteri

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

Chiamatela come questo: python cloud.py file.txt. Lo script utilizza il fdpgeneratore di grafici a forza forzata di Graphviz per generare l'immagine (sputerà un file GraphViz in file.txt.dot e un file immagine PNG in file.txt.png). Ciò significa che è necessario disporre di Graphviz installato.

L'immagine sopra è la nuvola che crea di Amleto di Shakespeare - puoi dirlo, poiché contiene "Essere o non essere". C'è anche qualche assurdità deliziosa da scoprire:

È per te e per me, il Prosciutto di Non che il Signore ci abbia, che ora ...


Potrebbe essere necessario modificare la costante /5nella penultima riga in base alla dimensione del testo. 5 funziona bene per i testi di dimensioni di Amleto, 500 per l'inserimento della Bibbia e così via.
Passeggia per Nauta il

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 non golfata

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

inserisci qui la descrizione dell'immagine


Sei sicuro che questo produca un file PNG?
arte

Adesso lo fa !!!
rafaelcastrocouto,

1
Per quanto riguarda il golf, questa versione abbreviata sembra farlo in 360 caratteri: pastebin.com/C4dpYLP8
manatwork

3
... 296 caratteri: pastebin.com/5BUPavYH
Mathieu Rodic,

1
Vado anche a golf questo ancora di più in 405 byte. Provalo qui!
Hayakam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.