web-dev-qa-db-ja.com

Wordcloud Python with generate_from_frequencies

Csvファイルからwordcloudを作成しようとしています。例として、csvファイルの構造は次のとおりです。

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

行数は多かれ少なかれ1800です。最初の列には文字列値(名前)があり、2番目の列にはそれぞれの頻度(int)があります。次に、ファイルが読み取られ、キーと値の行が辞書(d)に格納されます。これは、後でこれを使用してワードクラウドをプロットするためです。

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

辞書が値でいっぱいになったら、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()

しかし、エラーがスローされます:

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

そのため、関数の要件を満たしているのに、なぜこのエラーが発生するのかわかりません。誰かが私を助けてくれることを願っています、ありがとう。

私はworldcloud1.3.1を使用しています

5
cmc_carlos

これは、辞書の値が文字列であるのに対し、wordcloudは整数または浮動小数点数を想定しているためです。

コードを実行した後、辞書を調べますd次のようになります。

In [12]: d

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

数字の周りの' 'は、これらが実際には文字列であることを意味することに注意してください。

これを解決するためのハッキーな方法は、次のようにvループ内のintFORをキャストすることです。

d[k] = int(v)

これは整数で機能するのでハッキーだと思いますが、入力にfloatがあると、問題が発生する可能性があります。

また、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()
7
RandomTask