Python词云:按单词频率着色

4

我是一名新手,正在使用wordcloud包学习Python。

我已经通过一个字典frequencies,其中键为单词,值为单词出现的频率,生成了一个词云。

词云可以在color_func参数中接收一个函数。这个函数可以用来创建自己的单词云颜色映射。例如,我使用了my_tf_color_func函数。

wordcloud = WordCloud(background_color="white", max_words=1000, mask=motog3_coloring,
max_font_size=1000, random_state=1,  relative_scaling=.6, regexp="\w[\%\-\(\)\w']+",
collocations=False, color_func=my_tf_color_func)

my_tf_color_func函数中,我想根据单词在属性frequencies中的频率对每个单词进行着色。根据这个问题的报告(传送门),我知道可以在my_tf_color_func中进行以下操作:
def my_tf_color_func(word, font_size, position, orientation, random_state=None, **kwargs):
         return "hsl(%d, 80%%, 50%%)" % (360 * frequencies[word])

但是字典 frequencies 必须被传递,我该怎么做?我必须在哪里和如何传递字典 frequencies 才能在 my_tf_color_func 中使用它。

我尝试了一些方法但是没有成功。

谢谢


因为您无法控制函数的调用位置,所以我认为您不能这样做。但只要frequencies在作用域内,没有任何阻止您使用它所定义的方式。您的函数不再是纯函数,这值得认识和考虑,但它应该可以正常工作。您可能会对functor的概念感兴趣,它们本质上是带有状态的函数,由具有__call__属性的类实现。 - ryachza
嗨@ryachza,我的项目中有一个main和一些函数,包括一个用于生成词云的函数,其中词云调用在其中。 frequencies不是全局属性,而是在词云生成器函数内的属性。因此,我必须将它传递给my_tf_color_func以便能够在其中使用它。 - Nielsen Rechia
我添加了一个答案,其中包含将字典和函数显式绑定的几个选项,但是Python在其作用域方面非常自由(这实际上是我不喜欢的东西),因此应该有多种方法可以使“frequencies”处于范围内。但是,如果没有看到更多的代码,我无法做出建议。 - ryachza
谢谢,我明白在另一个函数中创建函数的选项,并且我这样做了,它可以工作。我也不喜欢这样做,但这是我想要做的唯一方法。谢谢。 - Nielsen Rechia
你为什么想要传递字典频率?这些信息主要包含在font_size中(至少大部分是这样)。 - Andreas Mueller
1个回答

5
您可以使用类似以下方式显式地将其关闭:
def my_tf_color_func(dictionary):
  def my_tf_color_func_inner(word, font_size, position, orientation, random_state=None, **kwargs):
    return "hsl(%d, 80%%, 50%%)" % (360 * dictionary[word])
  return my_tf_color_func_inner

wordcloud = WordCloud(...,color_func=my_tf_color_func(frequencies))

一种替代显式有状态函数对象的方法是类似于以下内容的东西:
class MyColorFunctor():
  def __init__(self,frequencies):
    self.frequencies = frequencies

  def __call__(self,word,font_size,position,orientation,random_state=None,**kwargs):
    return "hsl(%d, 80%%, 50%%)" % (360 * self.frequencies[word])

wordcloud = WordCloud(...,color_func=MyColorFunctor(frequencies))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接