Wordcloud Python с generate_from_frequencies

Я пытаюсь создать облако слов из файла csv. Файл csv, например, имеет следующую структуру:

a,1
b,2
c,4
j,20

В нем больше строк, более или менее 1800. В первом столбце есть строковые значения (имена), а во втором столбце - их соответствующая частота (int). Затем файл считывается, и строка «ключ-значение» сохраняется в словаре (d), потому что позже мы будем использовать его для построения облака слов:

reader = csv.reader(open('namesDFtoCSV', 'r',newline='\n'))
d = {}
for k,v in reader:
d[k] = 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()

Но вылетает ошибка:

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

Наконец, в документации говорится:

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

Итак, я не понимаю, почему мне выдает эту ошибку, если я выполнил требования функции. Я надеюсь, что кто-то может мне помочь, спасибо.

Примечание

Я работаю с worldcloud 1.3.1


person cmc_carlos    schedule 27.03.2017    source источник


Ответы (2)


Это связано с тем, что значения в вашем словаре являются строками, а wordcloud ожидает целое число или число с плавающей запятой.

После того, как я запустил ваш код, а затем проверил ваш словарь d, я получил следующее.

In [12]: d

Out[12]: {'a': '1', 'b': '2', 'c': '4', 'j': '20'}

Обратите внимание, что ' ' вокруг чисел означает, что это действительно строки.

Хакерский способ решить эту проблему - привести v к int в вашем цикле FOR, например:

d[k] = int(v)

Я говорю, что это хакерство, так как оно будет работать с целыми числами, но если у вас есть числа с плавающей точкой во входных данных, это может вызвать проблемы.

Кроме того, ошибки Python могут быть трудночитаемыми. Ваша ошибка выше может быть интерпретирована как

script.py", line 19

TypeError: unsupported operand type(s) for /: 'str' and 'float

«Ошибка типа в строке 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()
person RandomTask    schedule 18.06.2017

person    schedule
comment
Лучше вкратце объяснить, как работает код. - person Agile_Eagle; 18.12.2020
comment
Пожалуйста, объясните, почему это решение. Что делает ваше решение, как оно решает проблему. (Это также должно иметь образовательный эффект для людей, которые находят этот вопрос, потому что у них похожая проблема.) - person Max Muster; 18.12.2020