ValueError: ImageColorGenerator is smaller than the canvas
发布时间
阅读量:
阅读量
程序一开始运行没问题,都能成功生成。直到我分析文档用了个8w+字数的文档,max_words设为20+就报错,15能成功生成,期间换了词频背景也没用。
也试了网上说的更改width、height,甚至换过像素很大的背景,都不起作用。

最后解决方法是降低wordcloud版本,我wordcloud版本一开始默认下的最新版1.9.3,然后降到了1.8,就可以成功生成词云,不报错了,也不用设置width、height,默认就行。
pip install wordcloud==1.8

词云生成完整代码:
参考用python实现词频分析+词云
import re # 正则表达式库
import jieba # 结巴分词
import jieba.posseg # 词性获取
import collections # 词频统计库
import numpy # numpy数据处理库
from PIL import Image # 图像处理库
import wordcloud # 词云展示库
import matplotlib.pyplot as plt # 图像展示库(这里以plt代表库的全称)
# 主要功能自定义设置
Analysis_text = '分析文档.txt' # 分析文档
userdict = '用户词典.txt' # 用户词典
StopWords = '停用词库.txt' # 停用词库
number = 50 # 统计个数
Output = '词频.txt' # 输出文件
background = '词频背景.jpg' # 词频背景
# 读取文件
fn = open(Analysis_text,'r',encoding = 'UTF-8') # 打开文件
string_data = fn.read() # 读出整个文件
fn.close() # 关闭文件
# 文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式(空格等)
string_data = re.sub(pattern, '', string_data) # 将符合模式的字符去除
# 动态调整词典
jieba.suggest_freq('林小木', True) #True表示该词不能被分割,False表示该词能被分割
# 添加用户词典
jieba.load_userdict(userdict)
# 文本分词
seg_list_exact = jieba.cut(string_data, cut_all=False, HMM=True) # 精确模式分词+HMM
object_list = []
# 去除停用词(去掉一些意义不大的词,如标点符号、嗯、啊等)
with open(StopWords, 'r', encoding='UTF-8') as meaninglessFile:
stopwords = set(meaninglessFile.read().split('\n'))
stopwords.add(' ')
for word in seg_list_exact: # 循环读出每个分词
if word not in stopwords: # 如果不在去除词库中
object_list.append(word) # 分词追加到列表
# 词频统计
word_counts = collections.Counter(object_list) # 对分词做词频统计
word_counts_top = word_counts.most_common(number) # 获取前number个最高频的词
# 英文词性转中文词性字典:简洁版
En2Cn = {
'a' : '形容词',
'ad' : '形容词',
'ag' : '形容词',
'al' : '形容词',
'an' : '形容词',
'b' : '区别词',
'bl' : '区别词',
'c' : '连词',
'cc' : '连词',
'd' : '副词',
'e' : '叹词',
'eng' : '英文',
'f' : '方位词',
'g' : '语素',
'h' : '前缀',
'i' : '成语',
'j' : '简称略语',
'k' : '后缀',
'l' : '习用语',
'm' : '数词',
'mq' : '数量词',
'n' : '名词',
'ng' : '名词',
'nl' : '名词',
'nr' : '名词',
'nr1' : '名词',
'nr2' : '名词',
'nrf' : '名词',
'nrfg' : '名词',
'nrj' : '名词',
'ns' : '名词',
'nsf' : '名词',
'nt' : '名词',
'nz' : '名词',
'o' : '拟声词',
'p' : '介词',
'pba' : '介词',
'pbei' : '介词',
'q' : '量词',
'qt' : '量词',
'qv' : '量词',
'r' : '代词',
'rg' : '代词',
'rr' : '代词',
'rz' : '代词',
'rzs' : '代词',
'rzt' : '代词',
'rzv' : '代词',
'ry' : '代词',
'rys' : '代词',
'ryt' : '代词',
'ryv' : '代词',
's' : '处所词',
't' : '时间词',
'tg' : '时间词',
'u' : '助词',
'ude1' : '助词',
'ude2' : '助词',
'ude3' : '助词',
'udeng': '助词',
'udh' : '助词',
'uguo' : '助词',
'ule' : '助词',
'ulian': '助词',
'uls' : '助词',
'usuo' : '助词',
'uyy' : '助词',
'uzhe' : '助词',
'uzhi' : '助词',
'v' : '动词',
'vd' : '动词',
'vf' : '动词',
'vg' : '动词',
'vi' : '动词',
'vl' : '动词',
'vn' : '动词',
'vshi' : '动词',
'vx' : '动词',
'vyou' : '动词',
'w' : '标点符号',
'wb' : '标点符号',
'wd' : '标点符号',
'wf' : '标点符号',
'wj' : '标点符号',
'wh' : '标点符号',
'wkz' : '标点符号',
'wky' : '标点符号',
'wm' : '标点符号',
'wn' : '标点符号',
'wp' : '标点符号',
'ws' : '标点符号',
'wt' : '标点符号',
'ww' : '标点符号',
'wyz' : '标点符号',
'wyy' : '标点符号',
'x' : '字符串',
'xu' : '字符串',
'xx' : '字符串',
'y' : '语气词',
'z' : '状态词',
'un' : '未知词',
}
# 英文词性转中文词性字典:详细版
En2Cn_Pro = {
'a' : '形容词',
'ad' : '形容词-副形词',
'ag' : '形容词-形容词性语素',
'al' : '形容词-形容词性惯用语',
'an' : '形容词-名形词',
'b' : '区别词',
'bl' : '区别词-区别词性惯用语',
'c' : '连词',
'cc' : '连词-并列连词',
'd' : '副词',
'e' : '叹词',
'eng' : '英文',
'f' : '方位词',
'g' : '语素',
'h' : '前缀',
'i' : '成语',
'j' : '简称略语',
'k' : '后缀',
'l' : '习用语',
'm' : '数词',
'mq' : '数量词',
'n' : '名词',
'ng' : '名词-名词性语素',
'nl' : '名词-名词性惯用语',
'nr' : '名词-人名',
'nr1' : '名词-汉语姓氏',
'nr2' : '名词-汉语名字',
'nrf' : '名词-音译人名',
'nrfg' : '名词-人名',
'nrj' : '名词-日语人名',
'ns' : '名词-地名',
'nsf' : '名词-音译地名',
'nt' : '名词-机构团体名',
'nz' : '名词-其他专名',
'o' : '拟声词',
'p' : '介词',
'pba' : '介词-“把”',
'pbei' : '介词-“被”',
'q' : '量词',
'qt' : '量词-动量词',
'qv' : '量词-时量词',
'r' : '代词',
'rg' : '代词-代词性语素',
'rr' : '代词-人称代词',
'rz' : '代词-指示代词',
'rzs' : '代词-处所指示代词',
'rzt' : '代词-时间指示代词',
'rzv' : '代词-谓词性指示代词',
'ry' : '代词-疑问代词',
'rys' : '代词-处所疑问代词',
'ryt' : '代词-时间疑问代词',
'ryv' : '代词-谓词性疑问代词',
's' : '处所词',
't' : '时间词',
'tg' : '时间词-时间词性语素',
'u' : '助词',
'ude1' : '助词-“的”“底”',
'ude2' : '助词-“地”',
'ude3' : '助词-“得”',
'udeng': '助词-“等”“等等”“云云”',
'udh' : '助词-“的话”',
'uguo' : '助词-“过”',
'ule' : '助词-“了”“喽”',
'ulian': '助词-“连”',
'uls' : '助词-“来讲”“来说”“而言”“说来”',
'usuo' : '助词-“所”',
'uyy' : '助词-“一样”“一般”“似的”“般”',
'uzhe' : '助词-“着”',
'uzhi' : '助词-“之”',
'v' : '动词',
'vd' : '动词-副动词',
'vf' : '动词-趋向动词',
'vg' : '动词-动词性语素',
'vi' : '动词-不及物动词(内动词)',
'vl' : '动词-动词性惯用语',
'vn' : '动词-名动词',
'vshi' : '动词-“是”',
'vx' : '动词-形式动词',
'vyou' : '动词-“有”',
'w' : '标点符号',
'wb' : '标点符号-百分号千分号,全角:% ‰ 半角:%',
'wd' : '标点符号-逗号,全角:, 半角:,',
'wf' : '标点符号-分号,全角:; 半角: ; ',
'wj' : '标点符号-句号,全角:。',
'wh' : '标点符号-单位符号,全角:¥ $ £ ° ℃ 半角 $',
'wkz' : '标点符号-左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <',
'wky' : '标点符号-右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >',
'wm' : '标点符号-冒号,全角:: 半角: :',
'wn' : '标点符号-顿号,全角:、',
'wp' : '标点符号-破折号,全角:—— -- ——- 半角:—',
'ws' : '标点符号-省略号,全角:…… …',
'wt' : '标点符号-叹号,全角:! 半角:!',
'ww' : '标点符号-问号,全角:? 半角:?',
'wyz' : '标点符号-左引号,全角:“ ‘ 『',
'wyy' : '标点符号-右引号,全角:” ’ 』',
'x' : '字符串',
'xu' : '字符串-网址URL',
'xx' : '字符串-非语素字',
'y' : '语气词',
'z' : '状态词',
'un' : '未知词',
}
# 输出至工作台,并导出“词频.txt”文件
print ('\n词语\t词频\t词性')
print ('——————————')
fileOut = open(Output,'w',encoding='UTF-8') # 创建文本文件;若已存在,则进行覆盖
fileOut.write('词语\t词频\t词性\n')
fileOut.write('——————————\n')
count = 0
for TopWord,Frequency in word_counts_top: # 获取词语和词频
for POS in jieba.posseg.cut(TopWord): # 获取词性
if count == number:
break
st = list(En2Cn.values())[list(En2Cn.keys()).index(POS.flag)]
print(TopWord + '\t',str(Frequency) + '\t',list(En2Cn.values())[list(En2Cn.keys()).index(POS.flag)]) # 逐行输出数据
fileOut.write(TopWord + '\t' + str(Frequency) + '\t' + list(En2Cn.values())[list(En2Cn.keys()).index(POS.flag)] + '\n') # 逐行写入str格式数据
count += 1
fileOut.close()
# 词频展示
print ('\n开始制作词云……') # 提示当前状态
from PIL import Image
mask_image = Image.open(background)
mask_width, mask_height = mask_image.size
print(f"Mask size: {mask_width}x{mask_height}")
mask = numpy.array(Image.open(background)) # 定义词频背景
wc = wordcloud.WordCloud(
font_path = 'C:/Windows/Fonts/simfang.ttf', # 设置字体(这里选择“仿宋”)
background_color='white', # 背景颜色
mask = mask,
height=680,
width=680,
max_words = number, # 显示词数
max_font_size = 150 # 最大字号
)
# word_counts.pop('',None)
wc.generate_from_frequencies(word_counts) # 从字典生成词云
wc.recolor(color_func=wordcloud.ImageColorGenerator(mask)) # 将词云颜色设置为背景图方案
plt.figure('词云')
plt.subplots_adjust(top=0.99,bottom=0.01,right=0.99,left=0.01,hspace=0,wspace=0) # 调整边距
plt.imshow(wc, cmap=plt.cm.gray, interpolation='bilinear') # 处理词云
plt.axis('off') # 关闭坐标轴
print ('制作完成!')
plt.show()
# 避免程序运行完成后直接退出
input()
全部评论 (0)
还没有任何评论哟~
