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を使用しています
これは、辞書の値が文字列であるのに対し、wordcloudは整数または浮動小数点数を想定しているためです。
コードを実行した後、辞書を調べますd
次のようになります。
In [12]: d
Out[12]: {'a': '1', 'b': '2', 'c': '4', 'j': '20'}
数字の周りの' '
は、これらが実際には文字列であることを意味することに注意してください。
これを解決するためのハッキーな方法は、次のようにv
ループ内のint
にFOR
をキャストすることです。
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()