遇到个很奇葩的课程老师,把wos上检索到的2000多篇文献集合下载后又处理成csv格式文件给我们做聚类分析,文件就像这样:
于是,一个本来可以直接丢给citespace完成的简单任务,变成了要我们手写LDA算法才能实现……于是在chatgpt的帮助下,本线性代数挂科的代码小白怒写了个python脚本将这个csv文件又转置回了wos文件……过程如下……
准备:观察wos格式
观察从wos上下载的正经wos格式的文件,发现规律如下:
那么我要做的就是
1、将每个字段名转换成对应的wos专有字段名,比如文章名称=》TI,摘要=》AB等等;
2、对表格进行一次行列转置;
3、将每个记录按照次序,一行一行地排列在上个字段的下方,就像图中一行一行地排列那样,并添加PT J和ER这两个起始符和终止符;
4、文件首位的FN,VR,EF加上,搞定。
下面一步步来看:
1、字段名转换
这个没什么难度,对着Web of Science核心收藏领域标签 把表头一个个换掉就行。结果就像这样:
2、表格行列转置
这个是excel自带的功能,全选表格数据=》打开一个新的表格=》右键=》选择性粘贴=》转置就行。不会的搜一下excel行列转换,网上一大堆教程。最终结果就像这样:
3、数据处理
这一步开始就需要公式脚本的介入了。那么作为一个代码小白+算法小白该怎么办呢?当然是扔给聪明的chatgpt处理啦(●ˇ∀ˇ●)
发现了什么问题还可以让它继续改进:
最终生成的python脚本如下:
import csv
def transpose_columns(input_file, output_file, field_name):
# 读取输入文件
with open(input_file, 'r') as file:
reader = csv.reader(file)
rows = list(reader)
# 获取列数
num_columns = len(rows[0])
# 转换列
transposed_rows = []
for col_index in range(1, num_columns):
column = [row[col_index] for row in rows]
transposed_rows.append(['PT J']) # 添加起始符
transposed_rows.extend([[row[0], column[i]] for i, row in enumerate(rows)])
transposed_rows.append(['ER']) # 添加终止符
transposed_rows.append([]) # 添加空行
# 写入输出文件
with open(output_file, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerows(transposed_rows)
# 示例用法
input_file = 'input.csv'
output_file = 'output.csv'
field_name = 'Field'
transpose_columns(input_file, output_file, field_name)
处理后的csv文件长这样:
看起来效果不错,不过在wos格式中,字段名和字段值之间是用空格( )隔开的,而不是结果中的逗号(,)。继续把问题丢给chatgpt,获得代码如下:
def replace_comma_with_space(input_file, output_file):
with open(input_file, 'r') as file:
lines = file.readlines()
modified_lines = []
for line in lines:
modified_line = line.replace(',', ' ', 1)
modified_lines.append(modified_line)
with open(output_file, 'w') as file:
file.writelines(modified_lines)
# 示例用法
input_file = 'input.txt' # 就是第一个脚本的输出文件output.csv
output_file = 'output.txt'
replace_comma_with_space(input_file, output_file)
这样,就能把结果里每行的第一个逗号换成空格了。最终获得结果如下:
最后手动把文件的起始符和终止符加上,文件名一改,大功告成~
现在就可以拿着它去citespace生成学术垃圾了!导入citespace的方法这篇写得很详细:CiteSpace导入WOS数据详细步骤