2013-09-24 26 views
8

Trong một số previous question, tôi hỏi cộng đồng cách đếm tần suất của mỗi từ liên tiếp trong một câu và tôi nhận được câu trả lời tuyệt vời! bây giờ tôi đang cố gắng xây dựng một đám mây từ từ kết quả bằng cách sử dụng gói, pytagcloud.Làm thế nào để xây dựng một đám mây từ sạch bằng cách sử dụng pytagcloud mà không có hình ảnh đông đúc - Python

Vấn đề mà tôi có là hình ảnh được tạo ra là đông đúc và các từ được kết hợp với nhau. bất kỳ ý tưởng nào nếu có một hàm để phân tách các từ và làm cho chúng có thể đọc được hoặc nếu có cách nào khác để làm điều đó trong python.
Cảm ơn!

Mã của tôi dưới đây. đây là số link của văn bản tôi đã sử dụng để kiểm tra Tôi đã cố gắng sử dụng một số lượng nhỏ hơn của sự kết hợp từ nhưng điều đó không làm thay đổi độ đậm của văn bản trong hình.
Tôi cũng thêm vài chức năng như chơi với "bố cục" và "kích thước" và "fontname = 'Lobster' và fontzoom = 1" nhưng không có kết quả tối ưu nào là ảnh từ đám mây sạch sẽ. .

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) 

Đây là một ví dụ về kết quả đầu ra tôi nhận được: HERE
Kết quả tối ưu sẽ là một cái gì đó tương tự như một trong những hình ảnh HERE

Trả lời

9

Bạn đang sắp xếp các thẻ theo thứ tự tăng dần thay vì giảm dần, như có lẽ pytagcloud mong đợi. Bạn nên thay đổi dòng phân loại để:

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

Một khi điều đó là cố định, các thông số quan trọng là maxsize trong 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) 

Nếu tôi hiểu đúng điều này đặt ra kích thước phông chữ tối đa (của thẻ có tần suất cao nhất) và nó tính toán tất cả các kích thước khác có liên quan đến tần suất này. Tham số khác ảnh hưởng đến cách chuỗi được phân phối là kích thước của cửa sổ.

Bạn sẽ phải chơi với các thông số này.

Hãy xem xét rằng chức năng thư viện get_tag_counts làm nhiều hơn là chỉ trả về tần số: nó cũng lọc các từ phổ biến, áp dụng chữ thường và nói chung sẽ cung cấp cho bạn phân phối thẻ tốt hơn so với phân loại đơn giản đang làm.

Với những thay đổi này bạn sẽ nhận được một cái gì đó như thế này (thu được với get_tag_counts qua các tập tin bạn được liên kết trong bài viết của bạn, trong một cửa sổ 1000x1000, maxsize = 260 và đóng nắp cho 50 thẻ đầu tiên):

enter image description here

Edit - Theo yêu cầu, mã để tạo hình trên:

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

Sử dụng python 2.7.5, trên Ubuntu 13.04 với pygame cài đặt với apt-get, và phần còn lại của gói với pip. "const11.txt" là tệp văn bản được liên kết trong câu hỏi.

+0

Hi vinaut !!! cảm ơn bạn rất nhiều vì câu trả lời tuyệt vời của bạn !!! Tôi đã cố gắng sao chép kết quả nhưng tôi đã thất bại và đám mây của bạn trông đẹp hơn 1000 lần so với tôi! Bạn có thể xin vui lòng gửi mã của bạn để tôi có thể nhìn thấy những gì tôi đã làm sai? Một lần nữa, cảm ơn bạn rất nhiều!!!! – mongotop

+1

Đừng lo lắng, hãy chỉnh sửa câu trả lời bằng mã được sử dụng để tạo hình ảnh. – vinaut

+0

Cảm ơn bạn rất nhiều. PS - Bạn có một số phép thuật trong máy tính xách tay của bạn! :) http://imgur.com/CmoOB7y đây là những gì tốt nhất tôi có thể nhận được bằng cách sử dụng maxsize = 50 cho 25 từ, size = (1300,1100). Tôi không biết tại sao nó không làm cho các từ trong một hình chữ nhật như của bạn, ngay cả khi hình chữ nhật = True. – mongotop

3

EDIT: Trong khi các thông số TAG_PADDING tham chiếu dưới đây trong tôi câu trả lời có thể được quan tâm đối với một số trường hợp, câu trả lời của vinaut rõ ràng là tốt hơn để bắt đầu.


Nhìn vào https://github.com/atizo/PyTagCloud/blob/master/pytagcloud/__init__.py, nó trông giống như TAG_PADDING có thể là tham số điều chỉnh khoảng cách giữa các từ.

Vì nó được đặt thành giá trị bằng chữ trong mã nguồn và được tham chiếu ở nhiều nơi, bạn sẽ phải thay đổi mã nguồn thành tham số phù hợp với bạn hơn (và đóng gói lại/cài đặt lại) hoặc sao chép nguồn vào dự án của riêng bạn và thay đổi nó cho phù hợp.

Các vấn đề liên quan