8

上一个问题中,我向社区询问了如何计算一个句子中每个连续两个单词的频率,我得到了很好的答案!现在我正在尝试使用包pytagcloud从结果中构建一个词云。

我确实遇到的问题是,制作的图片很拥挤,而且文字都在接吻。任何想法是否有分隔单词并使它们可读的功能,或者是否有任何替代方法可以在 python 中做到这一点。
谢谢!

我的代码如下。这是我用于测试的文本链接我尝试使用较少数量的单词组合,但这并没有改变图片中文本的拥挤度。
我还添加了一些功能,例如玩“布局”和“大小”和“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)

这是我得到的输出结果的一个例子:这里
最佳结果将类似于这里的图像之一

4

2 回答 2

10

正如 pytagcloud 所期望的那样,您正在按升序而不是降序对标签进行排序。您应该将排序行更改为:

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

一旦修复,关键参数是make_tags 中的maxsize

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 个标签):

在此处输入图像描述

编辑 - 根据要求,创建上面图像的代码:

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 上使用 apt-get 安装 pygame,其余软件包使用 pip。“const11.txt”是问题中链接的文本文件。

于 2013-10-03T00:17:03.167 回答
3

编辑:虽然在TAG_PADDING某些情况下我的答案中引用的参数可能会引起人们的兴趣,但 vinaut 的答案显然是更好的开始。


查看https://github.com/atizo/PyTagCloud/blob/master/pytagcloud/__init__.py,它看起来TAG_PADDING可能是控制单词间距的参数。

因为它在源代码中设置为文字值并且在多个地方被引用,所以您必须将源代码更改为更适合您的参数(并重新打包/重新安装),或者将源代码复制到您自己的项目中并相应地改变它。

于 2013-10-02T20:46:17.270 回答