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


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

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

Мой код ниже. это Ссылка текста, который я использовал для теста Я попытался использовать меньшее количество словосочетаний, но это не изменило объем текста на картинке.
Я также добавил несколько функций, таких как игра с "layout" и "size" и " 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)

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

2 8

2 ответа:

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

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

Как только это будет исправлено, ключевой параметр параметр в 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 тегов):

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

Edit-по запросу, код для создания изображения выше:

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 " - это текстовый файл, связанный в вопросе.

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


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

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