Bilden Sie eine Wortwolke aus einem Text


12

Der Code sollte Text aus der Standardeingabe übernehmen:

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

Die Ausgabe sollte eine PNG-Datei sein, die die Wortwolke enthält, die diesem Text entspricht:

Bildbeschreibung hier eingeben

Die obige Wortwolke wurde geschaffen , eine spezialisierte Online - Anwendung und gefiltert , um das Wort Theund andere gemeinsame Worte ( of, is, and, not, und the). Da dies Codegolf ist, werden die gebräuchlichen Wörter nicht gefiltert und ich überlasse die sekundäre Ästhetik der Wortwolke der Wahl jedes Codierers. Im Gegensatz zu dem hier gezeigten Bild sollten keine Wörter ausgeschlossen werden, weder allgemein noch anderweitig. Die Definition eines Wortes ist unten definiert.

In diesem Fall ist ein Wort eine alphanumerische Zahl. Zahlen dienen nicht als Trennzeichen. So 0xAFqualifiziert sich zum Beispiel als ein Wort. Trennzeichen sind alle nicht alphanumerischen Zeichen, einschließlich .(Punkt) und -(Bindestrich). So i.e.oder pick-me-upwürde zu 2 oder 3 Wörtern führen. Sollte zwischen Groß- und Kleinschreibung unterscheiden - Thisund thiszwei verschiedene Wörter sein, 'wäre das auch ein Trennzeichen wouldnund würde t2 verschiedene Wörter enthalten wouldn't.

Die Tags sollten gruppiert, aber nicht überlappend angezeigt werden und die Schriftgröße sollte direkt proportional zur Anzahl der Vorkommen dieses Wortes im Text sein. Das Wort sollte nur einmal vorkommen. Eine bestimmte Schriftfarbe ist in diesem Fall nicht erforderlich. Eine semantische Zuordnung ist nicht erforderlich.

Tipp - Dieser andere Code Golf könnte helfen: Zählen Sie die Wörter in einem Text und zeigen Sie sie an


Bitte erläutern Sie, was Sie unter einer Wortwolke verstehen . Außerdem verstehe ich Ihre Ausgabedefinitionen nicht. Können Sie bitte klarstellen, was Sie unter Ausgabe verstehen , die nach jedem Zeichen mit einer neuen Zeile gedruckt werden soll ?
Howard

3
Das Beispielbild scheint nicht den Anforderungen zu entsprechen. Es wird auch eine Frage erstellt, wie oft jedes Wort in der Cloud erscheinen soll, die Sie nirgendwo beantworten.
Peter Taylor

2
@ TimSeguine Ich glaube nicht, dass Code-Golf-Einsendungen wiederverwendbar sind ...
Wander Nauta

1
@TimSeguine Ein berechtigtes Anliegen, aber warum sollte ich es brauchen, wenn es dafür Dutzende kostenloser Apps gibt?
Eduard Florinescu

1
Ihr Wortwolke Schöpfer scheint auch gefiltert zu haben of, is, and, not, und the.
Türklinke

Antworten:


7

Ausgabebeispiel

Python 3, 363 308 293 274 Zeichen

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

Nennen Sie es wie folgt aus : python cloud.py file.txt. Das Skript fdpgeneriert das Bild mit dem erzwungenen Graph-Generator von Graphviz (dabei werden eine GraphViz-Datei in file.txt.dot und eine PNG-Bilddatei in file.txt.png ausgegeben). Dies bedeutet, dass Graphviz installiert sein muss.

Das obige Bild ist die Wolke aus Shakespeares Hamlet - man kann es erkennen, da es "Sein oder Nichtsein" enthält. Es gibt auch einige entzückende Unsinn zu finden:

Für dich und mich ist es der Schinken von Nicht, dass O Herr uns haben, was jetzt ...


/5Je nachdem, wie groß Ihr Text ist, müssen Sie möglicherweise die Konstante in der vorletzten Zeile anpassen. 5 eignet sich gut für Texte in Hamlet-Größe, 500 für bibellange Eingaben und so weiter.
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)}

Ungolfed Demo

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

Bildbeschreibung hier eingeben


Sind Sie sicher, dass dies eine PNG-Datei erzeugt?
Manatwork

Jetzt schon !!!
Rafaelcastrocouto

1
In Bezug auf den Golf, scheint diese verkürzte Version es in 360 Zeichen zu tun: pastebin.com/C4dpYLP8
Manatwork

3

1
Ich werde das auch noch mehr in 405 Bytes Golf spielen. Probieren Sie es hier aus!
Haykam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.