6-15 可视化形式思考+子空间标签数据展示实现
可视化形式思考
一、论文集合层面:
① 不同的会议、年份形成不同的集合,平均被引用量(柱状图)
② 不同的会议、年份形成不同的集合,平均引用量(柱状图)
③ 不同的会议、年份形成不同的集合,摘要词云或关键词词云
二、单篇论文层面:
① 摘要在每个子空间上(0-4)的数量(柱状图)
② 论文引用了哪些论文(图的形式)
③ 论文被哪些论文所引用(图的形式)
子空间标签数据展示实现
数据预处理
思路:首先根据sentence_TextCNN.json构建一个list,list的元素类型是字典,每个元素对应一篇论文。字典格式:
其中,paper_id是论文的id,0-4对应五个子空间,分别是研究背景、研究问题、贡献、方法、实验。0-4对应的值表示该论文摘要中的句子在每个子空间上的个数。
具体实现:
我们的ACM数据集中论文(一共43433篇)的id不是从0开始的也不是连续的,不太方便索引。因此,想建立一个id_dic,表示id和索引的对应关系。
# 构建一个字典,id与list下标的对应关系
id_path = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/articles.log'
id_file = open(id_path,'r')
i = 0
id_dic = {}
for line in id_file.readlines():
id = line.split()[1]
id_dic[id] = i
i +=1
print(len(id_dic))
43433
接着,我们读取sentence_TextCNN.json中的数据,存入data中。
# 单篇论文摘要在每个子空间上的数量 柱状图展示
import json
path = 'D:/大学资料/大三下/项目实训/code+data/子空间标记数据+模型/sentence_TextCNN.json'
# 由于文件中有多行,直接读取会出现错误,因此一行一行读取
file = open(path, 'r')
data = []
for line in file.readlines():
data0 = json.loads(line)
data.append(data0)
print(len(data))
232125
然后,我们就来构建List。这里遇到了一个错误,就是在for循环中,我只对一个List元素进行了修改,但是结果却是整个列表元素都被修改了。百度之后,发现了问题是python列表字典赋值错误,改正方法是使用深拷贝。
参考博文:
python列表字典赋值错误
修改后的代码如下:
# 构建一个初始化的list,每一个元素对应一篇论文,每一个元素是一个字典,
init_dic = {'paper_id':0,'0':0,'1':0,'2':0,'3':0,'4':0}
init_data = []
for i in range(len(id_dic)):
init_data.append(init_dic)
#print(len(init_data))
print('0:',init_data[5])
from copy import deepcopy
a = 1
temp = {}
#将json数据进行统计
for paper in data:
paper_id = str(paper['paper_id'])
index = id_dic[paper_id]
#print('init_data的索引:',index)
#print(type(index))
# temp是data中对应一篇论文的字典,我们要根据json数据对字典进行跟新
temp = deepcopy(init_data[index])
#print('初始字典:',temp)
temp['paper_id'] = paper_id
# 摘要中一个句子对应的子空间标记
label = paper['textcnn_label']
#print(type(label))
# 对应的子空间个数+1
temp[label] +=1
#print('更新一次后的字典:',temp)
#print('init_data的索引:',index)
# 对init_data进行一次更新
init_data[index] = temp
print(init_data[0])
最后,我们将init_data保存为json文件,注意:paper_id对应为0的论文中没有对应的子空间数据。(子空间模型跑出来的结果里确实有很多论文摘要没有加子空间标记)。
# 将init_data保存为json文件
# paper_id对应为0的论文中没有对应的子空间数据
subSpace = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/subSpace.json'
# 写入 JSON 数据
fsub = open(subSpace, 'w')
for item in init_data:
json.dump(item, fsub)
fsub.write('\n')
fsub.close()
print('数据写入完毕')
json文件内容如下:
可视化实现及效果展示
利用pyecahrts库,定义了可视化函数,参数为两篇论文的id,输出为柱状图。
柱状图标题:子空间标签展示
柱状图的两个y轴标题:论文题目
一共五列:研究背景、研究问题、贡献、方法、实验
# 可视化展示部分
# 获取两篇论文的paper_id,进行子空间柱状图展示
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
def visSubspace(id1,id2):
# 获取标题数据
filepath0 = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/nodes.txt'
f0 = open(filepath0,'r')
title = []
for line in f0:
lines = line.strip('\n')
title.append(lines)
# 获取子空间数据
subSpace = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/subSpace.json'
f = open(subSpace, 'r')
all_data = []
for line in f.readlines():
data0 = json.loads(line)
all_data.append(data0)
# 注意:paper_id必须是str类型,然后获取对应数据
paper_id1=str(id1)
paper_id2=str(id2)
index1 = id_dic[paper_id1]
index2 = id_dic[paper_id2]
article1 = all_data[index1]
article2 = all_data[index2]
title1 = title[index1]
title2 = title[index2]
y_data1 = [article1['0'],article1['1'],article1['2'],article1['3'],article1['4']]
y_data2 = [article2['0'],article2['1'],article2['2'],article2['3'],article2['4']]
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS))
bar.add_xaxis(xaxis_data = ['研究背景','研究问题','贡献','方法','实验']).add_yaxis(series_name=title1,y_axis = y_data1)\
.add_yaxis(series_name=title2,y_axis = y_data2)
bar.set_global_opts(title_opts=opts.TitleOpts(title='子空间标签展示'))
return bar
测试一下:
# 获取论文id,这里假设是263和436,注意:paper_id必须是str类型
id1 = 263
id2 = 436
bar = visSubspace(id1,id2)
bar.render()
# 获取论文id,这里假设是706和735,注意:paper_id必须是str类型
id1 = 706
id2 = 735
bar = visSubspace(id1,id2)
bar.render()
可视化效果如下: