2013-09-24 19 views
8

previous question,我問社區如何計算一個句子中每個連續兩個單詞的頻率,我得到了一個很好的答案! 現在我試圖從使用軟件包pytagcloud的結果​​中創建一個文字雲。如何在沒有擁擠的圖像的情況下使用pytagcloud構建一個乾淨的詞雲 - Python

我確實有一個問題,那就是製作的圖片擁擠,而且文字一起吻合。任何想法,如果有一個函數來分隔單詞,並使他們可讀或如果有任何其他方式來做到這一點在Python中。
謝謝!

我的代碼是波紋管。這是我用於測試的文本的link 我試圖使用較少數量的文字組合,但這並沒有改變圖片中文字的人羣。
我也添加了一些像「佈局」和「大小」和「fontname ='龍蝦'和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) 

這是輸出結果我得到的一個例子:HERE
最佳的結果將是類似的圖像之一HERE

回答

9

您正在按照升序排列標籤而不是降序,正如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獲得,在1000×1000的窗口,MAXSIZE = 260和封蓋的第一50個標籤):

enter image description here

編輯 - 按照要求,創建上面的圖片驗證碼:

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」是問題中鏈接的文本文件。

+0

嗨vinaut !!!非常感謝你的偉大答案!我試圖複製結果,但是我失敗了,你的雲看起來比我的好1000倍!你可以請你發佈你的代碼,以便我可以看到我做錯了什麼?再次,非常感謝你! – mongotop

+1

不用擔心,用用於生成圖像的代碼編輯答案。 – vinaut

+0

非常感謝vinaut! PS - 你的筆記本電腦有一些魔力! :) http://imgur.com/CmoOB7y這是最好的,我可以使用maxsize = 50 25個單詞,size =(1300,1100)。我不知道爲什麼它不會像你的矩形一樣使用這些單詞,即使矩形=真。 – mongotop

3

編輯東西:雖然TAG_PADDING參數在下面引用我答案在某些情況下可能是有意義的,Vinaut的答案顯然是更好的開始。在https://github.com/atizo/PyTagCloud/blob/master/pytagcloud/__init__.py


看,它看起來像TAG_PADDING可能是控制字間距的參數。

由於它在源代碼中設置爲字面值,並且在多處引用,所以您必須將源代碼更改爲更適合您的參數(並重新打包/重新安裝),否則將源複製到你自己的項目並相應地改變它。

相關問題