我有一句话,比如说
Hey I am feeling pretty boring today and the day is dull too
我通过openai情感代码传递给我一些神经元权重,它可以等于或略大于单词数。
神经元重量是
[ 0.01258736, 0.03544582, 0.08490616, 0.09010842, 0.07180552,
0.07271874, 0.08906463, 0.09690772, 0.10281454, 0.08131664,
0.08315734, 0.0790544 , 0.07770097, 0.07302617, 0.07329235,
0.06856266, 0.07642639, 0.08199468, 0.09079508, 0.09539193,
0.09061056, 0.07109602, 0.02138061, 0.02364372, 0.00322057,
0.01517018, 0.01150052, 0.00627739, 0.00445003, 0.00061127,
0.0228037 , -0.29226044, -0.40493113, -0.4069235 , -0.39796737,
-0.39871565, -0.39242673, -0.3537892 , -0.3779315 , -0.36448184,
-0.36063945, -0.3506464 , -0.36719123, -0.37997353, -0.35103855,
-0.34472692, -0.36256564, -0.35900915, -0.3619383 , -0.3532831 ,
-0.35352525, -0.33328298, -0.32929575, -0.33149993, -0.32934144,
-0.3261477 , -0.32421976, -0.3032671 , -0.47205922, -0.46902984,
-0.45346943, -0.4518705 , -0.50997925, -0.50997925]
现在我要做的是绘制热图,正值显示积极情绪,而负值显示负面情绪,我正在绘制热图,但热图不是应该如此绘图
但是当句子变得越来越长时,整个句子越来越小,无法看到,所以我应该做些什么改变才能让它显得更好。
这是我的绘图功能:
def plot_neuron_heatmap(text, values, savename=None, negate=False, cell_height=.112, cell_width=.92):
#n_limit = 832
cell_height=.325
cell_width=.15
n_limit = count
num_chars = len(text)
text = list(map(lambda x: x.replace('\n', '\\n'), text))
num_chars = len(text)
total_chars = math.ceil(num_chars/float(n_limit))*n_limit
mask = np.array([0]*num_chars + [1]*(total_chars-num_chars))
text = np.array(text+[' ']*(total_chars-num_chars))
values = np.array((values+[0])*(total_chars-num_chars))
values = values.reshape(-1, n_limit)
text = text.reshape(-1, n_limit)
mask = mask.reshape(-1, n_limit)
num_rows = len(values)
plt.figure(figsize=(cell_width*n_limit, cell_height*num_rows))
hmap=sns.heatmap(values, annot=text, mask=mask, fmt='', vmin=-5, vmax=5, cmap='RdYlGn',xticklabels=False, yticklabels=False, cbar=False)
plt.subplots_adjust()
#plt.tight_layout()
plt.savefig('fig1.png')
#plt.show()
这就是它将长文本显示为
的方式我希望它展示什么
以下是完整笔记本的链接:https://github.com/yashkumaratri/testrepo/blob/master/heatmap.ipynb
答案 0 :(得分:0)
您所看到的字体缩小是预料之中的。当您在水平方向上添加更多字符时,字体会缩小以适应所有内容。有几种解决方案。最简单的方法是将文本分成较小的块,并在显示所需的输出时显示它们。此外,您可以使用不同的DPI打印您的图形与屏幕上显示的内容,以便字母在图像文件中看起来很好。
你应该考虑在整个过程中清理你的功能:
count
似乎是一个从未使用过的全局。num_chars
和输入参数)。list(map(lambda x: x.replace('\n', '\\n'), text))
完全是过度杀伤:list(text.replace('\n', '\\n'))
做同样的事情。len(values) != len(text)
,行values = np.array((values+[0])*(total_chars-num_chars))
是无意义的,需要清理。下面的更新版本修复了次要问题并添加了n_limit
作为参数,该参数确定您希望在热图的一行中有多少个字符。正如我在上一篇文章中提到的,你已经拥有了所有必要的代码来正确地重塑你的数组,甚至可以掩盖你最终会得到的额外尾部。唯一错误的是形状中的-1
,由于形状的其余部分,它总是解析为一行。此外,图形始终保存在100dpi,因此无论您最终有多少行,结果都应该与给定宽度一致。 DPI会影响PNG,因为它会增加或减少图像中的像素总数,而PNG实际上并不了解DPI:
def plot_neuron_heatmap(text, values, n_limit=80, savename='fig1.png',
cell_height=0.325, cell_width=0.15, dpi=100):
text = text.replace('\n', '\\n')
text = np.array(list(text + ' ' * (-len(text) % n_limit)))
if len(values) > text.size:
values = np.array(values[:text.size])
else:
t = values
values = np.zeros(text.shape, dtype=np.int)
values[:len(t)] = t
text = text.reshape(-1, n_limit)
values = values.reshape(-1, n_limit)
# mask = np.zeros(values.shape, dtype=np.bool)
# mask.ravel()[values.size:] = True
plt.figure(figsize=(cell_width * n_limit, cell_height * len(text)))
hmap = sns.heatmap(values, annot=text, fmt='', vmin=-5, vmax=5, cmap='RdYlGn', xticklabels=False, yticklabels=False, cbar=False)
plt.subplots_adjust()
plt.savefig(savename if savename else 'fig1.png', dpi=dpi)
以下是该函数的几个示例运行:
text = 'Hey I am feeling pretty boring today and the day is dull too'
values = [...] # The stuff in your question
plot_neuron_heatmap(text, values)
plot_neuron_heatmap(text, values, 20)
plot_neuron_heatmap(text, values, 7)
得出以下三个数字: