2013-09-24 18 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可能是控制字间距的参数。

由于它在源代码中设置为字面值,并且在多处引用,所以您必须将源代码更改为更适合您的参数(并重新打包/重新安装),否则将源复制到你自己的项目并相应地改变它。

相关问题