带有generate_from_frequencies的Wordcloud Python

cmc*_*los 2 python csv python-3.x word-cloud

我正在尝试从csv文件创建wordcloud.以csv文件为例,它具有以下结构:

a,1
b,2
c,4
j,20
Run Code Online (Sandbox Code Playgroud)

它有更多的行,或多或少1800.第一列有字符串值(名称),第二列有各自的频率(int).然后,读取文件并将键值行存储在字典中(d),因为稍后我们将使用它来绘制wordcloud:

reader = csv.reader(open('namesDFtoCSV', 'r',newline='\n'))
d = {}
for k,v in reader:
d[k] = v
Run Code Online (Sandbox Code Playgroud)

一旦我们有了充满价值的字典,我会尝试绘制wordcloud:

#Generating wordcloud. Relative scaling value is to adjust the importance of a frequency word.
#See documentation: https://github.com/amueller/word_cloud/blob/master/wordcloud/wordcloud.py
wordcloud = WordCloud(width=900,height=500, max_words=1628,relative_scaling=1,normalize_plurals=False).generate_from_frequencies(d)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
Run Code Online (Sandbox Code Playgroud)

但是抛出了一个错误:

Traceback (most recent call last):
File ".........../script.py", line 19, in <module>
wordcloud = WordCloud(width=900,height=500, max_words=1628,relative_scaling=1,normalize_plurals=False).generate_from_frequencies(d)
File "/usr/local/lib/python3.5/dist-packages/wordcloud/wordcloud.py", line  360, in generate_from_frequencies
for word, freq in frequencies]
File "/usr/local/lib/python3.5/dist-packages/wordcloud/wordcloud.py", line 360, in <listcomp>
for word, freq in frequencies]
TypeError: unsupported operand type(s) for /: 'str' and 'float
Run Code Online (Sandbox Code Playgroud)

最后,文档说:

def generate_from_frequencies(self, frequencies, max_font_size=None):
    """Create a word_cloud from words and frequencies.
    Parameters
    ----------
    frequencies : dict from string to float
        A contains words and associated frequency.
    max_font_size : int
        Use this font-size instead of self.max_font_size
    Returns
    -------
    self
Run Code Online (Sandbox Code Playgroud)

所以,如果我满足功能的要求,我不明白为什么要把这个错误告诉我.我希望有人可以帮助我,谢谢.

注意

我使用worldcloud 1.3.1

Ran*_*ask 5

这是因为字典中的值是字符串,但wordcloud需要整数或浮点数.

运行代码后,检查字典,d我得到以下内容.

In [12]: d

Out[12]: {'a': '1', 'b': '2', 'c': '4', 'j': '20'}
Run Code Online (Sandbox Code Playgroud)

注意' '数字周围意味着这些实际上是字符串.

要解决这方面的一个哈克的方式是投vint你的FOR循环,如:

d[k] = int(v)
Run Code Online (Sandbox Code Playgroud)

我说这是hacky,因为它可以处理整数,但是如果你的输入中有浮点数,那么它可能会导致问题.

此外,Python错误可能难以阅读.您上面的错误可以解释为

script.py", line 19

TypeError: unsupported operand type(s) for /: 'str' and 'float
Run Code Online (Sandbox Code Playgroud)

"我的文件的第19行或之前有一个类型错误.让我看看我的数据类型,看看字符串和浮点数之间是否存在任何不匹配..."

以下代码适用于我:

import csv
from wordcloud import WordCloud
import matplotlib.pyplot as plt

reader = csv.reader(open('namesDFtoCSV', 'r',newline='\n'))
d = {}
for k,v in reader:
    d[k] = int(v)

#Generating wordcloud. Relative scaling value is to adjust the importance of a frequency word.
#See documentation: https://github.com/amueller/word_cloud/blob/master/wordcloud/wordcloud.py
wordcloud = WordCloud(width=900,height=500, max_words=1628,relative_scaling=1,normalize_plurals=False).generate_from_frequencies(d)

plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
Run Code Online (Sandbox Code Playgroud)