Как создать чистое облако слов с помощью pytagcloud без перегруженного изображения — Python

В предыдущем вопросе я спросил сообщество о том, как посчитать частоту каждых двух слов подряд в предложении, и я получил отличный ответ! теперь я пытаюсь построить облако слов из результатов, используя пакет pytagcloud.

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

Мой код ниже. это ссылка текста, который я использовал для теста. Я пытался использовать меньшее количество словосочетаний, но это не изменило скученность текста на картинке.
Я также добавил несколько функций, таких как игра с «макетом» и «размером» и «fontname='Lobster' и fontzoom=1" но ни один из них не дает оптимальных результатов, которые представляют собой чистое изображение облака слов, где слова не переполнены.

import operator
import urllib2

from roundup.backends.indexer_common import STOPWORDS
import requests, collections, bs4
Data = "TEXT FROM The link above- TEXT file"
two_words = [' '.join(ws) for ws in zip(Data, Data[1:])]
wordscount = {w:f for w, f in Counter(two_words).most_common() if f > 12}
sorted_wordscount = sorted(wordscount.iteritems(), key=operator.itemgetter(1))

print sorted_wordscount;

from pytagcloud import create_tag_image, create_html_data, make_tags, LAYOUT_HORIZONTAL, LAYOUTS, LAYOUT_MIX, LAYOUT_VERTICAL, LAYOUT_MOST_HORIZONTAL, LAYOUT_MOST_VERTICAL
from pytagcloud.colors import COLOR_SCHEMES
from pytagcloud.lang.counter import get_tag_counts

create_tag_image(make_tags(sorted_wordscount), 'filename.png', size=(1300,1150), background=(0, 0, 0, 255), layout=LAYOUT_MIX, fontname='Molengo', rectangular=True)

Это пример результатов вывода, которые я получаю: ЗДЕСЬ
Оптимальный результат будет похож на один изображений ЗДЕСЬ


person mongotop    schedule 24.09.2013    source источник


Ответы (2)


Вы сортируете теги по возрастанию, а не по убыванию, как, вероятно, ожидает pytagcloud. Вы должны изменить строку сортировки на:

sorted_wordscount = sorted(wordscount.iteritems(), key=operator.itemgetter(1),reverse=True)

Как только это будет исправлено, ключевым параметром станет maxsize в make_tags:

create_tag_image(make_tags(sorted_wordscount[:],maxsize=200), 'filename.png', size=(1300,1150), background=(0, 0, 0, 255), layout=LAYOUT_MIX, fontname='Molengo', rectangular=True)

Если я правильно понимаю, это устанавливает максимальный размер шрифта (размер тега с наибольшей частотой) и вычисляет все остальные размеры по отношению к этому. Другим параметром, влияющим на распределение строк, является размер окна.

Вам придется поиграть с этими параметрами.

Учтите, что библиотечная функция get_tag_counts делает больше, чем просто возвращает частоту: она также фильтрует общие слова, применяет строчные буквы и в целом должна обеспечивать лучшее распределение тегов, чем простая сортировка, поскольку вы делают.

С этими изменениями вы должны получить что-то вроде этого (получено с помощью get_tag_counts для файла, на который вы ссылаетесь в своем посте, в окне 1000x1000, maxsize = 260 и ограничение до первых 50 тегов):

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

Изменить. В соответствии с запросом код для создания изображения выше:

import operator
import os
import urllib2

from roundup.backends.indexer_common import STOPWORDS
import requests, collections, bs4
with open("./const11.txt") as file:
  Data1 = file.read().lower()
  Data = Data1.split()
two_words = [' '.join(ws) for ws in zip(Data, Data[1:])]
wordscount = {w:f for w, f in collections.Counter(two_words).most_common() if f > 5}
sorted_wordscount = sorted(wordscount.iteritems(), key=operator.itemgetter(1),reverse=True)

from pytagcloud import create_tag_image, create_html_data, make_tags, LAYOUT_HORIZONTAL, LAYOUTS, LAYOUT_MIX, LAYOUT_VERTICAL, LAYOUT_MOST_HORIZONTAL, LAYOUT_MOST_VERTICAL
from pytagcloud.colors import COLOR_SCHEMES
from pytagcloud.lang.counter import get_tag_counts

tags = make_tags(get_tag_counts(Data1)[:50],maxsize=260)
create_tag_image(tags,'filename.png', size=(1000,1000), background=(0, 0, 0, 255), layout=LAYOUT_MIX, fontname='Lobster', rectangular=True)`

Используя python 2.7.5, в Ubuntu 13.04 с pygame, установленным с помощью apt-get, а остальные пакеты с помощью pip. «const11.txt» — это текстовый файл, связанный с вопросом.

person vinaut    schedule 03.10.2013
comment
привет вайнот!!! большое спасибо за отличный ответ!!! Я пытался воспроизвести результаты, но у меня не получилось, и ваше облако выглядит в 1000 раз лучше, чем мое! Не могли бы вы опубликовать свой код, чтобы я мог видеть, что я сделал неправильно? еще раз большое спасибо!!!! - person mongotop; 05.10.2013
comment
Не беспокойтесь, отредактировал ответ с кодом, используемым для создания изображения. - person vinaut; 05.10.2013
comment
Большое спасибо vinaut! PS - В вашем ноутбуке есть магия! :) imgur.com/CmoOB7y это лучшее, что я мог получить, используя maxsize=50 для 25 слов, размер =(1300,1100). Я не знаю, почему это не делает слова в прямоугольнике, как у вас, даже если прямоугольный = True. - person mongotop; 06.10.2013
comment
Мне жаль, что это не работает для вас: это точный код, который я использовал. У вас может быть какой-то пакет, версия которого отличается от моей, и вы все испортите: в крайнем случае вы можете попробовать использовать виртуальную машину (или экземпляр ec2) с чистой установкой Ubuntu и установить все пакеты, как я сделал. - person vinaut; 06.10.2013
comment
Ты прав! Версии могут быть проблемой. Не могли бы вы опубликовать версию пакетов, которые вы используете для этого скрипта? Я буду очень признателен! Спасибо большое за вашу поддержку! - person mongotop; 07.10.2013
comment
Как я уже сказал, я установил все с нуля (python, pygame, все пакеты) на свежую виртуальную машину Ubuntu с помощью apt-get и pip. Сделайте то же самое, и вы должны получить тот же результат :) - person vinaut; 11.10.2013

EDIT: Хотя параметр TAG_PADDING, указанный ниже в моем ответе, может представлять интерес в некоторых случаях, ответ Винаута явно лучше для начала.


Глядя на https://github.com/atizo/PyTagCloud/blob/master/pytagcloud/__init__.py, похоже, что TAG_PADDING может быть параметром, управляющим интервалом между словами.

Поскольку для него задано буквальное значение в исходном коде и на него есть ссылки в нескольких местах, вам придется либо изменить исходный код на параметр, который вам больше подходит (и переупаковать/переустановить), либо скопировать исходный код в свой собственный проект и изменить его соответственно.

person Alanyst    schedule 02.10.2013