Python实践之合并WOS文献数据,并对关键词进行词频分析

  Python实践之合并WOS文献数据,并对关键词进行词频分析

  想要对所在学科(Public Administration)近十年都在做什么有一个基本的认识,其中一个最直观的办法是看主要期刊都在发什么领域的文章。任务拆解为三步:1)下载文献;2)整理文献数据,以一篇期刊文章为一个观测点,以关键词为主要变量,构建以供词频分析的原始数据集;3)对关键词进行词频分析。(注1:这三步应该可以用一篇代码打通解决,但出于学习的目的,我将任务分解了,每个任务对应一部分代码。注2: 我做这项工作的目的并非是用于文献分析,而是让自己对所在学科有一个直观感觉,做决策参考用。如果要做专门的文献分析以及生成可视化结果,CiteSpace等专业软件可以帮上忙。)

  下载文献

  通过WOS,我们首先在2021年3月4日下载了所在学科近十年主要期刊上的7500条左右文献数据。这一步骤记录如下。

  WOS 高级搜索—>时间选择2010-2021,语言选择English,类型选择article—>搜索框内输入:

  SO=(Public Administration Review) OR

  SO=(Journal of Public Administration Research and Theory) OR

  SO=(Public Management Review) OR

  SO=(International Journal of Public Administration) OR

  SO=(International Public Management Journal) OR

  SO=(Public Administration) OR

  SO=(Governance-An International Journal of Policy Administration and Institution) OR

  SO=(International Review of Administrative Science) OR

  SO=(Journal of Human Resources) OR

  SO=(Administrative Science Quarterly) OR

  SO=(American Review of Public Administration) OR

  SO=(Review of Public Personnel Administration) OR

  SO=(Local Government Studies) OR

  SO=(Social Policy & Administration) OR

  SO=(Public Policy and Administration) OR

  SO=(Nonprofit Management & Leadership) OR

  SO=(Administration & Society)

  构建原始数据集

  这一步的任务是合并统一制式的15个excel表。主要原因是,WOS每次只能保存500条文献,因此我们得到了15个excel表格。要想构建包含7500条数据的原始数据集,就需要合并15个表格。代码如下:

  import os

  import pandas as pd

  #将文件读取出来放一个列表里

  pwd = "./0304"

  #新建列表存放每个文件数据(依次读取多个相同结构的excel文件并创建dataframe

  dfs=[]

  for root, dirs, files in os.walk(pwd):

  for file in files:

  file_path = os.path.join(root, file)

  #print(file_path) #因为报错了“xlrd.biffh.XLRDError: Unsupported format, or corrupt file”,所以这一步print看看,结果发现有一个.DS_Store的隐藏文件,所以xlrd读不出来会报错,于是在下一步加一个判断

  if "xls" in file_path: #加一个判断解决xlrd报错的问题

  df = pd.read_excel(file_path)

  dfs.append(df)

  df = pd.concat(dfs)

  df.to_excel("./0304/raw_data.xls", index=False)

  关键词词频分析

  观察WOS生成的文献数据发现,有的期刊并不会要求作者提供关键词,因此存在缺失值的问题。但同时,发现在“author_keywords"这个变量旁边还有一个“keywords_plus”变量。这个变量是基于每一篇文献所引用文献的标题生成的关键词。因此任务分为两步:1)对缺少“author_kewords”观测值的文献,将其“keywords_plus”下的观测值补过来。2)对“author_kewords”进行词频分析。基于步骤二,准备好一个仅有“author_keywords"和“keywords_plus”的excel表

  发现以下一些坑:

  1)如果“author_keywords"值为空,则将“keywords_plus”的值补给“author_keywords";

  2)大小写 大连做人流哪家好 http://mobile.dlrlyy.com/

  3)关键词之间是用semicolon 和space隔开的。

  import xlrd

  from collections import Counter

  from operator import itemgetter

  # step 0. 读excel文件

  file_path = "./Book1.xlsx"

  table = xlrd.open_workbook(file_path).sheets()[0] # 读取表

  nrow, ncol = table.nrows, table.ncols # 记录行数和列数,第一行是表头

  results = Counter()

  # 对每行处理

  for index in range(1, nrow): #第0行是表头

  # step 1. 获取value

  value = table.cell_value(index, 0) #index是行的参数(第12行),0是指表格的第一列

  if value == "":

  value = table.cell_value(index, 1) # 如果为空,则取“keywords_plus”这一列的值

  # step 2. 分割并统计

  keywords = []

  for word in value.split(";"):

  if word.strip() != "":

  keywords.append(word.strip().lower())

  # keywords = [word.strip().lower() for word in value.split(";") if word.strip() != ""] #这一行可以代替第19-22行,是一样的效果,这一行代码更简洁且更高级

  results.update(keywords)

  # step 3. 对结果排序

  ordered_results = sorted([(key, value) for key, value in results.items()], key=itemgetter(1), reverse=True) #(key 和reverse是sorted函数的参数,如果key=itemgetter(0), 那么就是按照关键词的首字母进行排序)

  # step 4. 输出结果

  save_file_path = "./frequency.txt"

  with open(save_file_path, "w") as f:

  for key, value in ordered_results:

  f.write(f"{key} : {value}\n")

  最终呈现结果

请使用浏览器的分享功能分享到微信等