本来想在citespace中进行各个国家的发文量进行统计,本来天真的以为citespace中可以直接统计,以为可以通过这个按钮进行实现👇
然后点击运行,直接得出各个国家的发文量(最开始我以为这个按钮是这个作用) ,得到下图。
我一看,很好,直接得到了各个国家的总发文量(上图中的PEOPLES R CHINA的修改看我另外一个文章),直接美滋滋的用这个数据做图,我做了个国家发文量前十的图,好家伙,前十国家的发文量有6000余篇,我数据总量才5700余篇,然后我就发现了不对劲。去研究了一下,发现这个得到的是一个文章中有几个作者的国籍关系(我的理解是,一个文章有多个作者的国籍不一样时,会将一个文章定义为多个国家发表的,就可能出现前十国家的发表数量多出我总的数据的情况)。
然后我就去看原始数据,即citespace已经预处理过的txt文件。以下图为例,有三个作者,两个作者为巴西,一个作者为美国,巴西和美国两个国家,则巴西发表数量加一,美国发表数量加一(个人理解,如果有不对就请指正,但是我肯定的是直接通过citespae中的county国家按钮不能得到各个国家的发表数量)
然后我就以第一作者的国籍对文章的归属国进行划分,以上图为例,第一作者的国籍是巴西,那我就把这篇文章归为巴西发表的,与第三作者的美国无关。
编写代码
#读取各个国家的发文量
import re
from collections import Counter
import pandas as pd
def extract_first_author_country(file_paths):
country_counts = Counter()
for file_path in file_paths:
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
c1_matches = re.findall(r"C1\s+([^\n]+)", content)
a=0
d=0
b=len(c1_matches)
for a in range(b):
first_author_address = c1_matches[a]
first_author_address = first_author_address[::-1]
match = re.match(r"^[^\s]+", first_author_address)
reversed_match=match.group(0)[::-1]
country_counts.update([reversed_match.strip()])
print(country_counts)
file_paths = [
'D:/temp22/11/data/download2022u646.txt',
'D:/temp22/11/data/download2023u546.txt',
]
extract_first_author_country(file_paths)
得到的结果为两个,因为我们输入文件也是两个,同理,输入的越多,输出的越多(但是只用看最后一个的数据就行,这个结果的第一个数据就是2022年的数据,第二个数据就是2022+2023年的数据)
把全部数据导入之后进行输出,得到的数据的最后一个就是各个国家的发文量 (想得到逐年的发文量也很简单,后一个数据减去上一个数据就是当年的发文量)
注意,此方法并不是100%准确,因为我在看1998年之前的txt时,并没有C1(作者)这一关键词,所以在1998年前的文章我都是人工筛选的。其次,从上述结果中也会有一些乱码,比如'10.5067/MODIS/MOD13C1.006': 2,'WOS:001005025900001': 1。然后我去看了看,好像没啥影响,这几个乱码删除就行。