Создайте облако слов из текста


12

Код должен брать текст из стандартного ввода:

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

Выходными данными должен быть файл PNG, содержащий облако слов, соответствующее этому тексту:

введите описание изображения здесь

Выше слово облако было создано с помощью специализированного интернет - приложения и фильтруется слово Theи другие общие слова ( of, is, and, not, и the). Поскольку это кодовый гольф, общие слова не будут фильтроваться, и я оставляю вторичную эстетику облака слов на выбор каждого кодера. В отличие от приведенного здесь изображения, никакие слова не должны быть исключены, обычные или нет. Определение слова определено ниже.

В этом случае слово является чем-то буквенно-цифровым; числа не действуют как разделители. Так, например, 0xAFквалифицируется как слово. Разделителями будут все, что не является буквенно-цифровым, включая .(точка) и -(дефис). Таким образом i.e.или pick-me-upприведет к 2 или 3 слова, соответственно. Должен быть чувствительным к регистру - Thisи thisбудет состоять из двух разных слов, 'также будет разделителем wouldnи tбудет состоять из двух разных слов wouldn't.

Теги должны быть сгруппированы, но не перекрываться, а размер шрифта должен быть прямо пропорционален количеству вхождений этого слова в текст. Слово должно появиться только один раз. Определенный цвет шрифта не требуется в этом случае. Семантическая ассоциация не является обязательной.

Подсказка - этот другой код гольф может помочь: считать слова в тексте и отображать их


Пожалуйста, объясните, что вы считаете облаком слов . Также я не понимаю ваши выходные определения. Можете ли вы уточнить, что вы подразумеваете под выводом, должен быть напечатан с новой строкой после каждого символа ?
Говард

3
Образец изображения не соответствует требованиям. Это также создает вопрос о том, сколько раз каждое слово должно появиться в облаке, но вы нигде не отвечаете.
Питер Тейлор

2
@TimSeguine Я не думаю, что представления кода-гольфа имеют какую-либо возможность повторного использования ...
Wander Nauta

1
@TimSeguine Законная забота, но зачем она мне нужна, когда для этого есть множество бесплатных приложений.
Эдуард Флоринеску

1
Ваше слово облако создатель также , кажется, фильтруют of, is, and, not, и the.
Дверная ручка

Ответы:


7

Пример вывода

Python 3, 363 308 293 274 символа

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

Назовем это так: python cloud.py file.txt. Сценарий использует fdpгенератор графов принудительной направленности Graphviz для генерации изображения (он выдает файл GraphViz в файл file.txt.dot и файл изображения PNG в файл file.txt.png). Это означает, что вам нужно установить Graphviz.

Изображение выше - это облако, которое он создает из шекспировского «Гамлета» - вы можете сказать, поскольку оно содержит «быть или не быть». Также есть какая-то восхитительная ерунда:

Для нас с тобой Хам Не, о, господин, у нас, что теперь ...


Возможно, вам придется настроить константу /5в строке от второй до последней в зависимости от размера вашего текста. 5 хорошо работает для текстов размером с Гамлета, 500 для ввода длины Библии и так далее.
Бродить Наута

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 демо

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

введите описание изображения здесь


Вы уверены, что это создает файл PNG?
manatwork

Теперь это делает !!!
rafaelcastrocouto

1
Что касается игры в гольф, эта сокращенная версия, кажется, делает это в 360 символов: pastebin.com/C4dpYLP8
manatwork

3
... 296 символов: pastebin.com/5BUPavYH
Матье Родик,

1
Я также собираюсь играть в гольф еще больше в 405 байтов. Попробуй это здесь!
Хайкам
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.