Créer un nuage de mots à partir d'un texte


12

Le code doit prendre le texte de l'entrée standard:

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

La sortie doit être un fichier PNG contenant le nuage de mots correspondant à ce texte:

entrez la description de l'image ici

Ce qui précède nuage de mot a été créé en utilisant une application en ligne spécialisée et filtre le mot Theet d' autres mots ( of, is, and, notet the). Puisqu'il s'agit de code golf, les mots courants ne seront pas filtrés et je laisse l'esthétique secondaire du nuage de mots au choix de chaque codeur. Contrairement à l'image examinée ici, aucun mot ne doit être exclu, commun ou autre. La définition d'un mot est définie ci-dessous.

Dans ce cas, un mot est quelque chose d'alpha-numérique; les nombres n'agissent pas comme des séparateurs. Ainsi, par exemple, se 0xAFqualifie comme un mot. Les séparateurs seront tout ce qui n'est pas alphanumérique, y compris .(point) et -(trait d'union). Ainsi i.e.ou pick-me-uprésulterait en 2 ou 3 mots, respectivement. Devrait être sensible à la casse - Thiset thisserait deux mots différents, 'serait également séparateur ainsi wouldnet tsera de 2 mots différents de wouldn't.

Les balises doivent apparaître groupées mais ne se chevauchent pas et la taille de la police doit être directement proportionnelle au nombre d'occurrences de ce mot dans le texte. Le mot ne doit apparaître qu'une seule fois. Une couleur de police spécifique n'est pas requise dans ce cas. L'association sémantique n'est pas une exigence.

Astuce - Cet autre code de golf pourrait vous aider: comptez les mots dans un texte et affichez-les


Veuillez expliquer ce que vous considérez comme un nuage de mots . Je ne comprends pas non plus vos définitions de sortie. Pouvez-vous préciser ce que vous entendez par sortie doit être imprimé avec une nouvelle ligne après chaque caractère ?
Howard

3
L'image d'exemple ne semble pas correspondre aux exigences. Cela crée également une question sur le nombre de fois que chaque mot doit apparaître dans le cloud, auquel vous ne répondez nulle part.
Peter Taylor

2
@TimSeguine Je ne pense pas que les soumissions de code-golf aient une quelconque réutilisabilité ...
Wander Nauta

1
@TimSeguine Préoccupation légitime, mais pourquoi en aurais-je besoin alors qu'il existe des dizaines d'applications gratuites pour le faire.
Eduard Florinescu

1
Votre créateur de nuage de mot semble avoir filtré of, is, and, notet the.
Poignée de porte

Réponses:


7

Exemple de sortie

Python 3, 363 308 293 274 caractères

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

Appelez cela comme ceci: python cloud.py file.txt. Le script utilise le fdpgénérateur de graphes forcés de Graphviz pour générer l'image (il crachera un fichier GraphViz dans file.txt.dot et un fichier image PNG dans file.txt.png). Cela signifie que vous devrez installer Graphviz.

L'image ci-dessus est le nuage qu'elle fait du Hameau de Shakespeare - vous pouvez le dire, car il contient "Être ou ne pas être". Il y a aussi de délicieuses absurdités:

C'est, pour Toi et moi, le Jambon de Pas que O seigneur nous a, quoi maintenant


Vous devrez peut-être modifier la constante /5de l'avant-dernière ligne en fonction de la taille de votre texte. 5 fonctionne bien pour les textes de la taille d'un hameau, 500 pour une entrée de longueur biblique, 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)}

Démo non golfée

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

entrez la description de l'image ici


Êtes-vous sûr que cela produit un fichier PNG?
manatwork

Maintenant c'est le cas !!!
rafaelcastrocouto

1
Concernant le golf, cette version raccourcie semble le faire en 360 caractères: pastebin.com/C4dpYLP8
manatwork

3
... 296 caractères: pastebin.com/5BUPavYH
Mathieu Rodic

1
Je vais aussi jouer au golf encore plus en 405 octets. Essayez-le ici!
haykam
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.