2013-09-24 5 views
8

W previous question, zapytałem społeczność, jak liczyć częstotliwość każdego z kolejnych dwóch słów w zdaniu i dostałem świetną odpowiedź! teraz próbuję zbudować chmurę słowa z wyników przy użyciu pakietu, pytagcloud.Jak zbudować czystą chmurę słów za pomocą Pytagcloud bez zatłoczonego obrazu - Python

Problemem, który mam, jest to, że produkowane zdjęcia są zatłoczone, a słowa łączą się ze sobą. każdy pomysł, czy istnieje funkcja oddzielania słów i nadawania im czytelności, czy też istnieje inny sposób na zrobienie tego w pythonie.
Dzięki!

Mój kod jest poniżej. to jest link tekstu, którego użyłem do testu Próbowałem użyć mniejszej liczby kombinacji słów, ale to nie zmieniło tłumu tekstu na obrazie.
Dodałem też kilka funkcji takich jak "układ" i "rozmiar" oraz "fontname =" Lobster "i fontzoom = 1", ale żadna z nich nie daje optymalnych rezultatów, które są czystym obrazem chmury słowa, w którym słowa nie są zatłoczone .

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) 

To jest przykład wyników wyjściowych uzyskać: HERE
Optymalny rezultat będzie coś podobnego do jednego z obrazów HERE

Odpowiedz

9

Sortuje się tagi w porządku rosnącym zamiast malejącym, jak prawdopodobnie oczekuje użytkownik pytagcloud. Powinieneś zmienić linię sortowania do:

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

Raz, że jest stała, kluczowym parametrem jest maxsize w 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) 

Jeśli dobrze rozumiem ten określa maksymalny rozmiar czcionki (czyli od tag o najwyższej częstotliwości) i oblicza wszystkie inne rozmiary w stosunku do tego. Drugim parametrem wpływającym na sposób dystrybucji łańcuchów jest rozmiar okna.

Będziesz musiał grać z tymi parametrami.

Weź pod uwagę, że funkcja biblioteki get_tag_counts robi więcej niż tylko powrót częstotliwość: to również filtruje wspólne słowa, stosuje się małymi literami, w ogóle powinien dać lepsze rozmieszczenie znaczników niż prostego sortowania, jak ty robić.

Z tych zmian powinien dostać coś takiego (otrzymany z get_tag_counts ponad pliku, połączonego w swoim poście, w oknie 1000x1000, maxSize = 260 i zatykania pierwszych 50 znaczników):

enter image description here

Edit - Zgodnie z wnioskiem, kod do tworzenia obrazu powyżej:

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

Używanie Pythona 2.7.5 na Ubuntu 13.04 z zainstalowanym z pygame apt-get, a reszta paczek z pip. "const11.txt" to plik tekstowy połączony z pytaniem.

+0

Witam vinaut !!! dziękuję bardzo za wspaniałą odpowiedź !!! Próbowałem zreplikować wyniki, ale nie udało mi się, a twoja chmura wygląda 1000 razy lepiej niż moja! Czy możesz opublikować swój kod, aby zobaczyć, co zrobiłem źle? jeszcze raz bardzo dziękuję!!!! – mongotop

+1

Bez zmartwień, zredagował odpowiedź kodem używanym do generowania obrazu. – vinaut

+0

Dziękuję bardzo vinaut! PS - Masz trochę magii w swoim laptopie! :) http://imgur.com/CmoOB7y to jest najlepsze, co mogłem uzyskać używając maxsize = 50 dla 25 słów, size = (1300,1100). Nie wiem, dlaczego nie tworzy słów w prostokącie takim jak twój, nawet jeśli prostokątny = Prawdziwy. – mongotop

3

EDIT: Gdy parametr TAG_PADDING odwołuje poniżej w moim w niektórych przypadkach odpowiedź może być interesująca, odpowiedź vinauta jest zdecydowanie lepsza.


Patrząc na https://github.com/atizo/PyTagCloud/blob/master/pytagcloud/__init__.py, wygląda TAG_PADDING może być parametrem, który kontroluje odstępy między wyrazami.

Ponieważ jest ustawiona na wartość dosłowną w kodzie źródłowym i odnosi się do niej w kilku miejscach, będziesz musiał zmienić kod źródłowy na parametr, który lepiej Ci odpowiada (i przepakować/ponownie zainstalować) lub skopiować źródło do własny projekt i odpowiednio go zmienić.

Powiązane problemy